//Progetto Semaforo Semplice

const int Interruttore = 2; // Ingresso Interruttore ON / OFF
const int Rosso = 13; // Semaforo Rosso
const int Giallo = 12; // Semaforo Giallo
const int Verde = 11; // Semaforo Verde
const int Giallo2 = 10; // Semaforo Giallo Lampaggiante
unsigned long memoMillisOff = 0; // Memorizza l'ultimo momento in cui CounterOff il contatore è stato incrementato
unsigned long memoMillisOn = 0; // Memorizza lultimo momento in cui CounterOn è stato incrementato
const long interval = 1000; // Intervallo in millisecondi (1 secondo)
int counterOff = 0; // Contatore per Semafori Spenti
int counterOn = 0; // Contatore per Semafori Accesi

void setup() {
  pinMode(Interruttore, INPUT); // Interruttore come Ingresso
  pinMode(Rosso, OUTPUT); // Rosso come Uscita
  pinMode(Giallo, OUTPUT); // Giallo come Uscita
  pinMode(Verde, OUTPUT); // Verde come Uscita
  pinMode(Giallo2, OUTPUT); // Giallo Lampeggiante come Uscita
  Serial.begin(9600);
}

void loop() {
// Se l'interruttore è LOW mettere i Semafori in Giallo Lampeggiante
// Altrimenti Accendi i semafori

  if (digitalRead(Interruttore) == LOW) {
  SemaforiSpenti();
  counterOn = 0;
  digitalWrite(Rosso, LOW);
  digitalWrite(Verde, LOW);
  digitalWrite(Giallo, LOW);
  } else {
  SemaforiAccesi();
  counterOff = 0;
  digitalWrite(Giallo2, LOW);
  }
 }
  // Gialli Lampeggianti Semaforo Spento
  void SemaforiSpenti () {
    unsigned long cMillisOff = millis();
    if (digitalRead(Interruttore == LOW) && cMillisOff - memoMillisOff >= interval) {
    // Se è passato almeno un secondo
    memoMillisOff = cMillisOff;
    counterOff++;}
    if (digitalRead(Interruttore == LOW) && counterOff > 0 && counterOff < 2) { // Se CounterOff è a 1 secondo
    digitalWrite(Giallo2, HIGH); // Accendi Giallo
    }
    if (digitalRead(Interruttore == LOW) && counterOff > 1 && counterOff < 3) { // Se CounterOff è a 2 secondi
    digitalWrite(Giallo2, LOW); // Spegni Giallo
    counterOff = 0;
  }
  }
  
  // Sequenza Semaforo Acceso
  void SemaforiAccesi() {
  unsigned long cMillisOn = millis();
  if (digitalRead(Interruttore == HIGH) && cMillisOn - memoMillisOn >= interval) {
  // Se è passato almeno un secondo
  memoMillisOn = cMillisOn;
  counterOn++;
  }
  Serial.print(counterOn);
  if (counterOn > 0 && counterOn < 6) { // Se CounterOn è da 1 a 5 secondi
  digitalWrite(Verde, HIGH); // Accendi il Verde su Semaforo 1 e Rosso su Semaforo 2
  }
  if (counterOn > 5 && counterOn < 8) { // Se CounterOn è da 6 a 7 secondi
  digitalWrite(Verde, LOW); // Spegni il Verde su Semoforo 1 e Rosso su Semaforo 2
  digitalWrite(Giallo, HIGH); // Accendi entrambi i Gialli
  }
  if (counterOn > 7 && counterOn < 10) { // Se CounterOn è da 8 a 9 secondi
  digitalWrite(Giallo, LOW); // Spegni entrambi i Gialli
  digitalWrite(Rosso, HIGH); // Accendi il Rosso su Semaforo 1 e Verde su Semaforo 2
  }
  if (counterOn > 9 && counterOn < 12) { // Se CounterOn è da 10 a 11 secondi
  digitalWrite(Rosso, LOW); // Spegni il Rosso su Semaforo 1 e Verde su Semaforo 2
  digitalWrite(Giallo, HIGH); // Accendi entrambi Gialli
  }
  if (counterOn > 11 && counterOn < 17) { // Se CounterOn è da 12 a 16
  digitalWrite(Giallo, LOW); // Spegni entrambi i Gialli
  counterOn = 1;
  }
  }