#define LED_VERDE 3        // LED verde collegato al pin digitale 3  
#define LED_ROSSO 5        // LED rosso collegato al pin digitale 5  
#define BUTTON 2           // Pulsante collegato al pin digitale 2  

unsigned long tempoPremuto = 0;  // Variabile per tenere traccia del tempo di pressione
unsigned long durataClicSingolo = 500; // Durata per il clic singolo (2 secondi)
unsigned long tempoDoppioClic = 500;   // Tempo massimo per considerare un doppio clic (500 ms)
unsigned long tempoUltimaPressione = 50; // Tempo dell'ultima pressione
unsigned long tempoAccensioneLED = 50;  // Tempo per spegnere il LED rosso (2 minuti)
bool ledRossoAcceso = false;    // Flag per il LED rosso
bool ledVerdeAcceso = false;    // Flag per il LED verde
bool primaPressione = false;    // Flag per la prima pressione del pulsante

void setup() {
  pinMode(LED_VERDE, OUTPUT);    // Imposta il pin del LED verde come output
  pinMode(LED_ROSSO, OUTPUT);    // Imposta il pin del LED rosso come output
  pinMode(BUTTON, INPUT);        // Imposta il pin del pulsante come input
}

void loop() {
  int statoPulsante = digitalRead(BUTTON);  // Legge lo stato del pulsante

  // Se il pulsante è premuto
  if (statoPulsante == HIGH) {
    // Se è la prima volta che il pulsante viene premuto, memorizza il tempo
    if (tempoPremuto == 0) {
      tempoPremuto = millis();
    }

    // Se è stato premuto per più di 2 secondi, accende il LED verde
    if (millis() - tempoPremuto >= durataClicSingolo && !ledVerdeAcceso) {
      digitalWrite(LED_VERDE, HIGH);  // Accende il LED verde
      ledVerdeAcceso = true;          // Imposta il flag del LED verde
      tempoPremuto = 0;               // Reset tempo premuto
    }
  } else {
    // Se il pulsante è rilasciato
    if (tempoPremuto > 0 && millis() - tempoPremuto < durataClicSingolo && !primaPressione) {
      // Se è una prima pressione corta (per un doppio clic)
      primaPressione = true;
      tempoUltimaPressione = millis();  // Memorizza il tempo dell'ultima pressione
    }

    // Gestisci il doppio clic
    if (primaPressione && millis() - tempoUltimaPressione <= tempoDoppioClic) {
      if (!ledRossoAcceso) {
        digitalWrite(LED_ROSSO, HIGH);  // Accende il LED rosso
        ledRossoAcceso = true;          // Imposta il flag del LED rosso
        tempoAccensioneLED = millis();  // Memorizza il tempo di accensione del LED rosso
      }
      primaPressione = false;  // Reset la prima pressione
    }

    // Se è passato più di 2 minuti, spegne il LED rosso
    if (ledRossoAcceso && millis() - tempoAccensioneLED >= 120000) {  // 120000 ms = 2 minuti
      digitalWrite(LED_ROSSO, LOW);  // Spegne il LED rosso
      ledRossoAcceso = false;        // Resetta il flag del LED rosso
    }

    // Se il pulsante è stato rilasciato e il LED verde è acceso per più di 2 secondi, spegnilo
    if (ledVerdeAcceso && millis() - tempoPremuto >= durataClicSingolo) {
      digitalWrite(LED_VERDE, LOW);  // Spegne il LED verde
      ledVerdeAcceso = false;        // Resetta il flag del LED verde
    }

    tempoPremuto = 0;  // Reset tempo premuto
  }
}