Misurare la luminosità con Arduino e una fotoresistenza

A differenza delle comuni resistenze, una fotoresistenza (o fotocella, ma anche LDR – Light Dependent Resistor) esibisce un’alta resistenza in assenza di luce (all’incirca 1 mega ohm) e una resistenza più debole che varia in base al livello di luminosità a cui viene esposta (circa 100 ohm). Responsabile di queste fluttuazioni di resistenza a seconda della quantità di luce è il materiale semiconduttore con cui viene realizzata, un particolare composto chimico depositato in superficie. Per misurarne i valori effettivi è possibile servirsi di tester digitale (al cui utilizzo dedicherò un articolo a parte).

Molteplici sono e applicazioni di un LDR, ma l’uso più comune che se ne fa, specie in progetti per principianti, è la misurazione dell’intensità luminosa in una tipica stazione meteo.

In questo articolo realizzeremo un semplice circuito che ci permetterà di leggere i valori di una fotoresistenza e di visualizzarli sul monitor seriale. Vedremo anche come calibrare il LDR con aggiustamenti successivi. Non prima però di aver chiarito la differenza tra grandezze digitali e grandezze analogiche, dato che leggeremo le fluttuazioni di resistenza della fotocella da un pin digitale di Arduino.

Grandezze digitali e grandezze analogiche

Finora abbiamo usato i pin digitali di Arduino per mandare valori alti o bassi di tensione in un circuito, tramite la funzione digitalWrite e le costanti HIGH e LOW, obbedendo in pratica alla logica acceso – spento. Quando però abbiamo dovuto gestire un led RGB, dovendo inviare diverse variazioni di rosso, verde e blu ai pedini del led, ci siamo dovuti servire della funzione analogWrite alla quale passare valori rgb compresi tra zero e 255, riuscendo così a gestire una scala più ampia rispetto ad HIGH e LOW.

L’intensità della luce, come quella dei colori rgb e come tutte le grandezze presenti in natura, è una grandezza di tipo analogico, in quanto esiste un’analogia fra le quantità fisiche effettive che rappresenta. I cambiamenti di pressione dell’aria prodotti da un suono, ad esempio, possono produrre variazioni corrispondenti nella corrente elettrica grazie alla risonanza della membrana di un microfono; queste fluttuazioni di corrente rappresentano le variazioni del suono naturale, costituendo un segnale elettrico analogico. Dato che un segnale analogico è una grandezza continua, per essere misurato da un dispositivo digitale come un computer, deve essere essere prima convertito in sequenze numeriche, in cui ogni numero rappresenta la variazione dell’intensità del segnale in un determinato istante di tempo, ciò che in gergo si definisce campionamento.

Arduino è in grado di leggere i segnali analogici di un sensore tramite i pin analogici, ben visibili sulla schedina mediante l’etichetta “Analog in”. La loro numerazione in Arduino va da 0 a 5 e ogni pin viene contrassegnato con la lettera A, cui corrisponde una costante nella libreria standard (quindi in uno sketch useremo rispettivamente le costanti A0, A1, A2, A3, A4, A5). I valori leggibili da questi pin variano da 0 a 1023.

Vediamo adesso in pratica come creare il circuito di gestione di una fotoresistenza con Arduino.

Lista dei componenti e il circuito di prova

Circuito Fotoresistenza Arduino
Circuito Fotoresistenza Arduino

Per creare il circuito ci serviranno:

  • una fotoresistenza
  • una resistenza da 1k ohm
  • una breadboard
  • tre cavetti jumper (possibilmente di colore diverso)
  • una scheda Arduino
  • un cavo usb per collegare Arduino al pc

Come si può notare nella foto, colleghiamo un piedino della fotoresistenza al pin di alimentazione a 5v di Arduino, mentre l’altro piedino del sensore è collegato in serie alla resistenza da 1k ohm e al pin digitale A0. L’altro piedino della resistenza è collegato al pin di messa a terra GND di Arduino. Approfondiremo in seguito questo tipo di circuiti in gergo definiti partitori di tensione.

Lo sketch per misurare l’intensità luminosa con Arduino e la fotoresistenza

Lo sketch è molto semplice. Vediamolo subito:

#define LDR_PIN A0

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {

  float luminosita = misuraLuminosita();

  Serial.print("Lumunosità: ");
  Serial.println(luminosita);
  delay(1000);
}

float misuraLuminosita() {
  int valore_ldr = analogRead(LDR_PIN);
  float val_ldr_convertito = map(valore_ldr, 20, 1005, 0, 100);

  return val_ldr_convertito;
}

Definiamo subito la costante LDR_PIN collegata al pin A0 e, nella funzione setup, inizializziamo come di consueto la comunicazione seriale. Nel loop inseriamo un’invocazione alla funzione misuraLuminosita (che analizzeremo tra poco), per assegnarne il valore di ritorno alla variabile luminosita, che poi stampiamo sul monitor seriale mediante Serial.println.

La funzione di conversione dei valori della fotoresistenza acquisiti dal pin A0 di Arduino

Dopo la funzione loop di Arduino, abbiamo definito la funzione misuraLuminosita che restituisce un valore di tipo float. Dopo aver letto tramite analogRead il valore in input dal pin A0, lo assegnamo a una variabile di comodo, valore_ldr, che passiamo alla funzione map della libreria standard, per convertire i valori compresi tra 0 e 1023 elaborati da Arduino a una scala percentuale da 0 a 100. Infine viene restituito il valore ottenuto al chiamante.

La funzione map, come dice lo stesso nome, ha il compito di rimappare un range di valori (in questo caso 0 – 1023) su un altro range (0 – 100). Prende in ingresso cinque parametri, il valore attuale, il valore più basso e quello più alto del range di partenza e i valori del range finale.

Calibrazione del sensore di luminosità

Potrete notare che alla funzione map ho passato i valori 20 e 1005 che ho ottenuto tramite aggiustamenti successivi. Calibrate il vostro sketch sostituendo i due parametri di range di partenza con 0 e 1023; successivamente iniziate a leggere i valori sul monitor seriale, prima senza manipolare la fotoresistenza, poi, alternativamente, coprendola completamente e illuminandola (io ho usato la torcia dello smartphone). Se il valore minimo indicante l’oscurità non arriva a zero, aggiungete alcune unità al secondo parametro di map, e toglietene al terzo se la luminosità massima non arriva a 100. In questo modo avrete un grado di precisione leggermente superiore.

Ecco i valori stampati sul mio monitor seriale durante la calibrazione:

Lumunosità: 33.00
Lumunosità: 32.00
Lumunosità: 8.00
Lumunosità: 7.00
Lumunosità: 7.00
Lumunosità: 6.00
Lumunosità: 85.00
Lumunosità: 97.00
Lumunosità: 98.00

Conclusioni

Abbiamo visto come Arduino può ricevere input analogici, qual è la differenza tra grandezze analogiche e digitali e come possiamo utilizzare i valori elaborati da Arduino per compiere misurazioni analogiche nei nostri progetti. Abbiamo creato un esempio pratico di circuito con una fotoresistenza per applicare queste nozioni alla misurazione dei livelli di luminosità con Arduino. Infine, abbiamo incapsulato il codice di lettura e conversione dei valori del LDR in una funzione potenzialmente riutilizzabile. Nei prossimi articoli faremo altrettanto con altri tipi di sensore.

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.