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.

Video
Schema circuito

Codice sorgente
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}
47FAQ
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.
