#113Iniciante

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.

4.6(36)
55 concluído
Leitura da intensidade da luz com módulo LDR e ESP32
Um medidor de luz simples que mostra em porcentagem a intensidade da luz no seu quarto. O sensor de luz mede o ambiente, e o ESP32 converte a leitura em zero para escuridão e cem para claridade total, exibindo o resultado na tela do computador a cada meio segundo. Antes de montar uma luz noturna, você faz essa medição para decidir em que nível de luz a lâmpada deve acender.

Vídeo

Esquema do circuito

Leitura da intensidade da luz com módulo LDR e ESP32 - Circuit

Código-fonte

Arduino (C++)
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.