#include <Servo.h> //include la libreria servo per il funzionamento del servomote
Servo myServo; // Oggetto Servo
int posizione = 0; // Posizione iniziale del servo motore
int potenziometroPin = A0; // Ingresso analogico del potenziometro
int potenziometroValue = 0; // Valore letto del potenziometro
const int buttonPin1 = 2; // Dichiarazione Pulsante e assegnazione al pin digitale 2;
int buttonState;//Memorizza lo stato corrente del pulsante (HIGH o LOW)
int ldr_1_ovest = A1; //Dichiarazione Ldr e assegnazione al pin analogico A1;
int ldr_2_ovest = A2; //Dichiarazione Ldr e assegnazione al pin analogico A2;
int ldr_3_est = A3; //Dichiarazione Ldr e assegnazione al pin analogico A3;
int ldr_4_est = A4; //Dichiarazione Ldr e assegnazione al pin analogico A4;
int ldr1_value_digital; //Dichiarazione variabile intere per memorizzare le letture digitali del sensori di luce ldr1
int ldr2_value_digital; //Dichiarazione variabile intere per memorizzare le letture digitali del sensori di luce ldr2
int ldr3_value_digital; //Dichiarazione variabile intere per memorizzare le letture digitali del sensori di luce ldr3
int ldr4_value_digital; //Dichiarazione variabile intere per memorizzare le letture digitali del sensori di luce ldr4
float ldr1_value_analog; //Dichiarazione variabili float per memorizzare le letture di tensione analogica convertite dal sensore di luce ldr1
float ldr2_value_analog; //Dichiarazione variabili float per memorizzare le letture di tensione analogica convertite dal sensore di luce ldr2
float ldr3_value_analog; //Dichiarazione variabili float per memorizzare le letture di tensione analogica convertite dal sensore di luce ldr3
float ldr4_value_analog; //Dichiarazione variabili float per memorizzare le letture di tensione analogica convertite dal sensore di luce ldr4
int threshold = 50; //Valore di soglia impostato per le letture dei sensori di luce
bool modalita_auto = true; //Dichiarazione variabile booleana e la inizializza a true (il programma inizia in modalità automatica)
bool modalita_manuale= false;//Dichiarazione variabile booleana e la inizializza a false
bool risingButtonState = false; //Dichiarazione variabile booleana per il debouncing e la inizializza a false
unsigned long lastDebounceTime = 0;//Memorizza in millisecondi l'ultima pressione del pulsante
unsigned long debounceDelay = 50;//Ritardo di debounce in millisecondi
volatile bool interrupt_flag = false;//Non è stato rivelata ancora nessuna pressione sul pulsante
void interrupt_buttonpush() {//Funzione che viene attivata quando viene rilevata una pressione sul pulsante
interrupt_flag = true;
}
void setup() {
myServo.attach(11);//Associa il servomotore al pin digitale 11
myServo.write(0);//Permette al servomototore di spostarsi in una precisa posizione
pinMode(buttonPin1, INPUT);//Configura il pin del pulsante come input
pinMode(ldr_1_ovest, INPUT);//Configura il pin del sensore ldr1 come input
pinMode(ldr_2_ovest, INPUT);//Configura il pin del sensore ldr2 come input
pinMode(ldr_3_est, INPUT);//Configura il pin del sensore ldr3 come input
pinMode(ldr_4_est, INPUT);//Configura il pin del sensore ldr4 come input
Serial.begin(9600);//Inizializza la comunicazione seriale a 9600
attachInterrupt(digitalPinToInterrupt(2), interrupt_buttonpush, CHANGE);
//Attiva un'interruzione sul pin del pulsante utilizzando la funzione attachInterrupt()
//La funzione interrupt_buttonpush viene richiamata quando viene rivelata un interruzione
//Change specifica il tipo di cambiamento da rilevare(in questo caso HIGH o LOW)
}
void loop() {
if (modalita_auto == true)// Se la condizione è vera..
stato_automatico(); //Svolge la funzione stato_automatico()
else//Se no...
stato_manuale(); //Svolge la funzione stato_manuale
if (interrupt_flag) {//Se la condiizione è vera...
lastDebounceTime = millis();//Aggiorna lastDebounceTiem con il tmepo corrente
interrupt_flag = false;//Reimposta la interrupt_flag in modo da catturare la successiva pressione del pulsante
risingButtonState = true;//Associa a questa variabile il valore true
}
if ((millis() - lastDebounceTime) > debounceDelay & risingButtonState) {//Verifica se il tempo trascorso dall'ultima pressione del pulsante(millis()) è maggiore del ritardo di debounce(debounceDelay)
//Se il tempo trascorso supera il ritardo di deboucne, significa che il pulsante è stato premuto in modo stabile e si può procedere con la sua gestione
risingButtonState = false;//Variabile booleana utilizzato per verificare lo stato del pulsante, se gli assegniamo il valore False, stiamo indicando che il pulsante non è premuto o che è stato premuto in precedenza e ora è stabile
buttonState = !buttonState;//Cambia il valore precedente associato alla variabile
if (buttonState == HIGH) {//Se la condizione è vera(pulsante premuto)
modalita_auto = !modalita_auto;//Cambia il valore precedente associato alla variabile booleana
modalita_manuale= !modalita_manuale;//Cambia il valore precedente associato alla variabile booleana
}
}
if (modalita_auto) {//Se la condizione è vera...
stato_automatico(); //Svolgo la funzione
Serial.println("Modalità automatica attiva");//Stampa a schermo la stringa
}
else if (modalita_manuale) {
stato_manuale();//Svolgo la funzione
Serial.println("Modalità manuale attiva"); //Stampa a schermo la stringa
}
}
void stato_automatico() {
ldr1_value_digital = analogRead(ldr_1_ovest);//Legge il valore di tensione analogica sul pin del Ldr1 e lo associa alla variabile ldr1_value_digital
ldr1_value_analog = ldr1_value_digital * (5.0 / 1023);//Calcolo valore analogico normalizzato del sensore Ldr1
ldr2_value_digital = analogRead(ldr_2_ovest);//Legge il valore di tensione analogica sul pin del Ldr2 e lo associa alla variabile ldr2_value_digital
ldr2_value_analog = ldr2_value_digital * (5.0 / 1023);//Calcolo valore analogico normalizzato del sensore Ldr2
ldr3_value_digital = analogRead(ldr_3_est);//Legge il valore di tensione analogica sul pin del Ldr3 e lo associa alla variabile ldr3_value_digital
ldr3_value_analog = ldr3_value_digital * (5.0 / 1023);//Calcolo valore analogico normalizzato del sensore Ldr3
ldr4_value_digital = analogRead(ldr_4_est);//Legge il valore di tensione analogica sul pin del Ldr4 e lo associa alla variabile ldr4_value_digital
ldr4_value_analog = ldr4_value_digital * (5.0 / 1023);//Calcolo valore analogico normalizzato del sensore Ldr4
if ((ldr1_value_digital < ldr3_value_digital) || (ldr1_value_digital < ldr4_value_digital) || (ldr2_value_digital < ldr3_value_digital) || (ldr2_value_digital < ldr4_value_digital)) {//insieme di condizioni legate tra loro tramite OR
Serial.println("tramonto rivelata");//Stampa a schermo la stringa
myServo.write(120);//Ruota il servomotore a 120° in base al suo asse
}
if ((ldr1_value_digital > ldr3_value_digital) || (ldr1_value_digital > ldr4_value_digital) || (ldr2_value_digital > ldr3_value_digital) || (ldr2_value_digital > ldr4_value_digital)) {//insieme di condizioni legate tra loro tramite OR
Serial.println("alba rivelata");//Stampa a schermo la stringa
myServo.write(0);//Ruota il servomotore a 0° in base al suo asse
}
if ((ldr1_value_digital >= 1014) && (ldr2_value_digital >= 1014) && (ldr3_value_digital >= 1014) && (ldr4_value_digital >= 1014)) {//insieme di condizioni legate tra loro tramite AND
Serial.println("notte rilevata");//Stampa a schermo la stringa
myServo.write(0);//Ruota il servomotore a 0° in base al suo asse
}
}
void stato_manuale() {
int potenziometroValue = analogRead(potenziometroPin);//Dichiarazione variabile intera e gli assegna il valore restituito dalla funzione analogRead(), che accetta un numero di pin come argomento e legge il valore di tensione analogica su quel pin.
int posizione = map(potenziometroValue, 0, 1023, 0, 180);//Dichiarazione variabile posizione e gli viene assegnato il valore restituito dalla funzione map()
myServo.write(posizione);//Sposta il servomotore in base alla pozione specificata dalla variabile posizione
delay(100);//Interrompe l'esecuzione del programma per 0,1s, facendo ciò permettiamo al servomotore di raggiungeere la posizione desiderata prima della prossima iterazione del ciclo
}