/*
esempio di programmazione a stati, con funzione "Switch...break" che permette di saltare direttamente alla
porzione di programma indipendente selezionata.
Viller Broccoli
*/
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h> // Include la libreria LiquidCrystal per il display LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte ledPin[] = {7, 8, 9, 10,}; // creazione di un array di 4 pin a cui vanno collegati i LED
int stato = 0; // variabile il cui valore permette di commutare il relativo case , parte da 0.
unsigned long cambioCase = 5000; // variabile che stabilisce l'intevallo di tempo per ogni case
unsigned long tempoTrascorso; // variabile che calcola la differenza tempo
const int intervallo = 2000; // intervallo di accensione/spegnimento in millisecondi (2 secondi)
const int limiteMassimo = 3; // variabile che determina quanti case in sequenza deve cambiare
unsigned long ultimoTempo = 0; // Memorizza il tempo dell'ultimo incremento
void setup() {
Serial.begin(9600); // attiva la stampa su schermo a 9600 bps
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
lcd.begin(16, 2); // inizializza il display LCD su 16 colonne 2 righe.
for (byte x=0; x<4; x++) {
pinMode(ledPin[x], OUTPUT); //Ciclo "for" che imposta i quattro PIN da 0 a 3 come OUTPUT
}
tempoTrascorso = millis(); // variabile che registra il tempo del contatore "millis()"
}
void loop() {
unsigned long tempoAttuale = millis();
/*
DateTime now = RTC.now();
lcd.clear()
sprintf(buffer, "%02d/%02d/%d", now.day(), now.month(), now.year());
lcd.setCursor(0,0);
lcd.print( buffer );
char buffer[10] = "";
sprintf(buffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.setCursor(0,1);
lcd.print( buffer );
delay(1000);
*/
// Verificare se è trascorso l'intervallo di tempo
if (tempoAttuale - ultimoTempo >= intervallo) {
// Incrementare la variabile e assicurarsi che non superi il limite massimo
stato = (stato + 1) % (limiteMassimo + 1);
// Stampare il valore attuale della variabile
Serial.print("stato:");
Serial.println(stato);
delay(30);
ultimoTempo = tempoAttuale; // Aggiornare l'ultimo tempo di incremento
}
// funzione che permette la commutazione sui diversi stati (case) in base al valore della variabile "stato"
switch(stato){
case 0:
// Spegni tutti i LED tranne quello relativo al caso 0
digitalWrite(9, LOW); // Spegni LED blu
digitalWrite(8, LOW); // Spegni LED rosso
digitalWrite(7, LOW); // Spegni LED verde
// Accendi il LED giallo solo se necessario
// la funzione switch attiva solo il case 0 e cicla il programma all'interno del loop "blinkLedGiallo()"
blinkLedGiallo();
break;
case 1:
// Spegni tutti i LED tranne quello relativo al caso 1
digitalWrite(10, LOW); // Spegni LED giallo
digitalWrite(8, LOW); // Spegni LED rosso
digitalWrite(7, LOW); // Spegni LED verde
// Accendi il LED blu solo se necessario
// la funzione switch attiva solo il case 1 e cicla il programma all'interno del loop "blinkLedBlu()"
blinkLedBlu();
break;
case 2:
// Spegni tutti i LED tranne quello relativo al caso 2
digitalWrite(10, LOW); // Spegni LED giallo
digitalWrite(9, LOW); // Spegni LED blu
digitalWrite(7, LOW); // Spegni LED verde
// Accendi il LED rosso solo se necessario
// la funzione switch attiva solo il case 2 e cicla il programma all'interno del loop "blinkLedRosso()"
blinkLedRosso();
break;
case 3:
// Spegni tutti i LED tranne quello relativo al caso 3
digitalWrite(10, LOW); // Spegni LED giallo
digitalWrite(9, LOW); // Spegni LED blu
digitalWrite(8, LOW); // Spegni LED rosso
// Accendi il LED verde solo se necessario
// la funzione switch attiva solo il case 3 e cicla il programma all'interno del loop "blinkLedVerde()"
blinkLedVerde();
break;
}
}
unsigned long t0, dt0 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled0 = LOW; // variabile su cui è scritto lo stato del led
void blinkLedGiallo() { // loop dello stato 4 che fa lampeggiare il LED giallo
dt0 = millis() - t0; // calcola il tempo trascorso
if (dt0 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled0 = !statoled0; // inverte lo stato di uscita del Led
digitalWrite(10, statoled0); // accende il led che cambia stato
t0 = millis(); // resetta il tempo sulla variabile contatore t0
// Print a message to the LCD.
//lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp Piano 0");
lcd.setCursor(0,1);
lcd.print("Temp1");
}
}
unsigned long t1, dt1 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled1 = LOW; // variabile su cui è scritto lo stato del led blu
void blinkLedBlu() { // loop dello stato 4 che fa lampeggiare il LED blu
dt1 = millis() - t1; // calcola il tempo trascorso
if (dt1 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled1 = !statoled1; // inverte lo stato di uscita del Led
digitalWrite(9, statoled1); // accende il led che cambia stato
t1 = millis(); // resetta il tempo sulla variabile contatore t1
//lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp Piano 1");
lcd.setCursor(0,1);
lcd.print("Temp2");
}
}
unsigned long t2, dt2 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled2 = LOW; // variabile su cui è scritto lo stato del led rosso
void blinkLedRosso() { // loop dello stato 3 che fa lampeggiare il LED rosso
dt2 = millis() - t2; // calcola il tempo trascorso
if (dt2 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled2 = !statoled2; // inverte lo stato di uscita del Led
digitalWrite(8, statoled2); // accende il led che cambia stato
t2 = millis(); // resetta il tempo sulla variabile contatore t2
//lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp Piano 2");
lcd.setCursor(0,1);
lcd.print("Temp3");
}
}
unsigned long t3, dt3 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled3 = LOW; // variabile su cui è scritto lo stato del led verde
void blinkLedVerde() { // loop dello stato 4 che fa lampeggiare il LED verde
dt3 = millis() - t3; // calcola il tempo trascorso
if (dt3 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled3 = !statoled3; // inverte lo stato di uscita del Led
digitalWrite(7, statoled3); // accende il led che cambia stato
t3 = millis(); // resetta il tempo sulla variabile contatore t3
//lcd.clear();
}
}