Componenti · 6 min di lettura

Cos'è un sensore di luce LDR? Misurare la luce con Arduino e luce notturna automatica

Come funziona una LDR (fotoresistenza)? Collegamento a partitore di tensione, scelta della resistenza, lettura della luce con analogRead, luce notturna con isteresi, modulo LDR, ESP32 e Pico ed errori comuni.

Una LDR (Light Dependent Resistor) è, come dice il nome, una resistenza il cui valore cambia con la luce; si chiama anche fotoresistenza o fotocellula. Al buio la sua resistenza è molto alta, e più luce c'è più scende. I lampioni che si accendono al tramonto, le luci notturne automatiche e i giocattoli che reagiscono alla luce funzionano con questo semplice componente. È economica, non ha polarità e si collega ad Arduino con una sola resistenza: un ottimo inizio per il tuo primo progetto con la luce.

Fotoresistenza LDR sensore di luce
LDR: il disegno a zig-zag sulla superficie è uno strato di solfuro di cadmio sensibile alla luce; i due piedini non hanno polarità.

Come funziona una LDR?

Lo zig-zag sulla superficie della LDR è un semiconduttore sensibile alla luce, il solfuro di cadmio (CdS). Quando la luce lo colpisce, i fotoni liberano elettroni nel materiale, che conduce meglio, e la resistenza scende. La variazione non è lineare ed è piuttosto lenta (decine di millisecondi). Per questo una LDR non serve a misurare la luce con precisione in lux, ma è ideale per decisioni del tipo "è buio o è chiaro?" e per livelli di luce approssimativi.

AmbienteResistenza approssimativa della LDR (GL5528)
Buio totale1 MΩ e oltre
Luce di una lucina notturna (~1 lux)50–100 kΩ
Stanza in penombra (~10 lux)10–20 kΩ
Stanza illuminata (~100 lux)3–5 kΩ
Sotto una lampada da scrivania (~1000 lux)Circa 1 kΩ
Luce del giornoQualche centinaio di Ω

I valori cambiano a seconda del modello. La più comune nei kit è la GL5528; le sorelle GL5516, GL5537 e GL5539 hanno resistenze diverse con la stessa luce. Puoi scoprire facilmente i valori della tua LDR misurandola con un multimetro al buio e alla luce.

Collegarla ad Arduino: il partitore di tensione

Arduino misura la tensione, non la resistenza. Per questo la LDR si collega insieme a una resistenza fissa formando un partitore di tensione: 5V → LDR → A0 → 10 kΩ → GND. Quando la luce aumenta, la resistenza della LDR scende e la tensione su A0 sale. La tensione su A0 si calcola con V = 5 × Rfissa / (RLDR + Rfissa), e analogRead() la trasforma in un numero da 0 a 1023. Per provare valori diversi usa il calcolatore Partitore di tensione.

LuceResistenza della LDRTensione su A0analogRead
Buio totale1 MΩ0,05 V~10
Penombra15 kΩ2,0 V~410
Stanza illuminata4 kΩ3,6 V~730
Sotto la lampada da scrivania1 kΩ4,5 V~930
La resistenza fissa dà il risultato più sensibile quando è vicina alla resistenza della LDR al livello di luce che ti interessa. Per decisioni in penombra, come una luce notturna, vanno meglio 10–47 kΩ; per distinguere luci forti, circa 1 kΩ. La 10 kΩ dei kit è un buon punto di partenza per la maggior parte dei progetti.

Leggere il livello di luce con Arduino

Arduino (C++)
1const int LDR_PIN = A0;
2
3void setup() {
4  Serial.begin(9600);
5}
6
7void loop() {
8  int raw = analogRead(LDR_PIN);            // 0 (karanlık) – 1023 (aydınlık) / dark – bright
9  int percent = map(raw, 0, 1023, 0, 100);  // yüzde / percent
10  Serial.print("Ham / raw: ");
11  Serial.print(raw);
12  Serial.print("  Işık / light: %");
13  Serial.println(percent);
14  delay(500);
15}

Con il Plotter seriale dell'Arduino IDE puoi seguire il valore come un grafico in tempo reale. Se copri la LDR con la mano la curva scende, se la illumini con una torcia sale. È il modo più semplice per trovare la soglia giusta per il tuo progetto, con il sensore nel punto in cui resterà davvero.

Luce notturna automatica: soglia e isteresi

La luce notturna più semplice dice "se il valore è sotto 300, accendi il LED". Ma quando la luce è proprio intorno alla soglia, la lampada continua ad accendersi e spegnersi, e va ancora peggio se la sua stessa luce arriva alla LDR. La soluzione è l'isteresi: usare due soglie diverse. Il codice qui sotto accende la lampada quando la luce scende sotto 300, ma la spegne solo quando sale sopra 400; lo spazio tra le due elimina del tutto lo sfarfallio.

Arduino (C++)
1const int LDR_PIN = A0;
2const int LED_PIN = 9;
3const int ON_LEVEL = 300;    // bunun altında yak / turn on below this
4const int OFF_LEVEL = 400;   // bunun üstünde söndür / turn off above this
5
6bool lampOn = false;
7
8void setup() {
9  pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13  int light = analogRead(LDR_PIN);
14  if (!lampOn && light < ON_LEVEL) lampOn = true;
15  if (lampOn && light > OFF_LEVEL) lampOn = false;
16  digitalWrite(LED_PIN, lampOn ? HIGH : LOW);
17  delay(200);
18}
Posiziona la lampada in modo che non illumini la LDR; se la sua luce torna sul sensore, la lampada si spegne da sola. Fare la media di 10 letture, inoltre, attenua i salti improvvisi dovuti a un'ombra di passaggio o allo sfarfallio di una lampada fluorescente.

Un LED che brilla di più al buio

Invece di accendere e spegnere, puoi far illuminare il LED gradualmente man mano che la luce cala. La funzione map() trasforma la luce misurata in un valore PWM inversamente proporzionale: più la stanza è buia, più il LED brilla, e viceversa. Ricordati di collegare il LED a un pin PWM contrassegnato con ~ (per esempio il 9).

Arduino (C++)
1void loop() {
2  int light = analogRead(A0);
3  int brightness = map(light, 100, 900, 255, 0);  // karanlık → parlak / dark → bright
4  analogWrite(9, constrain(brightness, 0, 255));
5  delay(50);
6}

Modulo LDR: uscita digitale e analogica

I moduli LDR già pronti hanno sulla stessa scheda la LDR, la resistenza del partitore, un trimmer blu per la soglia e un comparatore LM393. Il pin AO fornisce l'uscita analogica del partitore, mentre il pin DO dà solo HIGH o LOW in base alla soglia regolata con il trimmer. Sulla maggior parte dei moduli DO è LOW quando c'è più luce della soglia e HIGH quando ce n'è meno; verificalo sul tuo modulo con una prova veloce.

PinFunzione
VCCAlimentazione (3,3–5 V)
GNDMassa
DOUscita digitale: soglia regolata con il trimmer
AOUscita analogica: punto centrale del partitore

LDR con ESP32 e Raspberry Pi Pico

ESP32 e Pico funzionano a 3,3 V, quindi alimenta il partitore dal pin 3V3. L'ADC dell'ESP32 è a 12 bit e restituisce valori da 0 a 4095. Poiché i pin ADC2 non funzionano con il Wi-Fi attivo, collega la LDR a uno dei pin ADC1 (GPIO 32–39). Sul Pico gli ingressi analogici sono GP26, GP27 e GP28; read_u16() di MicroPython restituisce valori da 0 a 65535:

MicroPython
1from machine import ADC, Pin
2import time
3
4ldr = ADC(26)                  # GP26 (ADC0); bölücü 3V3'ten / divider fed from 3V3
5led = Pin(15, Pin.OUT)
6
7while True:
8    light = ldr.read_u16()     # 0 (karanlık) – 65535 (aydınlık) / dark – bright
9    led.value(light < 20000)   # karanlıkta yak / on when dark
10    print(light)
11    time.sleep(0.5)
Non alimentare mai il partitore a 5V su un ESP32 o un Pico. Con molta luce il pin analogico riceverebbe più di 3,3 V e potrebbe danneggiarsi in modo permanente.

LDR o sensore di luce digitale?

CaratteristicaLDRBH1750 (digitale)
UscitaAnalogica (variazione di resistenza)Digitale (I2C), direttamente in lux
PrecisioneApprossimativa; dipende da temperatura e modelloPrecisa e calibrata
Velocità di rispostaLenta (decine di millisecondi)Veloce
PrezzoMolto economicaUn po' più cara
Ideale perDecidere tra buio e luce, luci notturneMisura della luce, illuminazione delle piante, luminosità dello schermo

Idee di progetti con la LDR

  • Luce notturna automatica: una lampada che si accende al buio e non sfarfalla grazie all'isteresi.
  • Luce del corridoio intelligente: abbina la LDR a un sensore di movimento PIR perché si accenda solo quando è buio e passa qualcuno.
  • Pannello che segue il sole: fai ruotare un servo in base alla differenza tra due LDR per orientare un pannello verso il lato più luminoso.
  • Sistema di sicurezza laser: punta un raggio laser su una LDR; quando il raggio si interrompe, scatta l'allarme.
  • Luce d'atmosfera colorata: sposta un LED RGB verso toni caldi quando fa buio.
  • Sveglia all'alba: fai suonare un buzzer alle prime luci del mattino.

Errori comuni e come risolverli

  • Il valore è sempre 0 o sempre 1023: manca la resistenza fissa, oppure la LDR è collegata direttamente tra 5V e A0; costruisci il partitore.
  • I valori funzionano al contrario: LDR e resistenza fissa sono scambiate; se il valore sale al buio, invertile o inverti il confronto nel codice.
  • La lampada sfarfalla: la sua luce arriva alla LDR, oppure c'è una sola soglia; aggiungi l'isteresi.
  • Ritardo quando fa buio: una LDR torna dal chiaro al buio più lentamente che al contrario; qualche secondo di ritardo è normale.
  • Voler misurare i lux: una LDR non è un sensore calibrato; per valori reali in lux usa un BH1750.
  • Sull'ESP32 le letture saltano quando parte il Wi-Fi: la LDR è su un pin ADC2; spostala su un pin ADC1 tra GPIO 32 e 39.

La LDR è il modo più semplice per imparare la lettura analogica e il principio del partitore di tensione, e ciò che impari qui ti servirà con molti sensori analogici di umidità, gas o temperatura. Se ti incuriosisce come funzionano le resistenze del partitore, leggi Cos'è una resistenza?; nell'app BlueGrays trovi progetti di luce notturna con LDR, misura dell'intensità luminosa e sicurezza laser, passo passo.

Domande frequenti

Che resistenza si usa con una LDR?

La scelta più comune è 10 kΩ, che va bene per la maggior parte dei progetti al chiuso. Per più sensibilità con poca luce scegli 47 kΩ, per ambienti molto luminosi 1 kΩ. Come regola, scegli una resistenza fissa vicina a quella della LDR al livello di luce che ti interessa.

La LDR ha un positivo e un negativo?

No. La LDR non ha polarità, proprio come una resistenza normale; puoi montarla in qualsiasi verso. L'importante è costruire correttamente il partitore con la resistenza fissa.

Si possono misurare i lux con una LDR?

Si possono stimare, ma non con precisione: la sua risposta non è lineare e cambia da modello a modello e persino con la temperatura. Se ti servono valori reali in lux, usa un sensore di luce digitale come il BH1750 o il TSL2561.

Che differenza c'è tra i pin DO e AO di un modulo LDR?

AO fornisce una tensione analogica che varia con l'intensità della luce e si legge con analogRead(). DO dà solo HIGH o LOW in base alla soglia impostata con il trimmer del modulo e si legge con digitalRead(); è comodo per accendere e spegnere.

Perché la mia LDR reagisce lentamente al buio?

Quando la luce sparisce, il CdS impiega qualche secondo a raggiungere la sua resistenza al buio, mentre il passaggio alla luce è molto più rapido. È una caratteristica naturale delle LDR. Per risposte rapide si usano fotodiodi o fototransistor.

Perché sull'ESP32 la mia LDR segna sempre 4095 o non cambia mai?

Se il partitore è alimentato a 5V, la tensione supera il limite dell'ADC e il valore resta fermo a 4095; alimentalo dal 3V3. Se non cambia mai, la LDR potrebbe essere su un pin ADC2; l'ADC2 non funziona con il Wi-Fi attivo, quindi usa un pin ADC1 tra GPIO 32 e 39.

Vedi tutti i progetti
Intensità della luce di lettura con Ldr
#11Principiante

Intensità della luce di lettura con Ldr

Progetto che misura l'intensità della luce ambientale con un sensore LDR e la visualizza su un monitor seriale. Insegna le basi della lettura dei sensori analogici e della comunicazione seriale.

4.6(78)
119
Lampada da notte con Ldr
#12Principiante

Lampada da notte con Ldr

Progetto di luce notturna basata su LDR che accende automaticamente il LED quando l'ambiente si oscura. Insegna la logica di controllo automatico con il confronto dei valori di soglia analogici.

4.8(99)
153
Sistema di allarme laser
#22Intermedio
Premium

Sistema di allarme laser

Progetto di sicurezza che rileva l'interruzione del raggio laser tramite LDR e avvisa con un cicalino e un LED. Insegna la logica del rilevamento dell'interruzione della luce con la coppia laser-LDR.

4.8(64)
82
Sistema di sicurezza laser
#23Avanzato
Premium

Sistema di sicurezza laser

Sistema di sicurezza avanzato che attiva l'allarme quando il raggio laser viene interrotto e può essere ripristinato tramite pulsante o controllo IR. Insegna la gestione di più sorgenti di ingresso e

4.8(60)
77
ESP32 Luce notturna con LDR
#112Principiante
Premium

ESP32 Luce notturna con LDR

Luce notturna in cui il LED si accende automaticamente al buio e si spegne alla luce. Viene utilizzato il pin D0 (digital out) del modulo sensore LDR - la soglia di buio viene impostata con il piccolo potenziometro sul modulo, il modulo stesso genera l'uscita HIGH/LOW. ESP32 legge questo segnale con digitalRead(), il codice è molto semplice.

4.6(17)
30
Lettura dell'intensità luminosa con il modulo LDR ESP32
#113Principiante

Lettura dell'intensità luminosa con il modulo LDR ESP32

Monitoraggio in tempo reale sul Serial Monitor del valore di luce misurato dal modulo LDR + valore approssimativo in lux. Spiega il principio di calibrazione del modulo. È consigliabile eseguirlo prima del Progetto 10, poiché serve a determinare il valore di soglia.

4.6(36)
55
Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)
#141Avanzato
Premium

Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)

Trasforma il tuo corridoio, bagno o dispensa in illuminazione intelligente con ESP32! Utilizzando un sensore di movimento PIR, un sensore di luce LDR e un modulo relè, costruiamo lo scenario classico "la luce si accende quando viene rilevato movimento al buio" — se l'ambiente è già luminoso, il movimento NON attiva la luce, risparmiando energia durante il giorno. La luce rimane accesa per 30 secondi; se il movimento continua, il timer si azzera e la luce rimane accesa più a lungo. Il display OLE

4.3(6)
11
Illuminazione automatica con sensore di movimento PIR ESP32
#121Intermedio
Premium

Illuminazione automatica con sensore di movimento PIR ESP32

In questo progetto, utilizzeremo il sensore di movimento PIR HC-SR501 per rilevare la presenza di una persona che entra nella stanza e accendere automaticamente il LED. Quando viene rilevato un movimento, il LED rimarrà acceso per un determinato periodo di tempo e gestiremo il tempo tramite la funzione `millis()` e un contatore, senza ricorrere alla funzione `delay()`. In questo modo otterremo un sistema di illuminazione con sensore di movimento che non blocca l'ESP32, consentendogli di svolgere

4.4(24)
38

Impara come una LDR cambia la sua resistenza con la luce, come collegarla ad Arduino con un partitore di tensione, scegliere la resistenza giusta e costruire una luce notturna automatica che non sfarfalla.

Cos'è un sensore di luce LDR? Misurare la luce con Arduino e luce notturna automatica | BlueGrays