#113Principiante

Lettura dell'intensità luminosa con il modulo LDR ESP32

Monitoraggio in tempo reale sul Serial Monitor del valore grezzo dell'ADC del modulo LDR e della percentuale relativa di luce calcolata dai valori di riferimento al buio e alla luce. Questa percentuale non è una misurazione 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 completato
Lettura dell'intensità luminosa con il modulo LDR ESP32
Un semplice misuratore di luce che ti mostra in percentuale quanto è illuminata la stanza. Il sensore di luce misura l'ambiente, e l'ESP32 lo trasforma in zero per il buio e cento per la piena luce, scrivendolo ogni mezzo secondo sullo schermo del tuo computer. Prima di costruire una luce notturna, con questa misura decidi a che livello deve accendersi.

Video

Schema circuito

Lettura dell'intensità luminosa con il modulo LDR ESP32 - Circuit

Codice sorgente

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Lettura dell'intensità luminosa con il modulo LDR ESP32
4// ─────────────────────────────────────────
5// Legge l'uscita analogica (AO) del modulo LDR con l'ADC a 12 bit e la
6// converte in una percentuale di luce 0-100 usando i valori di
7// calibrazione. Il risultato viene stampato sul Monitor seriale (115200
8// baud) ogni 0.5 s.
9//
10// Pin:
11//   GPIO 34 (ESP32 classico) / GPIO 1 (ESP32-S2/S3) -> AO del modulo LDR
12//   Modulo LDR: VCC -> 3V3, GND -> GND
13
14#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
15  const int LDR_PIN = 1;   // ESP32-S2/S3: ADC1_CH0
16#else
17  // ESP32 DevKit V1 classica: ADC1_CH6, solo ingresso. Qui il GPIO 1 è in conflitto con il TX
18  // seriale
19  const int LDR_PIN = 34;
20#endif
21
22// Calibrazione: misura nella tua stanza e inserisci qui i valori. Sul modulo LDR la tensione AO (e
23// il valore grezzo) SCENDE quando la luce aumenta.
24const int RAW_DARK  = 4000;  // Valore grezzo al buio
25const int RAW_LIGHT = 100;   // Valore grezzo della luce
26
27void setup() {
28  Serial.begin(115200);
29  analogReadResolution(12);  // Forzare 12 bit
30  Serial.println("LDR Okuma / LDR Reading");
31  Serial.println("-----------------------------");
32}
33
34void loop() {
35  int raw = analogRead(LDR_PIN);
36  // Limitare all'intervallo di calibrazione, buio = 0%
37  int clipped = constrain(raw, RAW_LIGHT, RAW_DARK);
38  int percent = map(clipped, RAW_DARK, RAW_LIGHT, 0, 100);
39
40  Serial.print("Raw: ");
41  Serial.print(raw);
42  Serial.print(" | Light: %");
43  Serial.println(percent);
44
45  delay(500);
46}
47

FAQ

Quali valori fornisce l'ADC dell'ESP32?▾

L'ADC dell'ESP32 è a 12 bit e restituisce valori compresi tra 0 e 4095. Poiché è diverso dall'intervallo 0–1023 dell'Arduino Uno, devi regolare le soglie e i calcoli di conseguenza.

Le letture analogiche risultano errate quando il Wi-Fi è attivo: perché?▾

Sul ESP32, il canale ADC2 (GPIO 0, 2, 4, 12–15, 25–27) non è utilizzabile quando il Wi-Fi è attivo. Collegando i sensori analogici ai pin ADC1 (GPIO 32–39) è possibile evitare questo problema.

Il valore rilevato corrisponde al valore reale in lux?▾

No, questo codice non calcola i lux; mostra il valore grezzo dell'ADC e una percentuale relativa di luce basata sui valori di riferimento scelti al buio e alla luce. La risposta dell'LDR non è lineare e varia da modello a modello. Per una misurazione precisa dei lux si utilizza un sensore calibrato, come il BH1750.

Perché l'ADC dell'ESP32 fornisce misurazioni errate ai valori estremi?▾

L'ADC dell'ESP32 non è lineare nelle zone vicine a 0 V e 3,3 V. La funzione analogReadMilliVolts() restituisce valori calibrati; per misurazioni critiche, si ottengono risultati più accurati operando nell'intervallo compreso tra 0,1 e 3,1 V.

Lettura dell'intensità luminosa con il modulo LDR ESP32 | BlueGrays