E’ giorno o è notte? Valutiamo la luce con Arduino (parte 4)

Valutiamo la condizione Giorno/Notte
Dalle prove fatte in precedenza (parte 3), sappiamo che i count sono funzione della luminostà che interessa il nostro trasduttore, riguardando quei numeri possiamo individuare quattro valori:
1) il valore al di sotto del quale (secondo noi) si può parlare di oscurità o scarsa visibilità ambientale che chiameremo Notte
2) il valore oltre il quale si può parlare di luminosità sufficiente alla visione d’insieme sino al pieno sole che chiameremo Giorno
3) un valore empirco intermedio ai due estremi (Giorno Notte) che individui un punto nel percorso di oscuramento che chiameremo SogliaGiornoNotte
4) un valore empirico intermedio alla SogliaGiornoNotte e a Giorno che chiameremo SogliaNotteGiorno.

I valori Notte e Giorno al momento ci saranno utili solo per la fase in cui sceglieremo le soglie intermedie. Possiamo riportarli nel programma come commenti ma, al momento, non verranno uilizzati dal codice.

Perchè c’è la necessità di individuare due soglie distinte e separate?
Il motivo è semplice, se noi assumessimo un solo valore di soglia al di sopra del quale è Giorno e al di sotto è Notte, ogni volta che le condizioni di illuminamento danno luogo a valori prossimi alla soglia ma non stabili, il nostro processo continuerebbe a cambiare l’esito della valutazione ad ogni attraversamento della soglia da parte del valore letto. Questo continuo cambiamento di stato creerebbe una situazione di confusione per l’utente e per tutti i processi decisionali associati a questo parametro (in seguito utilizzeremo l’informazione relativa a Giorno/Notte per prendere delle decisioni).
Se al posto di una soglia, ne individuiamo due distinte, separate e dall’azione univoca, noi avremo che la zona compresa fra le due soglie agisce da “ammortizzatore”.
La grandezza compresa fra le due soglie (l’ammortizzatore) si chiama isteresi.
L’introduzione dell’isteresi elimina le indecisioni per tutte le variazioni della grandezza da valutare inferiori all’ampiezza dell’isteresi.
Il processo di scelta che adotta un’isteresi sull’ampiezza del segnale valutato simula il funzionamento del Trigger di Schmitt.

Fase operativa
Buttiamo giù un po di codice.

// Programma per la definizione della condizione di Giorno/Notte attraverso la lettura
  // di una fotoresistena collegata ad un ingresso analogico
 //La condizione iniziale è che sia Notte.
 // Il programma comprende il modulo per la comunicazione seriale dei valori letti.
  // Il modulo si attiva e disattiva con il flag Monitor che ammette i valori true e false
 define Monitor false
 //Ricordate che nella definizione delle costanti non va messo il segno uguale fra 
 //il nome simbolico e il valore e non va messo il punto e virgola a fine riga
 // Il valore assegnato alla costante Tp1 è 0
 //perchè io ho usato per le prove l’ingresso analogico 0 
 #define Tp1 0
 #define LEDNotte 13
 #define LEDGiorno 10
 //Associo ad una costante la velocità di comunicazione della porta seriale
 #define  VelocitaPortaSeriale 9600
 //Ritardo fra una lettura e la successiva espresso in millesimi di secondo
 #define ADCDelay 500
 int ADCCount = 0; //Creo e inizializzo la variabile di appoggio per la lettura dell’ADC
 #define SogliaGiornoNotte 100
 #define SogliaNotteGiorno 150
 byte GiornoNotte = 0;//0 = NOTTE - 1 = GIORNO
 void setup()
 {
    pinMode(LEDNotte, OUTPUT);
    digitalWrite(LEDNotte, HIGH);
    pinMode(LEDGiorno, OUTPUT);
    if (Monitor == true)
    {
      Serial.begin(VelocitaPortaSeriale);
    }
 //Per semplificare il programma ho scelto di omettere il controllo della seriale
 }
 void loop()
 {
    ADCCount = analogRead(Tp1); //leggo il Tp1 e metto il risultato in ADCCount
 if (GiornoNotte==1 & ADCCount < SogliaGiornoNotte)    {     GiornoNotte = 0;//è diventato NOTTE     digitalWrite(LEDNotte, HIGH);     digitalWrite(LEDGiorno, LOW);   } if (GiornoNotte==0 & ADCCount > SogliaNotteGiorno)
 {
      GiornoNotte = 1;
      digitalWrite(LEDNotte, LOW);
      digitalWrite(LEDGiorno, HIGH);
 }
 if(Monitor == true)
 {
      Serial.print("Lettura in COUNT ");//mando sulla seriale l'inizio della riga 
      Serial.println(ADCCount);//mando sulla seriale il valore letto e vado a capo
 }
 delay( ADCDelay);//aspetto prima di ripetere il ciclo
 } 

Aprendo il link trovate il codice compatibile e scaricabile

Leggendo il codice potete vedere come la versione presentata gestisce oltre alla valutazione a doppia soglia, la presentazione dei risultati tramite i LED installati sulla piastra.
Per il momento non considerate la parte relativa alla presentazione della quale parleremo nel punto successivo.

Approfondimenti:
a) Trigger di Schmitt cenni di teoria
b) Trigger di Schmitt nelle logiche TTL

Questa voce è stata pubblicata in Ambiente, didattica digitale, Elettronica, Informatica, laboratori, Make, MakerSpace, robotica e contrassegnata con , , , , , , , , , , . Contrassegna il permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.