//Progetto Semaforo 4 - Con Conteggio Durata Rosso

//Display a 7 segmenti TM1647
#include <TM1637.h>

// Definisci i pin utilizzati
const int CLK1 = 2;
const int DIO1 = 3;
const int CLK2 = 10;
const int DIO2 = 11;
// Crea i 2 Display TM1637
TM1637 TMDisplay1 (CLK1, DIO1);
TM1637 TMDisplay2 (CLK2, DIO2);

// Definisci l'Ingresso e le 6 Uscite
const int Interruttore = 4; // Ingresso Interruttore ON / OFF
const int Rosso1 = 13; // Semaforo 1 Rosso
const int Giallo1 = 12; // Semaforo 1 Giallo
const int Verde1 = 9; // Semaforo 1 Verde
const int Rosso2 = 6; // Semaforo 2 Rosso
const int Giallo2 = 7; // Semaforo 2 Giallo
const int Verde2 = 8; // Semaforo 2 Verde

void setup() {
  TMDisplay1.init(); // Inizializza il display 1
  TMDisplay1.set(BRIGHT_TYPICAL); // Imposta la luminosità Standard display 1
  TMDisplay2.init(); // Inizializza il display 1
  TMDisplay2.set(BRIGHT_TYPICAL); // Imposta la luminosità Standard display 2
  pinMode(Interruttore, INPUT); // Interruttore come Ingresso
  pinMode(Rosso1, OUTPUT); // Semaforo 1 Rosso come Uscita
  pinMode(Giallo1, OUTPUT); // Semaforo 1 Giallo come Uscita
  pinMode(Verde1, OUTPUT); // Semaforo 1 Verde come Uscita
  pinMode(Rosso2, OUTPUT); // Semaforo 2 Rosso come Uscita
  pinMode(Giallo2, OUTPUT); // Semaforo 2 Giallo come Uscita
  pinMode(Verde2, OUTPUT); // Semaforo 2 Verde come Uscita
}

  // Variabili di Tempo
  unsigned int countdown1 = 9; // Tempo Max Countdown 1
  unsigned int countdown2 = 9; // Tempo Max Countdown 2
  int decrement = 1; // Decremento Countdown

void loop() {
  // Se l'interruttore è LOW mettere i Semafori in Giallo Lampeggiante
  // Altrimenti Accendi i Semafori
  if (digitalRead(Interruttore) == LOW) {
    SemaforiSpenti();
    } else {
      SemaforiAccesi();
    }
  }

  // Gialli Lampeggianti Semafori Spenti
  void SemaforiSpenti () {
    digitalWrite(Rosso1, LOW); // Spegni Rosso su Semaforo 1
    digitalWrite(Rosso2, LOW); // Spegni Rosso su Semaforo 2
    digitalWrite(Verde1, LOW); // Spegni Verde su Semaforo 1
    digitalWrite(Verde2, LOW); // Spegni Verde su Semaforo 2
    TMDisplay1.clearDisplay(); // Spegni il Display 1
    TMDisplay2.clearDisplay(); // Spegni il Display 2
    digitalWrite(Giallo1, HIGH); // Accendi Giallo su Semaforo 1
    digitalWrite(Giallo2, HIGH); // Accendi Giallo su Semaforo 2
    delay(1000); // Tempo Lampeggio Accesso
    digitalWrite(Giallo1, LOW); // Spegni Giallo su Semaforo 1
    digitalWrite(Giallo2, LOW); // Spegni Giallo su Semaforo 2
    delay(1000); // Tempo Lampeggio Spento
  }

// Sequenza Semafori
void SemaforiAccesi() {
  digitalWrite(Rosso2, HIGH); // Accendi il Rosso su Semaforo 2
  // Visualizza 10 sec. su Display 2
  TMDisplay2.display(2,1);
  TMDisplay2.display(3,0);
  digitalWrite(Rosso1, HIGH); // Accendi il Rosso su Semaforo 1
  // Visualizza 1 sec. su Display 1
  TMDisplay1.display(3,1);
  delay(1000); // Attesa Verde sul Semaforo 1
  digitalWrite(Rosso1, LOW); // Spegni il Rosso su Semaforo 1
  TMDisplay1.clearDisplay(); // Spegni il Display 1
  digitalWrite(Verde1, HIGH); // Accendi il Verde su Semaforo 1
  TMDisplay2.clearDisplay(); // Spegni il Display 2
  // Accendi il Display 2 per il countdown 9 sec.
  TMDisplay2.display(2, (countdown2 / 10) % 10); // Cifra dei decimali
  TMDisplay2.display(3, countdown2 % 10); // Cifra delle unità
  countdown2--; // Inizio Countdown 2
  if (countdown2 >= 3) {
  TMDisplay2.clearDisplay(); // Spegni il Display 2
  TMDisplay2.display(3,2); // Accendi e Mostra sul Display 2, 2 sec.
  digitalWrite(Verde1, LOW); // Spegni il Verde su Semaforo 1
  digitalWrite(Giallo1, HIGH);// Accendi il Giallo su Semaforo 1
  }
  delay(1000); // Attesa Cambio Colore - Da Giallo a Rosso
  TMDisplay2.clearDisplay(); // Spegni il Display 2
  TMDisplay2.display(3,1); // Accendi e Mostra sul Display 2, 1 sec.
  digitalWrite(Giallo1, LOW); // Spegni il Giallo su Semaforo 1
  digitalWrite(Rosso1, HIGH); // Accendi il Rosso su Semaforo 1
  // Visualizza 10 sec. su Display 1
  TMDisplay1.display(2,1);
  TMDisplay1.display(3,0);
  delay(1000); // Attesa Verde sul Semaforo 2
  digitalWrite(Rosso2, LOW); // Spegni il Rosso su Semaforo 2
  TMDisplay2.clearDisplay(); // Spegni il Display 2
  TMDisplay1.clearDisplay(); // Spegni il Display 1
  // Accendi il Display 1 per il countdown 9 sec.
  TMDisplay1.display(2, (countdown1 / 10) % 10); // Cifra dei decimali
  TMDisplay1.display(3, countdown1 % 10); // Cifra delle unità
  countdown1--; // Inizio Countdown 1
  if (countdown2 >= 6) {
  TMDisplay1.clearDisplay(); // Spegni il Display 1
  TMDisplay1.display(3,2); // Accendi e Mostra sul Display 1, 2 sec.
  digitalWrite(Verde2, LOW); // Spegni il Verde su Semaforo 1
  digitalWrite(Giallo2, HIGH); // Accendi il Giallo su Semaforo 1
  }
  delay(1000); // Attesa Cambio Colore - Da Giallo a Rosso
  TMDisplay1.clearDisplay(); // Spegni il Display 1
  TMDisplay1.display(3,1); // Accendi e Mostra sul Display 1, 1 sec.
  digitalWrite(Giallo2, LOW); // Spegni il Giallo su Semaforo 1
  TMDisplay1.clearDisplay(); // Spegni il Display 1
}
4-Digit Display
4-Digit Display