Фоторезистор (LDR): измеряем свет с Arduino и делаем автоматический ночник
Как работает фоторезистор (LDR)? Подключение через делитель напряжения, выбор резистора, чтение освещённости через analogRead, ночник с гистерезисом, модули LDR, ESP32, Pico и частые ошибки.
LDR (Light Dependent Resistor) — это, как следует из названия, резистор, сопротивление которого зависит от света; его ещё называют фоторезистором. В темноте его сопротивление очень большое, а чем больше света, тем оно меньше. Уличные фонари, которые включаются в сумерках, автоматические ночники и игрушки, реагирующие на свет, работают на этой простой детали. Она дешёвая, не имеет полярности и подключается к Arduino с одним резистором — идеальный старт для первого проекта со светом.

Как работает LDR?
Зигзагообразный узор на поверхности LDR — светочувствительный полупроводник, сульфид кадмия (CdS). Когда на него падает свет, фотоны освобождают в материале электроны, он лучше проводит ток, и сопротивление падает. Изменение нелинейное и относительно медленное (десятки миллисекунд). Поэтому LDR идеален для решений вроде «темно или светло?» и для грубой оценки освещённости, а не для точного измерения в люксах.
| Условия | Примерное сопротивление LDR (GL5528) |
|---|---|
| Полная темнота | 1 MΩ и больше |
| Свет ночника (~1 люкс) | 50–100 kΩ |
| Полутёмная комната (~10 люкс) | 10–20 kΩ |
| Светлая комната (~100 люкс) | 3–5 kΩ |
| Под настольной лампой (~1000 люкс) | Около 1 kΩ |
| Дневной свет | Несколько сотен Ω |
Значения зависят от модели. Чаще всего в наборах встречается GL5528; его «родственники» GL5516, GL5537 и GL5539 при том же свете показывают другое сопротивление. Значения своего LDR легко узнать, измерив его мультиметром в темноте и на свету.
Подключение к Arduino: делитель напряжения
Arduino измеряет напряжение, а не сопротивление. Поэтому LDR подключают вместе с постоянным резистором, образуя делитель напряжения: 5V → LDR → A0 → 10 kΩ → GND. Чем больше света, тем меньше сопротивление LDR и тем выше напряжение на A0. Напряжение на A0 равно V = 5 × Rпост / (RLDR + Rпост), а analogRead() превращает его в число от 0 до 1023. Чтобы попробовать разные номиналы резисторов, воспользуйся калькулятором Делитель напряжения.
| Освещение | Сопротивление LDR | Напряжение на A0 | analogRead |
|---|---|---|---|
| Полная темнота | 1 MΩ | 0,05 V | ~10 |
| Полутёмная комната | 15 kΩ | 2,0 V | ~410 |
| Светлая комната | 4 kΩ | 3,6 V | ~730 |
| Под настольной лампой | 1 kΩ | 4,5 V | ~930 |
Чтение уровня освещённости с Arduino
1const int LDR_PIN = A0;
2
3void setup() {
4 Serial.begin(9600);
5}
6
7void loop() {
8 int raw = analogRead(LDR_PIN); // 0 (karanlık) – 1023 (aydınlık) / dark – bright
9 int percent = map(raw, 0, 1023, 0, 100); // yüzde / percent
10 Serial.print("Ham / raw: ");
11 Serial.print(raw);
12 Serial.print(" Işık / light: %");
13 Serial.println(percent);
14 delay(500);
15}С помощью плоттера по последовательному соединению (Serial Plotter) в Arduino IDE можно смотреть на значение в виде живого графика. Если закрыть LDR рукой, график падает, а если посветить фонариком — растёт. Это самый простой способ найти правильный порог для проекта, когда датчик стоит там, где будет работать на самом деле.
Автоматический ночник: порог и гистерезис
Самый простой ночник работает по правилу «если значение меньше 300, включи светодиод». Но когда освещённость колеблется прямо около порога, лампа то включается, то выключается, а если её собственный свет попадает на LDR, всё ещё хуже. Решение — гистерезис, то есть два разных порога. Код ниже включает лампу, когда свет падает ниже 300, а выключает, только когда он поднимается выше 400; промежуток между ними полностью убирает мерцание.
1const int LDR_PIN = A0;
2const int LED_PIN = 9;
3const int ON_LEVEL = 300; // bunun altında yak / turn on below this
4const int OFF_LEVEL = 400; // bunun üstünde söndür / turn off above this
5
6bool lampOn = false;
7
8void setup() {
9 pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13 int light = analogRead(LDR_PIN);
14 if (!lampOn && light < ON_LEVEL) lampOn = true;
15 if (lampOn && light > OFF_LEVEL) lampOn = false;
16 digitalWrite(LED_PIN, lampOn ? HIGH : LOW);
17 delay(200);
18}Светодиод, который становится ярче в темноте
Вместо включения и выключения можно сделать так, чтобы светодиод постепенно разгорался по мере того, как темнеет. Функция map() превращает измеренный свет в обратно пропорциональное значение PWM: чем темнее в комнате, тем ярче светодиод, и чем светлее — тем он тусклее. Не забудь подключить светодиод к PWM-пину со знаком ~ (например, 9).
1void loop() {
2 int light = analogRead(A0);
3 int brightness = map(light, 100, 900, 255, 0); // karanlık → parlak / dark → bright
4 analogWrite(9, constrain(brightness, 0, 255));
5 delay(50);
6}Модули LDR: цифровой и аналоговый выходы
На готовых модулях LDR на одной плате стоят сам LDR, резистор делителя, синий подстроечный резистор для порога и компаратор LM393. Пин AO выдаёт аналоговый сигнал делителя, а пин DO — только HIGH или LOW в зависимости от порога, заданного подстроечником. На большинстве модулей DO переходит в LOW, когда светлее порога, и в HIGH, когда темнее; проверь свой модуль быстрым тестом.
| Пин | Назначение |
|---|---|
| VCC | Питание (3,3–5 V) |
| GND | Земля |
| DO | Цифровой выход: порог задаётся подстроечником |
| AO | Аналоговый выход: средняя точка делителя напряжения |
LDR с ESP32 и Raspberry Pi Pico
ESP32 и Pico работают от 3,3 V, поэтому питай делитель напряжения от пина 3V3. АЦП у ESP32 12-битный и возвращает значения от 0 до 4095. Пины ADC2 не работают, пока включён Wi-Fi, поэтому подключай LDR к одному из пинов ADC1 (GPIO 32–39). На Pico аналоговые входы — GP26, GP27 и GP28; read_u16() в MicroPython возвращает значения от 0 до 65535:
1from machine import ADC, Pin
2import time
3
4ldr = ADC(26) # GP26 (ADC0); bölücü 3V3'ten / divider fed from 3V3
5led = Pin(15, Pin.OUT)
6
7while True:
8 light = ldr.read_u16() # 0 (karanlık) – 65535 (aydınlık) / dark – bright
9 led.value(light < 20000) # karanlıkta yak / on when dark
10 print(light)
11 time.sleep(0.5)LDR или цифровой датчик освещённости?
| Параметр | LDR | BH1750 (цифровой) |
|---|---|---|
| Выход | Аналоговый (изменение сопротивления) | Цифровой (I2C), сразу в люксах |
| Точность | Грубая; зависит от температуры и модели | Точный и откалиброванный |
| Скорость отклика | Медленная (десятки миллисекунд) | Быстрая |
| Цена | Очень дешёвый | Чуть дороже |
| Лучше всего для | Решений «темно/светло», ночников | Измерения освещённости, подсветки растений, яркости экрана |
Идеи проектов с LDR
- Автоматический ночник: лампа, которая включается в темноте и благодаря гистерезису не мерцает.
- Умный свет в коридоре: объедини LDR с PIR-датчиком движения, чтобы свет загорался, только когда темно и кто-то проходит мимо.
- Панель, следящая за солнцем: поворачивай сервопривод по разнице показаний двух LDR, чтобы направить панель в самую яркую сторону.
- Лазерная охранная система: направь лазерный луч на LDR; когда луч прерывается, включай тревогу.
- Цветная фоновая подсветка: смещай цвет RGB-светодиода к тёплым оттенкам по мере того, как темнеет.
- Будильник по рассвету: включай зуммер с первыми лучами утреннего света.
Частые ошибки и как их исправить
- Значение всегда 0 или всегда 1023: нет постоянного резистора, или LDR подключён прямо между 5V и A0; собери делитель напряжения.
- Значения работают наоборот: LDR и постоянный резистор поменялись местами; если значение растёт в темноте, поменяй их местами или инвертируй сравнение в коде.
- Лампа мерцает: свет лампы попадает на LDR или используется один порог; добавь гистерезис.
- Задержка, когда темнеет: LDR переходит от света к темноте медленнее, чем от темноты к свету; задержка в несколько секунд — это нормально.
- Попытка измерить люксы: LDR — не откалиброванный датчик; для настоящих значений в люксах используй BH1750.
- Показания ломаются, когда на ESP32 включается Wi-Fi: LDR подключён к пину ADC2; перенеси его на один из пинов ADC1 между GPIO 32 и 39.
LDR — самый простой способ освоить аналоговое чтение и идею делителя напряжения, а полученные знания пригодятся со многими аналоговыми датчиками: влажности, газа, температуры. Если интересно, как работают резисторы делителя, загляни в статью Что такое резистор?; в приложении BlueGrays есть пошаговые проекты с LDR — ночник, измеритель освещённости и лазерная охрана.
Частые вопросы
Какой резистор нужен для LDR?
Чаще всего берут 10 kΩ — он хорошо подходит для большинства проектов в помещении. Для большей чувствительности в полумраке выбери 47 kΩ, а для очень яркого света — 1 kΩ. Правило такое: бери постоянный резистор, близкий к сопротивлению LDR при нужном уровне освещённости.
Есть ли у LDR плюс и минус?
Нет. У LDR, как и у обычного резистора, нет полярности; его можно ставить любой стороной. Важно правильно собрать делитель напряжения с постоянным резистором.
Может ли LDR измерять люксы?
Оценить можно, но точно не получится: отклик LDR нелинейный и меняется от модели к модели и даже с температурой. Если нужны настоящие значения в люксах, используй цифровой датчик освещённости вроде BH1750 или TSL2561.
Чем отличаются пины DO и AO на модуле LDR?
AO выдаёт аналоговое напряжение, которое меняется вместе с освещённостью, и читается через analogRead(). DO выдаёт только HIGH или LOW в зависимости от порога, заданного подстроечником модуля, и читается через digitalRead(); это удобно для задач «вкл/выкл».
Почему мой LDR медленно реагирует на темноту?
Когда свет пропадает, материалу CdS нужно несколько секунд, чтобы выйти на темновое сопротивление, а переход к свету происходит гораздо быстрее. Это естественное свойство LDR. Для задач, где нужен быстрый отклик, используют фотодиод или фототранзистор.
Почему на ESP32 значение LDR всегда 4095 или вообще не меняется?
Если делитель питается от 5V, напряжение превышает предел АЦП, и значение застревает на 4095; питай делитель от 3V3. Если значение вообще не меняется, LDR может быть на пине ADC2; ADC2 не работает при включённом Wi-Fi, поэтому используй пин ADC1 между GPIO 32 и 39.
Что собрать после прочтения
Все проекты
Измерение освещённости с LDR
Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

Ночник на LDR
Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

Лазерная сигнализация
Ты ставишь невидимую лучевую ограду, совсем как в кино. Лазер светит на датчик освещённости с другой стороны; как только кто-то проходит и прерывает луч, загорается светодиод и звучит зуммер, а когда

Лазерная охранная система
Совсем как сцены ограблений с лазерами в фильмах: лазерный луч светит на датчик освещённости, и как только кто-то входит и прерывает луч, загорается красный светодиод и начинает звучать зуммер. Сигнал

Ночник на LDR с ESP32
Ночник, в котором светодиод сам загорается в темноте и гаснет на свету. Используется пин D0 (цифровой выход) модуля датчика LDR — порог темноты задаётся маленьким потенциометром на модуле, а выход HIGH/LOW формирует сам модуль. ESP32 просто читает этот сигнал через digitalRead(), код очень простой.

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

Умное освещение на ESP32 (PIR + LDR + реле + OLED)
Сделай умное освещение для коридора, ванной или кладовки на ESP32! С PIR-датчиком движения, датчиком освещённости LDR и модулем реле собирается классический сценарий «свет включается при движении в темноте»: если вокруг уже светло, движение свет НЕ включает, и днём энергия экономится. Свет горит 30 секунд; если движение продолжается, таймер сбрасывается, и свет горит дольше. OLED SSD1306 крупно показывает состояние (ON / DAYTIME / WAITING) и обратный отсчёт.

Автоматическое освещение с PIR-датчиком движения на ESP32
В этом проекте PIR-датчик движения HC-SR501 замечает, что кто-то вошёл в комнату, и автоматически включает светодиод. Время свечения отслеживается через millis(); каждое показание HIGH обновляет время последнего движения, и светодиод гаснет не раньше чем через 10 секунд после последнего HIGH. Текущий код ещё и ждёт 50 ms на каждом цикле через delay(50), поэтому цикл не полностью неблокирующий. Подходит для освещения лестниц, шкафов и ванной.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

