Set 252012
 

In questa puntata non sperimenteremo niente di nuovo ma vediamo come riunire insieme tutti i concetti sinora visti in un progettino semplice ma che possa avere una sua utilità pratica. L’idea è quella di creare un circuito che funzioni da interruttore crepuscolare ad esempio per accendere una lampada. Usiamo perciò un ingresso analogico per valutare la luminosità ambientale e in uscita colleghiamo un relè, magari a 12V per ricalcare l’esempio precedente. Per sfruttare almeno un’uscita analogica possiamo utilizzare un LED che rifletta la luminosità misurata, ad esempio rendendolo più luminoso al buio e via via più flebile sino allo spegnimento con l’aumentare della luce. Inoltre potremmo usare un ingresso digitale per collegare un pulsante e forzare temporaneamente l’attivazione del relè anche senza raggiungere la soglia di luminosità preimpostata. Inoltre sfruttiamo l’utilizzo della porta seriale per comunicare con il PC. Nulla di nuovo quindi, si tratta solo di mettere insieme le precedenti lezioni per un progetto unico; basterà poi una sketch fatta ad ok e tutto sarà pronto. Vediamo lo schema:

Se osservate con attenzione vedrete che lo schema non è altro che la somma di quanto visto nelle precedenti lezioni, non c’è nessuna modifica se non in qualche caso l’utilizzo di uscite differenti e l’unione delle masse dei diversi “pezzi”. Non c’è nessun nuovo calcolo da fare, è sufficiente cominciare a prendere i vari componenti per metterli insieme.

Nel video a fine articolo potete vedere il circuito montato sulla breadboard. A prima vista può sembrare complesso, ma è più la confusione data dagli spezzoni di cavo che altro. Vi assicuro che partendo dallo schema qui sopra lo potete costruire in non più di 5 minuti, basta concentrarsi su uno spezzone alla volta e vedrete che è molto più facile di quanto sembri a prima vista. Anche in questo esempio ho usato il potenziometro nel partitore con il fotoresistore in modo da non creare confusione con le lezioni precedenti.

Ora non ci resta che scrivere uno sketch apposta:

int P_fotoresistenza = 0;    
int P_led = 6;      
int P_relay=4;
int P_button=12;

void setup() 
{
  pinMode(P_led, OUTPUT);  
  pinMode(P_relay, OUTPUT); 
  pinMode(P_button, INPUT);
  Serial.begin(9600);
}

void loop()
{
  int Valore = analogRead(P_fotoresistenza);        // Legge il valore da fotoresistore    
  analogWrite(P_led, 255-(1023-Valore)/4);          
  int in=digitalRead(P_button);
  if(in==HIGH)
  {
    digitalWrite(P_relay,HIGH);
    Serial.println("Hai premuto il pulsante di accensione");
    delay(5000);
  }
  if(Valore>600) 
  {
    digitalWrite(P_relay,HIGH);
    Serial.println("Ho attivato il rele");
  }
  else if(Valore<500) 
  {
    digitalWrite(P_relay,LOW);
    Serial.println("Ho spento il rele");
  }
  delay(150);                      

}

Rispetto a quanto visto nelle scorse puntate non ci sono novità. All’inizio definiamo i valori dei vari pin utilizzati sia per gli ingressi che per le uscite, con relative inizializzazioni all’interno del setup(), ove viene anche inizializzata la porta seriale. Nel loop principale viene per prima cosa letto il valore della fotoresistenza. Alla riga successiva viene settata la luminosità del led rendendolo più chiaro con ridotte quantità di luce ambientale portandolo sino allo spegnimento con l’aumento della luminosità ambientale. Dato che i valori leggibili sull’ingresso analogico sono 1024 ma i possibili valori di uscita sono solo 256, è necessaria una piccola divisione motivo per cui ho usato analogWrite(P_led, 255-(1023-Valore)/4);  In realtà l’ho scritta in questo modo nel tentativo di renderla più comprensibile, ma se fate Valore/4 ottenete lo stesso identico risultato. Successivamente viene valutato se è stato premuto il pulsante esterno ed in caso affermativo viene attivato il relè per 5 secondi. Nel video a fine articolo vedrete che non c’è l’interrutore in quanto non ne ho uno da applicare alla breadbord, motivo per cui ho messo due pin metallici che possono essere cortocircuitati con un pezzo di metallo per simulare la pressione del pulsante. Nelle istruzioni successive viene paragonato il valore di luminosità a due soglie per decidere se attivare o disattivare il relè . Vi faccio notare che le due soglie sono diverse. Perchè? Immaginate di usare il circuito in un ambiente esterno. Pensate al calar della sera con qualche nuvola di passaggio. Potrebbe accadere che la luminosità sia prossima alla soglia di attivazione del relè ma che il passaggio di qualche piccola nuvola faccia repentinamente umentare e diminuire la luminosità con la conseguenza che la luce collegata al relè si accende e spegne in continuazione. Usando due soglie diverse, invece, abbiamo una maggior stabilità, infatti una volta che il relè è attivato, non viene disattivato finchè la luminosità non scende al di sotto della soglia minima (più basssa) e viceversa. Nell’esempio le due soglie sono state prese a caso mentre nella realtà conviene annotarsi le soglie per calibrare correttamente il circuito. Volendo si potrebbero usare due potenziometri da collegare ad altrettani ingressi analogici per variare dinamicamente le due soglie e poter perciò calibrare il circuito direttamente “sul campo”. Allo stesso modo si potrebbe usare un ulteriore potenziometro per stabilire il tempo per il quale deve restare attivato il relè dopo la pressione del pulsante esterno.

Questo articolo non è stato molto lungo ed approfondito, ma era solamente una specie di riassunto di quanto visto in precedenza, giusto per amalgamare i concetti sinora visti. Dato che però non posso lasciarvi senza avervi detto nulla di nuovo, facciamo una piccola osservazione che riguarda non tanto l’elettronica, quanto l’ottimizzazione del software.

Approfondimento – dimensioni del file compilato

Ricordte che dicevo che 255-(1023-Valore)/4) equivale a Valore/4? Ovviamente equivale solo come risultato, ma la prima forma sarà più lenta perchè richiede più operazioni, inoltre occuperà più memoria sul nostro sketch. Lo sketch originale occupa 3194bytes mentre la forma Valore/4 occupa 3176 bytes con un risparmio di 18bytes, pochi in assoluto ma che possono diventare importanti nel caso di progetti complessi. Ma non basta. Se usassi lo shift-bit (lo affronteremo più avanti se non sapete come funziona), potrei usare la forma Valore>>2, ancora più veloce, che porta l’occupazione di memoria a 3100 per cui il risparmio complessivo sarebbe di 94bytes. Allo stesso modo l’else presente nel listato è tutt’altro che indispensabile ma fà risparmiare 2 bytes sullo sketch e rende l’esecuzione più veloce (parliamo di differenze ben al di sotto della percettibilità, nemmeno se fossero 1000 cambierebbe qualcosa). Tutto questo solo per dire che anche con un esempio semplice come questo è possibile ottenere discrete ottimizzazioni sul codice visto che Arduino possiede una memoria limitata con cui occorre fare i conti nel caso di progetti complessi.

Vi lascio con il consueto video che mostra il progetto di oggi in funzione. Con il prossimo articolo cominciamo a vedere qualcosa di nuovo, oltre le semplici basi.