struct Led {
const byte broche;
byte etat;
unsigned long debut;
unsigned long attente;
};
Led lesLeds[] = {
{2, LOW, 0, 0},
{3, LOW, 0, 0},
{4, LOW, 0, 0},
{5, LOW, 0, 0},
{6, LOW, 0, 0},
{7, LOW, 0, 0},
{8, LOW, 0, 0},
{9, LOW, 0, 0},
{10, LOW, 0, 0},
{11, LOW, 0, 0},
};
const byte numLeds = 10;
// gestion commande série
enum {ATTENTE_BROCHE, ATTENTE_DUREE} etat;
byte indexLed;
unsigned long duree;
void setup() {
Serial.begin(115200);
// état initial
for (Led& l : lesLeds) {
pinMode(l.broche, OUTPUT);
digitalWrite(l.broche, l.etat);
}
Serial.println(F("Entrez une commandes N° Led suivi de la durée en secondes"));
}
void loop() {
// gestion commande série
if (Serial.available()) {
char recu = Serial.read();
switch (etat) {
case ATTENTE_BROCHE:
if (recu >= '0' && recu <= '9') { // choix du N° de la LED
indexLed = recu - '0';
etat = ATTENTE_DUREE;
}
break;
case ATTENTE_DUREE:
if (recu == '\n') { // fin de la durée
lesLeds[indexLed].etat = (duree == 0) ? LOW : HIGH;
lesLeds[indexLed].attente = duree * 1000ul;
lesLeds[indexLed].debut = millis();
digitalWrite(lesLeds[indexLed].broche, lesLeds[indexLed].etat );
// ------ info de debug -----
Serial.print(F("Led N°"));
Serial.print(indexLed);
Serial.print(F(" sur la broche #"));
Serial.print(lesLeds[indexLed].broche);
Serial.print(F(" mise à "));
Serial.print(lesLeds[indexLed].etat == HIGH ? "HIGH" : "LOW");
if (lesLeds[indexLed].etat == HIGH) {
Serial.print(F(" pour "));
Serial.print(duree);
Serial.println(F(" s"));
} else Serial.println();
// ---------------------------
indexLed = 0;
duree = 0;
etat = ATTENTE_BROCHE;
} else {
if (recu >= '0' && recu <= '9') {
duree = duree * 10 + (recu - '0');
}
}
break;
}
}
// gestion de l'extinction automatique
for (Led& l : lesLeds) {
if (l.etat == HIGH)
if (millis() - l.debut >= l.attente) {
l.etat = LOW;
digitalWrite(l.broche, LOW);
l.attente = 0;
}
}
}
0
9