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