Nei due episodi a seguire tratteremo due sensori che trovano applicazione in tantissimi ambiti della programmazione con Arduino: le fotoresistenze e i sensori ad ultrasuoni.

Le fotoresistenze    
Le fotoresistenze sono resistori fotosensibili che, per mezzo di particolari processi chimico-fisici, riescono a variare il loro valore ohmico (cioè la loro resistenza) a seconda della quantità di luce a cui sono esposti.
""""

Nello specifico hanno una resistenza inversamente proporzionale alla quantità di luce che li colpisce, quindi maggiore è la luce che il resistore rileva e minore sarà la resistenza opposta al passaggio della corrente. A causa di questa particolare caratteristica, non è possibile collegare questi componenti direttamente all’Arduino, ma è necessario far uso di un ulteriore resistore da 220Ω, posto in serie alla fotoresistenza: se infatti il sensore dovesse rilevare una quantità di luce troppo elevata, la sua resistenza diventerebbe nulla ed inevitabilmente avremmo un cortocircuito tra i 5V e il ground. Il resistore supplementare invece assicura anche in questa situazione critica la presenza di almeno un utilizzatore tra i 5V e il GND.

      
A seguito è riportato lo schema di collegamento:

""""

Attenzione!

  • Le fotoresistenze, come tutti i resistori, non hanno un particolare verso di collegamento.
  • Il pin di input analogico A3 consente ad Arduino di leggere la corrente che la fotoresistenza lascia passare nel circuito in funzione dell’esposizione luminosa.

Per testare il funzionamento delle fotoresistenze possiamo scrivere un semplicissimo programma che legga e stampi a video le letture effettuate dal sensore. Ecco il codice:

  • A3 è il pin di input analogico a cui è collegata la fotoresistenza.
  • Ricordate che i pin analogici di input non vanno dichiarati nel setup.
  • Siccome si tratta di una lettura analogica, ovviamente il valore massimo restituito dalla funzione analogRead() è 1023.

Accendendo e spegnendo la luce i valori stampati a video varieranno sensibilmente: vi stupirete del fatto che, per quanto estremamente economici, questi sensori sono piuttosto precisi.


Adesso proviamo ad utilizzare questi componenti in modo più intelligente e scriviamo un programma che accenda un led quando nella vostra stanza c’è buio e lo spenga quando c’è abbastanza luce.
Chiaramente abbiamo bisogno di fissare una soglia sotto la quale il led dovrà accendersi perché nella stanza c’è poca luce. Per fare ciò potete sfruttare le letture del programma precedente: spegnete la luce e memorizzate il valore stampato sul monitor seriale. 

Dovreste ottenere non un valore fisso, ma un intervallo di valori con una variazione di circa 5 unità: in tal caso conviene memorizzare il numero maggiore per garantire una maggiore sensibilità e precisione del programma. Ovviamente potete giocare a piacere sui valori a seconda della situazione e del risultato che volete ottenere...
Per il nostro programma supponiamo che la soglia sia 280.

 

HARDWARE

Per quanto riguarda il circuito, ovviamente basta aggiungere un diodo LED a quello precedente. Occorrente:

  • 5 jumper
  • 1 diodo LED
  • 2 resistori da 220 Ω
  • 1 fotoresistenza

""""

SOFTWARE

Il codice sarà molto intuitivo, infatti Arduino deve accendere il led se la lettura del pin A3 restituisce un valore inferiore alla soglia, altrimenti deve spegnerlo:

  • L’istruzione Serial.println(luce) non è necessaria, ma possiamo utilizzarla per verificare che il programma funzioni correttamente ed eventualmente modificare il valore di soglia.


Questo programma fa da spunto per introdurre un nuovo concetto semplice, ma utile, della programmazione: le costanti.
Come potete vedere, durante l’esecuzione del nostro programma la variabile “soglia” non cambia mai, anzi è fondamentale che non cambi poiché la sua variazione comporterebbe un malfunzionamento del progetto: vi sarete accorti che stiamo utilizzando una variabile per memorizzare una costante, cioè un valore che non cambierà mai. 
Ebbene l’IDE Arduino mette a disposizione vari modi per dichiarare una costante a seconda delle necessità, ma per ora vedremo la direttiva #define.

#define <nome> <valore>
La direttiva di preprocessore #define obbliga il compilatore a sostituire la sequenza di caratteri <nome> con <valore>.
Ad esempio se nel nostro programma non scrivessimo int soglia=280 ma #define soglia 280 allora quando, in fase di compilazione, il compilatore troverebbe la sequenza di caratteri “soglia”, automaticamente la sostituirebbe con il numero 280.

Attenzione ! 
Se “soglia” si trova in un commento, preceduto dai simboli // oppure /* */, o ad esempio in una stringa, contenuto tra doppie virgolette “ ”, ovviamente la direttiva viene ignorata.

Regole sintattiche:

  • La direttiva #define, come tutte le istruzioni precedute dal simbolo #, va scritta all’inizio del programma.
  • Non bisogna utilizzare il “punto e virgola” dopo la dichiarazione.


Per fare un esempio pratico, se il nostro codice fosse: 

dopo la compilazione (tasto Verifica) il risultato sarebbe:

#define soglia 280

int pinLed = 8;
int luce;

void setup() {
    Serial.begin(9600);
    pinMode(pinLed, OUTPUT);
}

void loop() {
    luce = analogRead(A3);
    if (luce < 280)
        digitalWrite(pinLed, HIGH);
    else
        digitalWrite(pinLed, LOW);

    Serial.println(luce); 
    delay(500);
}

Quali sono i vantaggi dell’uso di questa nuova istruzione ?

  • Facilita la fase di programmazione.
  • Rende il codice più leggibile, quindi facilmente manutenibile.
  • Consente di risparmiare memoria (si tratta di pochi bytes, ma per blocchi di codice molto corposi può risultare utile).