const byte brochesLed[] = {5, 6, 9};
const byte nbLeds = sizeof brochesLed / sizeof * brochesLed;
const unsigned long dureeAllumage = 5000; // 5 secondes
const unsigned long dureeAllumee = 0000; // 0 secondes
const unsigned long dureeExtinction = 5000; // 5 secondes
const unsigned long dureeEteinte = 5000; // 5 secondes
unsigned long chrono;
enum {SELECTION, ALLUMAGE, ALLUMEE, EXTINCTION, ETEINTE} etape = SELECTION;
void animation() {
static byte brocheEnCours;
static byte pwmEnCours;
switch (etape) {
case SELECTION:
brocheEnCours = brochesLed[random(0, nbLeds)];
pwmEnCours = 0;
chrono = millis();
etape = ALLUMAGE;
Serial.print("Broche active : ");
Serial.print(brocheEnCours);
Serial.println(", début allumage progressif");
break;
case ALLUMAGE:
if (millis() - chrono >= dureeAllumage) {
// on a fini, on passe à la phase allumée
digitalWrite(brocheEnCours, HIGH); // pour s'assurer qu'elle est à fond
chrono = millis();
etape = ALLUMEE;
Serial.println("Fin allumage");
} else {
// on est toujours en cours d'allumage, on calcule le PWM
pwmEnCours = map(millis() - chrono, 0, dureeAllumage, 0, 255); // pour une durée entre 0 et dureeAllumage le PWM va aller de 0 à 255
analogWrite(brocheEnCours, pwmEnCours);
}
break;
case ALLUMEE:
if (millis() - chrono >= dureeAllumee) {
// on a fini la phase où la LED est allumée, on commence l'extinction
chrono = millis();
etape = EXTINCTION;
Serial.println("Fin allumée, début extinction progressive");
}
break;
case EXTINCTION:
if (millis() - chrono >= dureeExtinction) {
// on a fini, on passe à la phase éteinte
digitalWrite(brocheEnCours, LOW); // pour s'assurer qu'elle est bien éteinte
chrono = millis();
etape = ETEINTE;
Serial.println("Fin extinction");
} else {
// on est toujours en cours d'extinction, on calcule le PWM
pwmEnCours = map(millis() - chrono, 0, dureeExtinction, 255, 0); // pour une durée entre 0 et dureeExtinction le PWM va aller de 255 à 0
analogWrite(brocheEnCours, pwmEnCours);
}
break;
case ETEINTE:
if (millis() - chrono >= dureeEteinte) {
// on a fini la phase où la LED est éteinte, on recommence par choisir une nouvelle LED aléatoire
etape = SELECTION;
Serial.println("Fin éteinte, nouveau choix");
}
break;
}
}
void setup() {
for (byte i = 0; i < nbLeds; i++) pinMode(brochesLed[i], OUTPUT);
Serial.begin(115200);
randomSeed(analogRead(A0));
}
void loop() {
animation();
}