Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Raspberry: Sensore crepuscolare LDR con GPIOZero

Come gestire un sensore crepuscolare LDR con GPIOZero e Raspberry.
Come gestire un sensore crepuscolare LDR con GPIOZero e Raspberry.
Link copiato negli appunti

In questa lezione sperimenteremo la rilevazione del cambiamento di luce ambientale tramite un LDR (Light Dependent Resistor) o Foto Resistenza e l'utilizzo della libreria GPIOZero.

Foto Resistenza

Una foto resistenza (in inglese LDR) è un dispositivo che varia la sua resistenza al variare della luce incidente. In altre parole è una resistenza variabile in funzione dell'intensità luminosa che viene captata dalla stessa.
La foto resistenza è alla base del funzionamento del classico interruttore crepuscolare che si trova in commercio.

ldr_chart

Come si vede nel grafico sopra un LDR ha bassa resistenza in presenza di luce (ordine dei K Ohm) mentre in condizioni di buio assume un valore molto alto (ordine dei Mega Ohm).

Circuito

Vediamo ora i collegamenti da effettuare e introduciamo un piccolo stratagemma per utilizzare la foto resistenza.
Il nostro Raspberry ha solo ingressi digitali e non è in grado di leggere valori analogici.
Per ovviare a questo problema useremo insieme al LDR un piccolo condensatore.

circuit

Il condensatore in questione è un elettrolitico da 1 uF.
Colleghiamo il reoforo negativo del condensatore al pin di GND della scheda tramite l'uso di una breadboard.
Colleghiamo un pin del LDR a VCC (3.3 V) fornita dal Raspberry.
Ora colleghiamo il pin positivo del condensatore con il pin libero del LDR. Entrambi vanno collegati al GPIO 14 come in figura.
In questo modo abbiamo realizzato una semplice rete RC (Resistenza-Condensatore).

rc

Come si vede in figura, una volta applicata una tensione costante, il condensatore inizia a caricarsi in maniera esponenziale.
Un parametro fondamentale è la costante di tempo che equivale al prodotto della resistenza R per la capacità C.
Quindi ciò significa che fissata la capacità C (condensatore da 1 uF) il tempo di carica del condensatore sarà direttamente proporzionale al valore di resistenza R.
Ora siccome il valore di resistenza del LDR, come visto prima, è proporzionale all'intensità luminosa, possiamo concludere che il tempo di carica del condensatore è direttamente proporzionale alla quantità di luce.
Quindi, sfruttando questo concetto, la libreria GPIOZero misura il tempo di carica del condensatore riuscendo a leggere un valore analogico in maniera indiretta.
In altre parole se il tempo di carica è inferiore a una certa soglia (10 mS) allora viene rilevata la condizione di luce presente. Al contrario se la carica impiega più di 10mS allora verrà rilevata l'assenza di luce o buio.
Vediamo ora il codice di controllo.

La classe LightSensor

La foto resistenza LDR, all'interno della libreria GPIOZero, appartiene alla classe dei dispositivi di input (SmoothedInputDevice).
Il costruttore della classe ha la seguente sintassi:


LightSensor(pin=None, 
             queue_len=5, 
             charge_time_limit=0.01, 
             threshold=0.1, 
             partial=False, 
             pin_factory=None)
  • pin: è un parametro obbligatorio di tipo integer che rappresenta il numero del pin in numerazione BCM a cui è collegato il sensore LDR;
  • queue_len: è un parametro facoltativo di tipo integer che rappresenta la lunghezza della coda utilizzata per memorizzare le letture passate del sensore. Di default è impostato a 5. Nel caso in cui il sensore LDR sia instabile può essere utile aumentare il valore di questo parametro;
  • charge_time_limit: è un parametro facoltativo di tipo float. Rappresenta il tempo di carica oltre il quale viene considerata un'assenza di luce. Il valore di default 10mS (0,01 S) è appropriato per un condensatore da 1 uF. Se si usa un condensatore di capacità differente potrebbe essere necessario variare tale parametro ma a parte ciò, in genere, non è necessario modificarlo;
  • threshold: è un parametro facoltativo di tipo float che rappresenta la soglia, calcolata sulla media dei valori presenti nella coda interna, oltre la quale il sensore è considerato attivo. Normalmente non è necessario modificare questo parametro;
  • partial: è un parametro facoltativo di tipo boolean impostato per default a False. Quando è impostato a False il valore della proprietà is_active viene restituito solo nel caso in cui la coda interna sia piena (lettura bloccante). Qualora sia impostato a True la lettura è non bloccante quindi il valore is_active viene calcolato solo con i valori presenti nella coda interna senza attendere il suo riempimento;
  • pin_factory: è un parametro facoltativo per uso avanzato. Permette di specificare un GPIO pin factory differente da quello fornito da GPIOZero.

I metodi e le proprietà più importanti della classe sono i seguenti:

wait_for_dark(timeout=None) Sospende il flusso di istruzioni in esecuzione fino a quando il sensore non rileva l'assenza di luce (buio) o il timeout è scaduto.
wait_for_light(timeout=None) Sospende il flusso di istruzioni in esecuzione fino a quando il sensore non rileva la luce o il timeout è scaduto.
when_dark Funzione che viene eseguita quando il sensore rileva l'assenza di luce.
when_light Funzione che viene eseguita quando il sensore rileva la presenza di luce.

Rilevatore di Luce


from gpiozero import LightSensor

ldr = LightSensor(14)

print("Sensore LDR attivo...")
ldr.wait_for_light()
print("Luce Rilevata!!")

In questo primo esempio realizziamo un semplice rilevatore di luce.
Instanziamo la classe LightSensor specificando il GPIO 14 su cui è collegato il LDR.
Una volta attivato il sensore rimaniamo in attesa della luce invocando il metodo wait_for_light che mette in pausa lo script finché non sarà rilevata "luce" dal sensore.

Rilevatore di Buio


from gpiozero import LightSensor

ldr = LightSensor(14)

print("Sensore LDR attivo...")
ldr.wait_for_dark()
print("Buio Rilevato!!")

Questo esempio è analogo al precedente ma invochiamo il metodo wait_for_dark. Andiamo quindi ad attendere il "calar del buio" o "assenza di luce" sul sensore LDR.

Crepuscolare


from gpiozero import LightSensor
from signal import pause


def azione_buio():
    print("Buio Rilevato!!!")


def azione_luce():
    print("Luce Rilevata!!!")


ldr = LightSensor(14)

ldr.when_dark = azione_buio
ldr.when_light = azione_luce

print("Sensore LDR attivo...")
pause()

In questo esempio invece realizziamo il classico schema di funzionamento di un interruttore crepuscolare.
Tramite i metodo when_dark e when_light specifichiamo due funzioni da eseguire rispettivamente quando viene rilevato il buio e quando viene rilevata la luce.
In questo modo per esempio possiamo pilotare un relè che al calar del buio aziona una lampada per illuminare un ambiente. Viceversa al sorgere della luce chiude il relè spegnendo di fatto la lampada.

Conclusioni

In questa lezione abbiamo visto come, con un piccolo accorgimento, riusciamo a sfruttare un sensore analogico LDR per rilevare la presenza o assenza di luce.
Tramite l'uso della libreria GPIOZero abbiamo realizzato un semplice sensore di luce e di buio. Infine abbiamo implementato lo schema del classico sensore crepuscolare.

Ti consigliamo anche