Компоненты · 5 мин чтения

Фоторезистор (LDR): измеряем свет с Arduino и делаем автоматический ночник

Как работает фоторезистор (LDR)? Подключение через делитель напряжения, выбор резистора, чтение освещённости через analogRead, ночник с гистерезисом, модули LDR, ESP32, Pico и частые ошибки.

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

Фоторезистор LDR, датчик освещённости
LDR: зигзагообразный узор на поверхности — светочувствительный слой сульфида кадмия; у двух ножек нет полярности.

Как работает 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Напряжение на A0analogRead
Полная темнота1 MΩ0,05 V~10
Полутёмная комната15 kΩ2,0 V~410
Светлая комната4 kΩ3,6 V~730
Под настольной лампой1 kΩ4,5 V~930
Постоянный резистор даёт самый чувствительный результат, когда его номинал близок к сопротивлению LDR при нужном тебе уровне освещённости. Для решений в полумраке, например для ночника, лучше подходят 10–47 kΩ; чтобы различать яркий свет — около 1 kΩ. Резистор 10 kΩ из наборов — хорошая отправная точка для большинства проектов.

Чтение уровня освещённости с Arduino

C++ (Arduino IDE)
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; промежуток между ними полностью убирает мерцание.

C++ (Arduino IDE)
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}
Расположи лампу так, чтобы она не освещала LDR; если её свет возвращается на датчик, лампа сама себя выключает. Усреднение 10 измерений также сглаживает резкие скачки от промелькнувшей тени или мерцающей люминесцентной лампы.

Светодиод, который становится ярче в темноте

Вместо включения и выключения можно сделать так, чтобы светодиод постепенно разгорался по мере того, как темнеет. Функция map() превращает измеренный свет в обратно пропорциональное значение PWM: чем темнее в комнате, тем ярче светодиод, и чем светлее — тем он тусклее. Не забудь подключить светодиод к PWM-пину со знаком ~ (например, 9).

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

MicroPython
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)
Никогда не питай делитель напряжения от 5V на ESP32 или Pico. При ярком свете на аналоговом пине окажется больше 3,3 V, и он может навсегда выйти из строя.

LDR или цифровой датчик освещённости?

ПараметрLDRBH1750 (цифровой)
ВыходАналоговый (изменение сопротивления)Цифровой (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
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
139
Ночник на LDR
#12Новичок

Ночник на LDR

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

4.8(102)
205
Лазерная сигнализация
#22Средний
Premium

Лазерная сигнализация

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

4.8(64)
83
Лазерная охранная система
#23Продвинутый
Premium

Лазерная охранная система

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

4.8(60)
77
Ночник на LDR с ESP32
#112Новичок
Premium

Ночник на LDR с ESP32

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

4.6(17)
30
Измерение освещённости модулем LDR на ESP32
#113Новичок

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

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

4.6(36)
55
Умное освещение на ESP32 (PIR + LDR + реле + OLED)
#141Продвинутый
Premium

Умное освещение на ESP32 (PIR + LDR + реле + OLED)

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

4.3(6)
11
Автоматическое освещение с PIR-датчиком движения на ESP32
#121Средний
Premium

Автоматическое освещение с PIR-датчиком движения на ESP32

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

4.4(24)
38