/* rotazione automatica di vari sketch (Case) indipendenti di vario tipo su 6 Case: differenti
in questo caso ogni Case accende un led dopo aver spento tutti gli altri che potrebbero essere rimasti accesi
dagli altri case.
Questo sketch può essere utile in tutti casi in cui si voglia mostrare ciclicamente diverse visualizzazioni in
un display LCD: come temperature, umidità, massime, minime, Data, ora, Menù impostazioni, scritte alternate
by Viller Broccoli
*/
#include <Wire.h> // richiama la libreria Wire che riconosce la seriale I2C
#include <RTClib.h> // richiama la libreria dell'orologio RTC
#include <LiquidCrystal.h> // richiama la libreria del display lcd
char buffer[10]; // Buffer per la formattazione delle stringhe
int tastImpost = 8; // Pin (8) collegato al pulsante "Impostazione"
int tastSu = 9; // Pin (9) collegato al pulsante "Su"
int tastGiu = 10; // Pin (10) collegato al pulsante "Giu"
unsigned long t1, dt; // dichiara due variabili su cui effettuare operazioni col tempo millis()
unsigned long prevMillis = 0; // Variabile su cui memorizzare il tempo dell'ultimo cambio di stato
unsigned long currMillis = 0; // Variabile per memorizzare il tempo trascorso dopo l'ultimo cambio di stato
const long interval1 = 2000; // Intervallo desiderato tra i cambi di stato (visualizza Temperatura e Data/Ora))
bool FIRST = true; // dichiara una variabile "FIRST" utile per il processo di avanzamento di stato
const int limiteMassimo= 6; // variabile su cui è impostato il limite massimo di case raggiungibile
const int LedAzzurro= 22; //Pin (22) collegato al pulsante Led Azzurro
const int LedRosa= 23; //Pin (22) collegato al pulsante Led Azzurro
const int LedVerde= 24; //Pin (22) collegato al pulsante Led Azzurro
const int LedGiallo= 25; //Pin (22) collegato al pulsante Led Azzurro
const int LedRosso= 26; //Pin (22) collegato al pulsante Led Azzurro
const int LedBlu= 27; //Pin (22) collegato al pulsante Led Azzurro
const int LedArancio= 28; //Pin (22) collegato al pulsante Led Azzurro
RTC_DS1307 RTC; // Inizializza l'oggetto RTC_DS1307 chiamandolo "RTC"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // inizializzazione pin dedicati al display lcd
int stato = 0; // variabile il cui valore permette di commutare il relativo case , parte da 0.
void setup() {
pinMode (tastImpost, INPUT); // Imposta il tasto "impostazione"
pinMode (tastSu, INPUT); // Imposta il tasto "Su"
pinMode (tastGiu, INPUT); // Imposta il tasto "Giu"
pinMode (LedAzzurro, OUTPUT); // Imposta l'uscita "Led Azzurro"
pinMode (LedRosa, OUTPUT); // Imposta l'uscita "Led Rosa"
pinMode (LedVerde, OUTPUT); // Imposta l'uscita "Led Verde"
pinMode (LedGiallo, OUTPUT); // Imposta l'uscita "Led Giallo"
pinMode (LedRosso, OUTPUT); // Imposta l'uscita "Led Rosa"
pinMode (LedBlu, OUTPUT); // Imposta l'uscita "Led Verde"
pinMode (LedArancio, OUTPUT); // Imposta l'uscita "Led Giallo"
Wire.begin(); // Inizializza la comunicazione I2C
RTC.begin(); // Inizializza il timer RTC
lcd.begin(16, 2); // INIZIALIZZO IL DISPLAY
Serial.begin(9600); // Inizializza la stampa su schermo a 9600 baud rate
if (!RTC.isrunning()) { // Se il RTC non sta funzionando o non è collegato,
Serial.println("RTC is NOT running!"); // scrive su stampa a schermo la scritta "RTC is NOT running!
RTC.adjust(DateTime(__DATE__, __TIME__)); //imposta la data/ora con quella dello sketch
}
}
void loop(){
currMillis = millis();
if (currMillis - prevMillis >= interval1) { // Verifica se è trascorso l'intervallo di tempo
if (digitalRead(tastImpost) == HIGH) { // Se il pulsante tastImpost è premuto
stato = 6; // passa direttamente allo stato 6
}
// Incrementa la variabile e assicura che non superi il limite massimo 3
else {stato = (stato + 1) % (limiteMassimo + 1);}
delay(10);
prevMillis = currMillis; // Aggiornare l'ultimo tempo di incremento
}
Serial.print ("stato ");
Serial.print (stato);
Serial.print (" tastImpost ");
Serial.print (digitalRead(tastImpost));
Serial.print (" Azzurro ");
Serial.print (digitalRead(LedAzzurro));
Serial.print (" Rosa ");
Serial.print (digitalRead(LedRosa));
Serial.print (" Verde ");
Serial.print (digitalRead(LedVerde));
Serial.print (" Giallo ");
Serial.print (digitalRead(LedGiallo));
Serial.print (" Rosso ");
Serial.print (digitalRead(LedRosso));
Serial.print (" Blu ");
Serial.print (digitalRead(LedBlu));
Serial.print (" Arancio ");
Serial.println(digitalRead(LedArancio));
delay(100);
/*
if (stato == 2, 3, 4,) {
if(digitalRead(tastImpost) == HIGH) {stato = (stato + 1) % 8; stato = 2;
delay(200);}
else currMillis = millis(); // Ottieni il tempo corrente
if (currMillis - prevMillis >= interval1) { // Controlla se è trascorso l'intervallo desiderato
prevMillis = currMillis; // Aggiorna il tempo dell'ultimo cambio di stato
if (stato == 0) stato = 1;
else stato = 0;
}
}
*/
switch(stato){
case 0:
digitalWrite(LedRosa, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedRosso, LOW);
digitalWrite(LedBlu, LOW);
digitalWrite(LedArancio, LOW);
ledAzzurro();
// **************************^^***** ledAzzurro ***********************************
break;
case 1:
digitalWrite(LedAzzurro, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedRosso, LOW);
digitalWrite(LedBlu, LOW);
digitalWrite(LedArancio, LOW);
ledRosa();
// ********************************* ledRosa *************************************
break;
case 2:
digitalWrite(LedAzzurro, LOW);
digitalWrite(LedRosa, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedRosso, LOW);
digitalWrite(LedBlu, LOW);
digitalWrite(LedArancio, LOW);
ledVerde();
// ********************************* ledVerde ************************************
break;
case 3:
digitalWrite(LedAzzurro, LOW);
digitalWrite(LedRosa, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedRosso, LOW);
digitalWrite(LedBlu, LOW);
digitalWrite(LedArancio, LOW);
ledGiallo();
// ********************************* ledGiallo ***********************************
break;
case 4:
digitalWrite(LedAzzurro, LOW);
digitalWrite(LedRosa, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedBlu, LOW);
digitalWrite(LedArancio, LOW);
ledRosso();
// ********************************* ledRosso ***********************************
break;
case 5:
digitalWrite(LedAzzurro, LOW);
digitalWrite(LedRosa, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedRosso, LOW);
digitalWrite(LedArancio, LOW);
ledBlu();
// ********************************* ledBlu ***********************************
break;
case 6:
digitalWrite(LedAzzurro, LOW);
digitalWrite(LedRosa, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedGiallo, LOW);
digitalWrite(LedRosso, LOW);
digitalWrite(LedBlu, LOW);
ledArancio();
// ********************************* ledArancio ***********************************
break;
}
}
void ledAzzurro(){
digitalWrite(LedAzzurro, HIGH);
}
void ledRosa(){
digitalWrite(LedRosa, HIGH);
}
void ledVerde(){
digitalWrite(LedVerde, HIGH);
}
void ledGiallo(){
digitalWrite(LedGiallo, HIGH);
}
void ledRosso(){
digitalWrite(LedRosso, HIGH);
}
void ledBlu(){
digitalWrite(LedBlu, HIGH);
}
void ledArancio(){
digitalWrite(LedArancio, HIGH);
}