Сопротивление падает на свету и растёт в темноте. В делителе напряжения это превращается в число на аналоговом входе — день или ночь.
Как работает
Фоторезистор меняет сопротивление от единиц килоом на свету до мегаома в темноте. Сам по себе он не выдаёт напряжение — его ставят в делитель с постоянным резистором, и средняя точка идёт на аналоговый вход. Модуль с выводом AO уже содержит этот делитель.
analogRead() выдаёт 0–4095 на ESP32 (12 бит) и 0–1023 на Arduino (10 бит). Зависимость от освещённости нелинейная — для «день/ночь» хватает порога, для люксов нужна калибровка.
Выводы
Вывод
Назначение
AO
аналоговый выход — средняя точка делителя
DO
цифровой выход компаратора: порог задаёт подстроечный резистор на модуле
const int LDR = 34;
// Значения снимаются один раз в темноте и при полном свете.
const int DARK = 200;
const int BRIGHT = 3800;
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(LDR);
int percent = constrain(map(raw, DARK, BRIGHT, 0, 100), 0, 100);
Serial.printf("сырое %4d освещённость %3d %%\n", raw, percent);
delay(300);
}
// Ночник: темнее порога — включить, светлее — выключить.
//
// Порогов два, и это не перестраховка. С одним порогом на границе
// освещённости выход щёлкает при каждом дрожании последнего разряда:
// 499 — включили, 501 — выключили, 499 — включили. Реле в такой схеме
// живёт неделю.
//
// Гистерезис — это разные пороги на включение и на выключение. Между
// ними не происходит ничего, и попасть в эту зону дрожанием нельзя:
// она шире дрожи.
//
// Крутите ползунок освещённости на детали, чтобы это увидеть.
const int LDR = A0;
const int LED = 8;
const int DARK = 400; // темнее этого — включаем
const int LIGHT = 600; // светлее этого — выключаем
bool lit = false;
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
int level = analogRead(LDR);
if (!lit && level < DARK) {
lit = true;
Serial.println("стемнело — включаю");
} else if (lit && level > LIGHT) {
lit = false;
Serial.println("рассвело — выключаю");
}
digitalWrite(LED, lit);
Serial.print("light:");
Serial.println(level);
delay(200);
}
В железе
На ESP32 при включённом Wi-Fi не работает АЦП2 (GPIO0, 2, 4, 12–15, 25–27). Для датчиков берите АЦП1: GPIO32–39. Питание модуля от 3,3 В, а не от 5 В — иначе на вход попадёт больше 3,3 В.
Частые ошибки
Аналоговый вход ESP32 из группы АЦП2 при работающем Wi-Fi — analogRead возвращает мусор или ошибку.
Модуль от 5 В к ESP32 — на ярком свету выход близок к 5 В, это больше допустимого для входа.
Порог без гистерезиса — на границе день/ночь лампа мигает. Нужны два порога: включить ниже одного, выключить выше другого.
Датчик видит свет той лампы, которой управляет, — и выключает её. Разнесите их.