pwm-respiration.ino
Une LED PWM respire doucement vers une luminosité cible que l'on change à distance par Particle.function. Le lissage exponentiel évite les sauts brutaux, et le battement sinusoïdal donne un rendu vivant.
Matériel requis
Un module Particle Photon (Wi-Fi 2,4 GHz, microcontrôleur STM32, blindage métallique) alimenté par USB ou VIN. 1 LED + résistance 330 Ω (les broches du module sont en 3,3 V).
Câblage
Anode de la LED sur D0 via 330 Ω, cathode sur GND. D0 est une sortie PWM sur le module.
Fonctionnement
analogWrite applique le rapport cyclique ; la boucle filtre la consigne (lissage 5 % par pas de 10 ms) et module l'amplitude avec un sinus. regler() met à jour la cible depuis le cloud.
Exécution
Avec le CLI Particle : particle flash --serial (mode DFU, double reset) ou flash OTA une fois la carte en ligne. Le mode Safe Mode (reset + WiFi) sert au dépannage.
Variantes
Enchaîner plusieurs canaux pour un éclairage d'ambiance, ou asservir sur un capteur de luminosité (LDR sur 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".