const byte pinPulsante = A0;
const byte pinLed = 13;
enum stato {RIPOSO, LAMPEGGIO, LAMPEGGIO_SE_NECESSARIO} stato = RIPOSO;
const unsigned long mezzaPeriodoDiLampeggio = 500;
const unsigned long MaxLampeggi = 5;
unsigned long contatoreLampeggi;
unsigned long tempoInizio; // Non usato ma potrebbe essere utile
// restituisce true quando il lampeggio è finito
bool lampeggia(bool iniziaLampeggio = false) {
static unsigned long ultimoTempoLed;
if (iniziaLampeggio) {
contatoreLampeggi = 1;
ultimoTempoLed = millis();
digitalWrite(pinLed, HIGH);
} else if (millis() - ultimoTempoLed >= mezzaPeriodoDiLampeggio) {
digitalWrite(pinLed, (digitalRead(pinLed) == HIGH) ? LOW : HIGH);
ultimoTempoLed = millis();
contatoreLampeggi++;
}
return contatoreLampeggi >= 2 * MaxLampeggi;
}
bool pulsantePremuto() {
return digitalRead(pinPulsante) == LOW;
}
void setup() {
pinMode(pinPulsante, INPUT_PULLUP);
pinMode(pinLed, OUTPUT);
}
void loop() {
switch (stato) {
case RIPOSO:
if (pulsantePremuto()) {
lampeggia(true); // forza l'inizio del lampeggio
tempoInizio = millis(); // Non usato ma potrebbe essere utile
stato = LAMPEGGIO;
}
break;
case LAMPEGGIO:
if (lampeggia()) {
stato = LAMPEGGIO_SE_NECESSARIO;
}
break;
case LAMPEGGIO_SE_NECESSARIO:
if (!pulsantePremuto()) {
digitalWrite(pinLed, LOW);
delay(15); // rimedio anti-rimbalzo rudimentale
stato = RIPOSO;
} else lampeggia();
break;
}
}