pwm-respiration.ino
El LED respira con una curva gamma 2,2 adaptada a la percepción del ojo. En Teensy, analogWriteFrequency() permite elegir la frecuencia PWM (aquí 3 kHz) para evitar el silbido audible de los drivers de LED.
Hardware
Un Teensy 4.0 (NXP i.MX RT1062, Cortex-M7 @ 600 MHz, lógica de 3,3 V) alimentado por USB. 1 LED + resistencia de 330 Ω (calculada para 3,3 V).
Cableado
Ánodo del LED al pin 5 mediante 330 Ω, cátodo a GND. La mayoría de pines Teensy son PWM.
Funcionamiento
analogWriteFrequency() reconfigura el temporizador hardware; analogWrite() aplica el ciclo de trabajo 0-255. El valor pasa por una potencia 2,2 para una subida natural.
Ejecución
Con Teensyduino en el Arduino IDE, elige « Teensy 4.0 », Subir y confirma en el Teensy Loader. Los pines son de 3,3 V; el 4.0 es compatible en pines con el 3.2.
Variantes
Controla el brillo con touchRead() o un sensor de luz, o amplía a varios LED respirando desfasados.
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));
}