Измерение освещённости модулем LDR на ESP32
Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

Видео
Схема

Исходный код
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Измерение освещённости модулем LDR на ESP32
4// ─────────────────────────────────────────
5// Читает аналоговый выход (AO) модуля LDR 12-битным АЦП и по калибровочным
6// значениям переводит его в освещённость 0-100%. Результат каждые 0,5 с
7// выводится в монитор порта (115200 бод).
8//
9// Пины:
10// GPIO 34 (классический ESP32) / GPIO 1 (ESP32-S2/S3) -> AO модуля LDR
11// Модуль LDR 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 // Классический ESP32 DevKit V1: ADC1_CH6, только вход. Здесь GPIO 1 конфликтует с Serial TX
17 const int LDR_PIN = 34;
18#endif
19
20// Калибровка: измерь в своей комнате и впиши значения сюда. На модуле LDR напряжение AO (и сырое
21// значение) ПАДАЕТ, когда свет становится ярче.
22const int RAW_DARK = 4000; // Сырое значение в темноте
23const int RAW_LIGHT = 100; // Сырое значение на свету
24
25void setup() {
26 Serial.begin(115200);
27 analogReadResolution(12); // Принудительно 12 бит
28 Serial.println("LDR Okuma / LDR Reading");
29 Serial.println("-----------------------------");
30}
31
32void loop() {
33 int raw = analogRead(LDR_PIN);
34 // Ограничить калибровочным диапазоном, темно = 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
Частые вопросы
Какие значения возвращает АЦП ESP32?
АЦП ESP32 12-битный и возвращает значения от 0 до 4095. Это отличается от диапазона 0–1023 у Arduino Uno, поэтому подстрой пороги и расчёты.
При включённом Wi-Fi аналоговые показания искажаются. Почему?
На ESP32 канал ADC2 (GPIO 0, 2, 4, 12–15, 25–27) нельзя использовать, пока включён Wi-Fi. Если подключать аналоговые датчики к пинам ADC1 (GPIO 32–39), этой проблемы нет.
Это показание — настоящее значение в люксах?
Нет, этот код не вычисляет люксы; он показывает сырое значение ADC и относительный процент освещённости по выбранным опорным значениям темноты и света. Отклик LDR нелинеен и отличается от модели к модели. Для точного измерения в люксах используют откалиброванный датчик вроде BH1750.
Почему АЦП ESP32 даёт неверные показания у краёв шкалы?
АЦП ESP32 нелинеен около 0 V и 3,3 V. Функция `analogReadMilliVolts()` возвращает откалиброванные значения; для важных измерений самый точный результат даёт работа в диапазоне 0,1–3,1 V.
