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.

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.
| Ambiente | Resistenza approssimativa della LDR (GL5528) |
|---|---|
| Buio totale | 1 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 giorno | Qualche 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.
| Luce | Resistenza della LDR | Tensione su A0 | analogRead |
|---|---|---|---|
| Buio totale | 1 MΩ | 0,05 V | ~10 |
| Penombra | 15 kΩ | 2,0 V | ~410 |
| Stanza illuminata | 4 kΩ | 3,6 V | ~730 |
| Sotto la lampada da scrivania | 1 kΩ | 4,5 V | ~930 |
Leggere il livello di luce con Arduino
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.
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}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).
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.
| Pin | Funzione |
|---|---|
| VCC | Alimentazione (3,3–5 V) |
| GND | Massa |
| DO | Uscita digitale: soglia regolata con il trimmer |
| AO | Uscita 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:
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)LDR o sensore di luce digitale?
| Caratteristica | LDR | BH1750 (digitale) |
|---|---|---|
| Uscita | Analogica (variazione di resistenza) | Digitale (I2C), direttamente in lux |
| Precisione | Approssimativa; dipende da temperatura e modello | Precisa e calibrata |
| Velocità di risposta | Lenta (decine di millisecondi) | Veloce |
| Prezzo | Molto economica | Un po' più cara |
| Ideale per | Decidere tra buio e luce, luci notturne | Misura 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.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
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.

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.

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.

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

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.

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.

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

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
Altri articoli
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.

