Tutorial: Fotoresistenze e Arduino

Oggi ti racconto come puoi misurare l’intensità della luce con una semplice fotoresistenza, arduino ed una resistenza di 50KΩ o simile.

fotoresistenza arduino

Le fotoresistenze ( o fotoresistori ) sono resistenze composte da uno strato semiconduttore che reagisce alla radiazione luminosa, sia quest’ultima emessa dal sole o da altra fonte luminosa.

Il funzionamento di una fotoresistenza, se già non lo conosci, è semplice varia il valore da 0Ω alla sua resistenza massima 10,50,100KΩ, in base al tipo di fotoresistenza, quando passa dalla condizione di illuminazione piena a buio.

In pratica se la luce è sufficentemente forte il suo valore in ohm è 0, man mano che la luce diminuisce il suo valore aumenta fino alla resistenza massima.

Alcuni modelli, come la LDR 2-20KΩ o la LDR 20-50KΩ, dopo 10 secondi di buio arrivano a livelli di resistenza molto elevati, quasi una interruzione di continuità:

LDR 2-20 Kohm

e la LDR 20-50 Kohm:

LDR 20-50 Kohm

Wikipedia riporta (http://it.wikipedia.org/wiki/Fotoresistenza):

La fotoresistenza è un componente elettronico la cui resistenza è inversamente proporzionale alla quantità di luce che lo colpisce. Si comporta come un tradizionale resistore, ma il suo valore in ohm diminuisce mano a mano che aumenta l’intensità della luce che la colpisce. Ciò comporta che la corrente elettrica che transita attraverso tale componente è proporzionale all’intensità di una sorgente luminosa. In tale maniera si realizza una sorta dipotenziometro attuabile tramite la luce anziché tramite forze meccaniche o segnali elettrici.

Ma come puoi sfruttare tutte queste informazioni con Arduino?

Prima di tutto ti occorre realizzare un partitore di tensione:

schema del partitore di tensione

il principio di funzionamento è: due resistenze, di eguale valore, collegate come nello schema dividono in parti uguali la tensione erogata dalla batteria, nel punto B misurerai Volt/2, in questa configurazione R1 ed R2 devono essere identiche.

Passando al tuo progetto con la fotoresistenza se al posto di R1 ci metti la LDR 20-50Kohm e al posto di R2 una resistenza fissa da 50Kohm hai realizzato un partitore di tensione in cui uno dei due elementi è variabile, e varia in funzione della luce che lo irradia.

Quando la fotoresistenza è colpita dalla massima luce al punto B troverai esattamente V+ ( lavorando con arduino diremo +5v) quando ci sarà buio al punto B avrai V/2 = 5v / 2 = 2,5v.

Materiale necessario:

1 arduino Uno

1 fotoresistenza da 50Kohm ( LDR 20-50Kohm)

1 resistenza da 50Kohm

1 breadboard

3 cavetti per breadboard

Collega tutto come nello schema sopra dove al posto della resistenza R1 ci metti la fotoresistenza, al posto di R2 la resistenza fissa da 50Kohm e colleghi A al +5v di arduino, B al pin A0 ( analogic input 0 di arduino ) e il negativo alla massa di Arduino.

Il risultato non dovrebbe essere simile a questo, io non avendo la resistenza fissa da 50Kohm ho dovuto realizzarla mettendo in serie 5 resistenze da 10Kohm:

collegamento fotoresistenza

Il risultato dal punto di vista elettrico cambia pochissimo e puoi considerare valido il codice con cui testerai il tuo circuito:

lo sketch

/*
 * Autore: Mauro Alfieri
 *
 * Web: mauroalfieri.it
 * Tw:  @mauroalfieri
 */

int analogInPin = A0;
int sensorValue = 0;

void setup() {
  Serial.begin(9600);
  pinMode( analogInPin, INPUT);
}

void loop() {
  sensorValue = analogRead(analogInPin);            

  Serial.print("sensor = " );
  Serial.println(sensorValue);      

  delay(1000);
}

leggendolo linea per linea:

linea 08: imposta una variabile di tipo integer a cui assegni il pin analogico a cui hai collegato il punto B ( vedi schema sopra);

linea 09: imposta una variabile di tipo inger in cui memorizzerai il valore del sensore ad ogni loop();

linea 12: inizializza la comunicazione seriale tra Arduino e il computer a 9600 baud;

linea 13: indica ad arduino che vuoi utilizzare il pin analogInPin come INPUT, questo passaggio potresti anche evitarlo in quanto i pin analogici in Arduino Uno sono solo utilizzabili come INPUT;

linea 17: con la funzione analogRead(pin) leggi il segnale presente sul pin A0 e assegnalo alla variabile definita alla linea 09;

linea 19: scrivi sul monitor seriale la frase “sensor = “;

linea 20: scrivi sul monitor seriale il valore letto dal pin A0, la differenza tra il metodo print ed il metodo println è che quest’ultimo dopo aver scritto il contenuto sul monitor seriale invia anche un segnale di “a capo” che sposta il cursore sulla linea successiva del monitor seriale;

linea  22: attendi un secondo ( 1000 millisecondi ) prima di eseguire un nuovo loop();

Come funziona e cosa leggerai sul monitor seriale

Dopo aver uplodato lo sketch su Arduino, apri il monitor seriale e punta una fonte di luce verso la fotoresistenza, il valore che leggi è il seguente: sensor = 1023 o poco meno, questo perchè con la radiazione luminosa massima la resistenza è 0ohm e il valore convertito dall’ADC di arduino è corrispondente al +5v ossia il valore in bit massimo 1023.

Se sposti la fonte luminosa o copri la fotoresistenza in modo che percepisca il buio vedrai che il valore rilavato si abbassa fino a raggiungere circa 512, ossia 1024/2 ( vedi descrizione del partitore sopra ), ecco i valori che ho letto io:

sensor = 1023
sensor = 1018
sensor = 1007
sensor = 994
sensor = 950
sensor = 972
sensor = 938
sensor = 937
sensor = 1007
sensor = 516

Ti invito ad eseguire anche quest’altro test: lascia che il buoi sulla fotoresistenza vi resti per più di 10 secondi e dovresti osservare qualcosa di simile:

sensor = 516
sensor = 490
sensor = 458
sensor = 411
sensor = 387
sensor = 345
sensor = 298
sensor = 233
sensor = 197
sensor = 140
sensor = 103
sensor = 96

questo accade perché il valore della fotoresistenza dopo 10 secondi di buio diventa elevatissimo ( 10Mohm ) di fatto simulando quasi la completa interruzione del circuito.

Il video

non ho realizzato alcun video del progetto ma ho trovato chi ha realizzato un interruttore crepscolare, senza arduino, tu potresti provare a farne uno con Arduino.

Buona sperimentazione.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/fotoresistenze-e-arduino.html

39 comments

4 pings

Skip to comment form

    • andrea on 4 luglio 2012 at 16:06
    • Reply

    Bel tutorial come sempre, due domande:
    1 – come calcoli le resistenze necessarie? a me funziona bene con una da 2.2K mentre con 5 da 220 in serie mi ritorna sempre il valore 1023… (ho la fotoresistenza del kit arduino 70..100K LDR VT90N2)
    2 – c’è modo di calcolare il valore effettivo della luminosità basandosi su valore ritornato dal programma?

    1. Grazie Andrea,
      non ho capito la prima domanda, la resistenza di bilanciamento del partitore dovrebbe essere pari al valore massimo della foto resistenza. Non ricordo quella presente nel kit che citi cosa sia, proverò ad indagare, ma 100k mi sembra grande.

      Per la seconda domanda, certo che si può, devi solo osservare i valori letti dal convertitore ADC alle diverse luminosità da misurare.

      In questi giorni troverai un articolo anche su di un inseguitore solare che ti chiarirà meglio il discorso ADC e foto resistenza.

      Spero di aver risposto alle tue domande, se non è così aiutami a comprendere meglio il tuo progetto e darti i giusti consigli.

      Mauro

    • andrea on 5 luglio 2012 at 07:25
    • Reply

    Qui http://www.eacocon.it/wp c’è quello che ho fatto (spero non ti spiaccia la citazione altrimenti dimmelo che la tolgo), dopo aver provato il tuo circuito con le resistenze che avevo a disposizione e non riuscendo a farlo funzionare lo ho modificato come nello schema indicato… la resistenza che ho utilizzato è da 2,2k e il tutto funziona bene ma sono andato a caso e vorrei capire come calcolare quella strettamente necessaria

    PS: sto pensando di sostituire il led con una lampadina, magari piccola… se non sbaglio dovrei riuscirci semplicemente utilizzando un mosfet collegato al pin di comando di arduino…

    1. Ciao Andrea,
      per capire come si comporta un componente, la prima cosa da fare, come suggerisco nei miei articoli, è consultare il datasheet del produttore.
      All’inizio sembra aramaico antico ma poi pian piano ti verrà facile.

      Quello della tua foto resistenza è: http://www.farnell.com/datasheets/612931.pdf

      In cui il modello 90N2 ha resistenza:
      Min: 12k
      Tipica: 24k
      Max: 36k

      Trovi il suo valore a buio costante superati i 5secondi: 500k

      Io in questuo caso avrei messo una resistenza da 24k considerando che lavorerai nel range standard ( tipico ) ed ottenendo un partitore simmetrico almeno in condizioni di non completa luce.

      Se il tuo sensore rileva il buio completo per oltre 5sec la resistenza si eleva a 500k, come da datasheet.

      Spero sia più chiaro il modo in cui mi oriento, non so se sia il più corretto ma generalmente non da problemi.

      Mauro

      P.S.: grazie per la citazione, se lo ritieni opportuno puoi aggiungere i link al blog, e se vuoi partecipare presentando un tuo progetto leggi la sezione “sostienimi” per capire come fare, ogni contributo è ben accetto.

    • ivan on 13 settembre 2013 at 18:22
    • Reply

    ciao mauro
    ioho questa
    FOTORESISTENZA 2-20K – 4MM
    Fotoresistenza LDR 2-20K. Specifiche: fotoresistenza (min – max): 2-20 kohm, resistenza in assenza di luce (dopo 10 sec.): > 2 Mohm, gamma a 10-100 Lux: 0.7, potenza max dissipata: 100mW, tensione massima applicabile: 150Vdc, risposta spettrale di picco: 540nm, tempo di risposta in salita: 20ms, tempo di risposta in caduta: 30ms, temperatura di lavoro: -35

    ed ho messo una resistenza di 10K ottengo valori fino a 650 non arriva a 1023 dici che dovrei metterne una da 20K ??

    altra cosa per leggere i lux che ne dici di questo script trovato sul web?

    /* Photocell simple testing sketch.

    Connect one end of the photocell to 5V, the other end to Analog 0.
    Then connect one end of a 10K resistor from Analog 0 to ground

    For more information see http://www.ladyada.net/learn/sensors/cds.html
    Modified by M.A. de Pablo. October 18, 2009.
    Thanks to Grumpy_Mike for equations improvement.
    */

    int photocellPin0 = 0; // the cell and 10K pulldown are connected to a0
    int photocellReading0; // the analog reading from the analog resistor divider
    float Res0=10.0; // Resistance in the circuit of sensor 0 (KOhms)
    // depending of the Resistance used, you could measure better at dark or at bright conditions.
    // you could use a double circuit (using other LDR connected to analog pin 1) to have fun testing the sensors.
    // Change the value of Res0 depending of what you use in the circuit

    void setup(void) {
    // We’ll send debugging information via the Serial monitor
    Serial.begin(9600);
    }

    void loop(void) {
    photocellReading0 = analogRead(photocellPin0); // Read the analogue pin
    float Vout0=photocellReading0*0.0048828125; // calculate the voltage
    int lux0=500/(Res0*((5-Vout0)/Vout0)); // calculate the Lux
    Serial.print(“Luminosidad 0: “); // Print the measurement (in Lux units) in the screen
    Serial.print(lux0);
    Serial.print(” Lux\t”);
    Serial.print(“Voltage: “); // Print the calculated voltage returned to pin 0
    Serial.print(Vout0);
    Serial.print(” Volts\t”);
    Serial.print(“Output: “);
    Serial.print(photocellReading0); // Print the measured level at pin 0
    Serial.print(“Ligth conditions: “); // Print an approach to ligth conditions
    if (photocellReading0 < 10) {
    Serial.println(" – Dark");
    } else if (photocellReading0 < 200) {
    Serial.println(" – Dim");
    } else if (photocellReading0 < 500) {
    Serial.println(" – Light");
    } else if (photocellReading0 < 800) {
    Serial.println(" – Bright");
    } else {
    Serial.println(" – Very bright");
    }
    delay(1000);
    }

    1. Ciao Ivan,
      mio sembra di aver indicato nell’articolo come calcolare la resistenza di bilanciamento, io nel tuo caso utilizzerei una 20K.

      In merito al codice, come avrai letto in fondo ai miei articoli chiedo a tutti la cortesia di non incollare sketch nei commenti perché arrivano incomprensibili e perché non sono così bravo da riuscire a interpretarli scorrendo li a video 🙂

      Mauro

    • tobia on 15 ottobre 2013 at 23:14
    • Reply

    ciao mauro a me non riesce il circuito pur avendo collegato tutto perfettamente. Perchè?

    1. Ciao Tobia,
      cosa non funziona? Se non lo scrivi non so da dove partire per aiutarti.

      Mauro

    • Mauro on 9 febbraio 2014 at 20:21
    • Reply

    Ciao Mauro,
    Volevo sapere: Come mai è necessario fare il partitore di tensione?
    Mi spiego meglio, se noi collegassimo la nostra fotoresistenza ai 5V, a massa e ad arduino, senza mettere nessuna resistenza dopo, funziona uguale? In ogni caso il mio interrogativo era capire lo scopo della resistenza posizionata dopo la fotoresistenza.

    Ti ringrazio anticipatamente,
    Mauro

    1. Ciao Mauro,
      il partitore di tensione è utile per mantenere stabile la lettura del valore sul pin analogico al variare della luminosità.
      Puoi fare qualche test per verificare la sua efficacia.

      Mauro

    • Nicola on 17 febbraio 2014 at 20:49
    • Reply

    Salve Mauro.
    Come si possono convertire i valori restituiti da arduino, in bit, in valori di luminosità,
    tipo secondo questo grafico? http://digilander.libero.it/Brainbastard/images/LDRgraph.gif
    C’è un modo “diretto”, oltre a definire da se i vari intervalli, tipo “se il valore restituito < 10, allora buio;
    se compreso tra 11 e 200, penombra, e così via?

    1. Ciao Nicola,
      il modo più semplice è quello che hai descritto. Esistono altri modi tipo le formule matematiche di derivazione ma devi comunque ricavartele e non è detto che tu ci riesca senza if().

      Mauro

        • Nicola on 18 febbraio 2014 at 09:30
        • Reply

        grazie

    • Mario on 19 maggio 2014 at 11:58
    • Reply

    Ciao Mauro, per la maturità vorrei realizzare un’arpa laser, in pratica un raggio laser che batte su una fotoresistenza, vorrei che interrompendo il raggio, l’arduino invii il segnale al pc di riprodurre una nota musicale, ovviamente tramite un software di un sintetizzatore, sapresti dirmi quali componenti sarebbe meglio usare per me e come impostare il programma? grazie dell’attenzione.

    1. Ciao Mario,
      interessante progetto.
      Tuttavia non ho mai avuto esperienza con i laser per cui potrei darti info errate, se mi indichi il tipo di laser che desideri utilizzare, magari dal catalogo di un sito che riporta le specifiche tecniche, posso verificare cosa ti occorre per l’emissione del laser.
      Per le fotoresistenze ho scritto diversi articoli in cui sono utilizzate, leggili e comprendi il loro semplice funzionamento così potrai scrivere da solo il tuo sketch.

    • Paola on 11 settembre 2014 at 19:09
    • Reply

    Ciao Mauro,
    non so perché ma la mia fotoresistenza funziona al contrario, cioè quando aumento il buio aumenta il valore, se invece aumento la luminosità il valore diminuisce. Riesci ad aiutarmi o è andata la fotoresistenza? premetto che è nuova boh o.O

    1. Ciao Paola,
      stai misurando gli ohm con un tester o stai utilizzando lo sketch arduino proposto in questo articolo?

        • Paola on 12 settembre 2014 at 12:39
        • Reply

        Ciao Mauro,
        uso lo sketch di questo articolo,
        grazie mille per la risposta e scusa il disturbo

          • Paola on 12 settembre 2014 at 13:00
          • Reply

          LOL scusa Mauro ho risolto, probabilmente ieri ho sbagliato i collegamenti e andava al contrario, l ho appena rifatto e va. Scusa ancora non sono pratica con tutti questi concetti nuovi, devo aver invertito i fili.

          1. Ottimo Paola,
            sono contento tu sia riuscita da sola.
            Ti stavo giusto per suggerire di invertire il collegamento ai poli +5v e Gnd della foto resistenza, se ti interessa comprendere come mai accade ti consiglio di leggere gli articoli sulle resistenze di pull-up e pull-down.

    • Angelo on 24 ottobre 2015 at 22:59
    • Reply

    Ciao Mauro,

    Mi sto avvicinando al mondo di Arduino, in quanto vorrei realizzare un misuratore di potenza solare al fine di confrontarla con l’andamento della produzione di energia elettrica del mio impianto fotovoltaico.

    Hai qualche soluzione mia propormi da realizzare con ARDUINO ?

    Tieni conto che vorrei posizionare questo rilevatore accanto ai pannelli fotovoltaici, come potrei alimentare ARDUINO?

    Grazie in anticipo. Angelo.

    1. Ciao Angelo,
      non sono sicuro di aver chiaro cosa tu abbia intenzione di realizzare.
      Per l’alimentazione non puoi utilizzare il pannello solare stesso ?

    • Angelo on 26 ottobre 2015 at 23:00
    • Reply

    Cercherò di utilizzare la dc dai pannelli per alimentare ARDUINO.

    se non ricordo male, ogni pannello dispone di circa 28 Vdc di picco.

    Vorrei impiegare un foto resistenza che sia sensibile a tutto lo spettro di funzionamento delle cellule fotovoltaiche, per correlare l’andamento della potenza solare con la produzione dei pannelli.

    Grazie. Angelo.

    1. Ciao Angelo,
      interponi un regolatore in modo che in caso di 28v ad arduino non arrivino più di 12/14v eviterai di danneggiarlo.

    • luca on 14 gennaio 2016 at 10:55
    • Reply

    Ciao,
    Io ho usato una resistenza da 10kohm e poi il peogramma lo scritto come quello che hai fatto tu soltanto che alla luce normale mi da 1023 la copro no cambia poi se uso il flash del telefono si abbassa a 600 700

    1. Ciao Luca,
      qual’è il tuo dubbio ?

    • Giuseppe on 13 maggio 2016 at 17:06
    • Reply

    CiaO vorrei sapere se con la fotoresistenza è possibile comandare tramite un pulsante il servomotorè…

    1. Ciao Giuseppe,
      non ho compreso cosa tu voglia fare.

    • riccardo on 28 settembre 2016 at 13:22
    • Reply

    Ciao sono Riccardo,compliemti per il blog!
    una domanda; volendo triggerare il valore letto in modo da poter evitare una commutazione immediata dell’uscita cosa dovrei usare?un delay oppure un millis??in che modo? sono neofita….non saprei!grazie

    1. Ciao Riccardo,
      intendi inserire un ritardo ( delay ) o una verifica di tempo trascorso ( millis ) o un isteresi?

    • Max on 19 ottobre 2016 at 09:49
    • Reply

    Salve, innanzitutto ti dico grazie per i tuoi articoli e complimenti: io sono totalmente te a digiuno di elettronica e conosco un minimo (insufficiente) di programmazione, ma i tuoi post sono chiari e comprensibili (ovviamente a volte devo approfondire, ma è normale).
    Premessa la mia totale ignoranza in materia, avendo letto una tua risposta ad una precedente domanda sull’argomento, vorrei farti questa domanda abbastanza sciocca. Hai detto che il partiture di tensione è necessario per stabilizzare la corrente. Ciò che mi domando è: perché è instabile? Arduino non eroga con continuità (linearità, direi.. ma immagino che il termine in elettronica voglia dire altro) la corrente?
    Perdona la domanda. Nei prossimi tempi ne farò sicuramente altre dello stesso imbarazzante livello.
    Promettendo di approfondire e studiare per conto mio..
    ti ringrazio in anticipo.

    1. Ciao Max,
      la risposta necessiterebbe di lunghe spiegazioni elettroniche partendo dalla differenza tra tensione e corrente che mi sembra ti sia confusa.
      Per cercare di risponderti considera che la fotoresistenza è un sensore e che come tale il valore, per arduino, è un input e non viceversa per cui non dipende da arduino o genuino la generazione di una tensione continua ( che significa tutt’altro rispetto a quello che volevi scrivere ) bensì dalla presenza o meno di un riferimento a massa ( pull-down ) o a positivo ( pull-up ) del pin analogico su cui esegui la lettura.

    • marco on 26 novembre 2016 at 16:29
    • Reply

    buonasera sonoalle prime armi sto realizzando un interruttore crepuscolare con arduino ma quando carico il listato ma fa la reazione opposta posto il listato

    [ codice rimosso in automatico ]

    gra marco

    1. Ciao Marco,
      innanzitutto ti chiedo di rispettare le regole scritte in fondo ad ogni articolo, il tuo codice è stato rimosso in automatico.
      Da come descrivi il problema hai solo invertito il controllo rispetto alla soglia, avrai messo < e ci voleva un > puoi cmq vedere i valori letti dalla fotoresistenza con il monitor seriale e regolarti di conseguenza.

    • marco on 26 novembre 2016 at 17:13
    • Reply

    buonasera scusa della mia poca esperienza e non ho notato del listato ho modificato e ora va tutto ok grazie

    1. Bene

    • roberto on 24 luglio 2018 at 19:46
    • Reply

    non ho ancora arduino ma a breve entrerò in famiglia, mi piacerebbe che il mio arduino indicasse su display la quota rilevata tramite il codice gray di un encoder altimetrico e magari con un beep ogni cambio di quota. Il codice gray altimetrico ha 12 bit per indicare da -2000feet a +100000 feet. se già avete soluzioni del genere…….

    1. Ciao Roberto,
      trovi diversi articoli dedicati agli encoder su questo blog e sulla lettura del codice gray.
      Il commento non è inerente all’articolo, in futuro ti chiedo di rispettare le regole del blog e di inserire i commenti agli articoli corretti.

  1. Grazie per la citazione dell’articolo.
    Sul blog ci sono anche altri tutorial di vostro interesse, il mio consiglio è di non copiare in pieno il testo ma di aggiungere delle vostre impressioni in modo che gli utenti del vostro sito ottengano un valore aggiunto.

    Ovviamente potete prendere dal blog tutto il materiale di vostro interesse e se volete suggerirmi dei tutorial che possono aiutare i vostri progetti sono disponibile a scriverli e pubblicarli su vostre indicazioni.

    Mauro

  1. […] A5: fotoresistenza, lo schema mostra la scelta di utilizzarla come primo elemento di un partitore resistivo, se vuoi saperne di più leggi il mio articolo: Tutorial: Fotoresistenze e Arduino; […]

  2. […] ecc… ) un uso del partitore di resistenze con le fotoresistenze lo hai visto in questo articolo in cui il circuito è composto da R1 fisso ed R2 la fotoresistenza o più in generale la […]

  3. […] (da http://www.mauroalfieri.it/elettronica/fotoresistenze-e-arduino.html) […]

  4. […] uguale a quello massimo della fotoresistenza. Poi collegate la resistenza a GND. Vi rimando a questo schema da cui io stesso ho […]

Lascia un commento

Your email address will not be published.

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