pwm-respiration.ino
Un LED PWM respira suavemente hacia un brillo objetivo que se cambia a distancia con Particle.function. El suavizado exponencial evita saltos bruscos y el latido sinusoidal da un aspecto vivo.
Hardware
Un módulo Particle Boron (nRF52840, Wi-Fi + Bluetooth LE, variante celular si procede) con antena integrada. 1 LED + resistencia de 330 Ω (los pines del módulo son de 3,3 V).
Cableado
Ánodo del LED a D0 mediante 330 Ω, cátodo a GND. D0 es una salida PWM en el módulo.
Funcionamiento
analogWrite aplica el ciclo de trabajo; el bucle filtra la consigna (suavizado del 5 % por paso de 10 ms) y modula la amplitud con un seno. regler() actualiza el objetivo desde la nube.
Ejecución
Instala el CLI de Particle (particle setup), graba con particle flash --serial u OTA (particle flash <nombre> firmware.bin). La app Device Cloud o la API REST completan el despliegue.
Variantes
Encadenar varios canales para iluminación de ambiente, o regular en lazo cerrado con un sensor de luz (LDR en A0).
pwm-respiration.ino
// Respiration LED sur D0 (broche PWM) + reglage via Particle.function.
const int LED = D0; // sortie PWM (timer) sur le module
int niveauCible = 128; // 0..255, reglable a distance
float niveau = 0;
unsigned long derniereEtape = 0;
int regler(String args) {
int v = args.toInt();
if (v >= 0 && v <= 255) { niveauCible = v; return v; }
return -1;
}
void setup() {
pinMode(LED, OUTPUT);
Particle.function("luminosite", regler);
Serial.begin(9600);
}
void loop() {
if (millis() - derniereEtape < 10) return;
derniereEtape = millis();
// Rampe vers la consigne + leger battement sinusoidal.
static float phase = 0;
phase += 0.06;
float battement = 0.25 * sin(phase);
niveau += (niveauCible * (0.75 + battement) - niveau) * 0.05;
analogWrite(LED, constrain((int)niveau, 0, 255));
}
// Regler depuis le cloud : Particle.function "luminosite" avec "200".