#113Новичок

Измерение освещённости модулем LDR на ESP32

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

4.6(36)
55 собрано
Измерение освещённости модулем LDR на ESP32
Простой люксметр, который показывает яркость твоей комнаты в процентах. Датчик освещённости измеряет окружение, а ESP32 превращает это в ноль для темноты и сто для полного света и каждые полсекунды выводит результат на экран компьютера. Прежде чем собирать ночник, ты делаешь этот замер, чтобы решить, при каком уровне должна включаться лампа.

Видео

Схема

Измерение освещённости модулем LDR на ESP32 - Circuit

Исходный код

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