Leitura da intensidade da luz com módulo LDR e ESP32
Acompanhe em tempo real no Monitor Serial o valor bruto do ADC do módulo LDR e a porcentagem relativa de luz calculada a partir de referências de escuridão e claridade. Essa porcentagem não é uma medida em lux. O projeto ensina a lógica de calibração do módulo. É ideal fazê-lo antes do projeto 10, pois ajuda a determinar o valor do limiar.

Vídeo
Esquema do circuito

Código-fonte
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Reading Light Intensity with the ESP32 LDR Module
4// ─────────────────────────────────────────
5// Reads the analog output (AO) of the LDR module with the 12-bit ADC and
6// converts it to a 0-100 light percentage using the calibration values.
7// The result is printed to the Serial Monitor (115200 baud) every 0.5 s.
8//
9// Pins:
10// GPIO 34 (classic ESP32) / GPIO 1 (ESP32-S2/S3) -> LDR module AO
11// LDR module VCC -> 3V3, GND -> GND
12
13#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
14 const int LDR_PIN = 1; // ESP32-S2/S3: ADC1_CH0
15#else
16 // Classic ESP32 DevKit V1: ADC1_CH6, input-only. GPIO 1 clashes with Serial TX here
17 const int LDR_PIN = 34;
18#endif
19
20// Calibration: measure in your own room and enter the values here. On the LDR module the AO voltage
21// (and raw) DROPS as the light gets brighter.
22const int RAW_DARK = 4000; // Dark raw
23const int RAW_LIGHT = 100; // Light raw
24
25void setup() {
26 Serial.begin(115200);
27 analogReadResolution(12); // Force 12-bit
28 Serial.println("LDR Okuma / LDR Reading");
29 Serial.println("-----------------------------");
30}
31
32void loop() {
33 int raw = analogRead(LDR_PIN);
34 // Clip to the calibration range, dark = 0%
35 int clipped = constrain(raw, RAW_LIGHT, RAW_DARK);
36 int percent = map(clipped, RAW_DARK, RAW_LIGHT, 0, 100);
37
38 Serial.print("Raw: ");
39 Serial.print(raw);
40 Serial.print(" | Light: %");
41 Serial.println(percent);
42
43 delay(500);
44}
45
Perguntas frequentes
Quais valores o ADC do ESP32 retorna?▾
O ADC do ESP32 tem 12 bits e retorna valores de 0 a 4.095. Como essa faixa difere da faixa de 0 a 1.023 do Arduino Uno, ajuste seus limiares e cálculos de acordo.
Por que as leituras analógicas ficam distorcidas com o Wi-Fi ligado?▾
No ESP32, o canal ADC2 (GPIO 0, 2, 4, 12–15, 25–27) não pode ser usado enquanto o Wi-Fi estiver ativado. Conectar os sensores analógicos aos pinos ADC1 (GPIO 32–39) evita esse problema.
A leitura é o valor real em lux?▾
Não, este código não calcula lux; ele exibe o valor bruto do ADC e uma porcentagem relativa de luz com base nas referências escolhidas de escuridão e claridade. A resposta do LDR não é linear e varia de um modelo para outro. Para medir lux com precisão, usa-se um sensor calibrado, como o BH1750.
Por que o ADC do ESP32 mede incorretamente nos extremos?▾
O ADC do ESP32 não é linear perto de 0 V e 3,3 V. A função `analogReadMilliVolts()` retorna valores calibrados; para medições críticas, trabalhar na faixa de 0,1–3,1 V oferece os resultados mais precisos.
