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;
  }
}