pwm-respiration.ino
La LED respire avec une courbe de gamma 2,2 adaptée à la perception de l'œil. Sur Teensy, analogWriteFrequency() permet de choisir la fréquence PWM (ici 3 kHz) pour éviter tout sifflement audible des pilotes de LED.
Matériel requis
Un Teensy 4.1 (NXP i.MX RT1062, Cortex-M7 @ 600 MHz, logique 3,3 V, Ethernet et stockage flash additionnel) alimenté par USB. 1 LED + résistance 330 Ω (calculée pour 3,3 V).
Câblage
Anode de la LED sur la broche 5 via 330 Ω, cathode vers GND. La plupart des broches Teensy sont PWM.
Fonctionnement
analogWriteFrequency() reconfigure le timer matériel ; analogWrite() applique le rapport cyclique 0-255. La valeur est passée par une puissance 2,2 pour une montée naturelle.
Exécution
Teensyduino dans l'Arduino IDE, carte « Teensy 4.1 », Téléverser puis bouton du Teensy Loader. Broches 3,3 V ; le 4.1 ajoute Ethernet, USB host et broches supplémentaires.
Variantes
Piloter la luminosité avec touchRead() ou un capteur de luminosité, ou étendre à plusieurs LED en respiration déphasée.
pwm-respiration.ino
// Respiration LED : analogWrite() + analogWriteFrequency() (Teensy).
const int LED = 5; // broche PWM (la plupart des broches Teensy le sont)
float niveau = 0.0;
float pas = 0.02;
unsigned long derniereEtape = 0;
const unsigned long PERIODE = 10; // ms entre deux paliers
void setup() {
pinMode(LED, OUTPUT);
analogWriteFrequency(LED, 3000); // 3 kHz : au-dessus du sifflement
analogWriteResolution(8); // consignes 0..255
Serial.begin(9600);
}
void loop() {
if (millis() - derniereEtape < PERIODE) return;
derniereEtape = millis();
niveau += pas;
if (niveau >= 1.0) { niveau = 1.0; pas = -pas; }
if (niveau <= 0.0) { niveau = 0.0; pas = -pas; }
// Gamma 2.2 : la perception visuelle est non lineaire.
float gamma = pow(niveau, 2.2);
analogWrite(LED, (int)(gamma * 255));
Serial.println((int)(gamma * 255));
}