Фоторезистор Arduino: подключение, делитель напряжения и ночник на LDR
Мой первый вечер с фоторезистором выглядел так: деталь воткнута между 5V и A0, монитор порта открыт, а число стоит на 1023 — в темноте 1023, под лампой 1023, под курткой всё равно 1023. Я трижды переписал скетч, передёрнул плату, переткнул датчик в соседний пин — ноль реакции. Виноват оказался не код и не деталь: делитель собран наоборот, вернее, его не было вовсе. Фоторезистор не вырабатывает напряжение, он только меняет сопротивление — от 5-50 кОм на свету до мегаома в темноте, и одному ему средней точке взять неоткуда. Зеркальный тупик встречается не реже: «всегда 0» — когда провод верхнего плеча отошёл, и АЦП читает землю через нижний резистор. Обе беды лечатся одной деталью — обычным резистором на 10 кОм.
Ниже — то, что обычно ищут перед покупкой и первым включением: схема делителя с резистором 10 кОм и два её разворота, реальные числа шкалы analogRead 0-1023 для GL5528 при разном освещении, порог день/ночь с гистерезисом 50 единиц и ночник, который не мигает в сумерках. Механику делителя с формулой и расчётом плеч разбирает базовый урок про фоторезистор и ночник — здесь же собран выбор резистора, переворот шкалы от перестановки деталей и сравнение с фотодиодом и BH1750.
Две детали: делитель напряжения из фоторезистора и 10 кОм
Схема, которая работает у всех: фоторезистор одним концом в 5V, другим — в пин A0, и резистор 10 кОм от A0 на землю. Средняя точка — сигнальная: её напряжение зависит от того, кто из пары тянет сильнее. analogRead(A0) возвращает шкалу 0-1023; на моём GL5528 при яркой лампе выходило 850-950, у окна в пасмурный день 500-600, вечером в тёмной комнате 80-150, а в шкафу — единицы. У вашего экземпляра числа уедут в другие вилки: паспорт обещает 8-20 кОм при 10 люкс и около мегаома в темноте, но разброс между партиями честно укладывается в вилку 5-50 кОм, поэтому пороги калибруют по своему датчику, а не по чужой таблице. Как вообще устроены аналоговые входы и где они на плате — в базовом уроке про analogRead.
Ток через делитель — микроскопический: 5 В, поделённые на десять килоом резистора и столько же от датчика, дают 0,25-0,5 мА, то есть пару милливатт. Поэтому делитель можно кормить прямо с цифрового пина: HIGH на D7 вместо 5V, LOW — и датчик уснул между замерами; пин Uno отдаёт до 20 мА, у делителя запас в сорок раз. Ловушка одна: нижний резистор выбрасывать нельзя. Без него средняя точка повисает в воздухе, и АЦП читает наводки от руки и проводки — те самые скачки, на которые жалуется половина форумов.
Шкала и разворот: резистор сверху или снизу
У делителя два рабочих положения, и они дают зеркальные графики. Фоторезистор сверху, к 5V, резистор снизу — на свету число растёт: светло 900, темно 50. Поменяйте детали местами — и та же схема переворачивается: светло 20, темно 1000. Оба варианта правильные, скетчи различаются ровно одним знаком сравнения. Перевёрнутая шкала — главный источник вопроса «почему датчик всегда показывает 1023»: вы ждёте рост на свету, а нижним плечом стоит резистор, и в сумерках число честно лезет к потолку. Прежде чем править код, посмотрите, какая из двух деталей у вас физически стоит к земле.
Практическая проверка занимает меньше минуты и не требует мультиметра. Откройте монитор порта и накройте датчик ладонью: число провалилось к нулю — фоторезистор в верхнем плече, свет даёт рост; число взлетело к тысяче — в нижнем, и шкала идёт наоборот. Неправильный только один ответ: число не двигается вовсе — значит, перед вами не делитель, а одиночная деталь без плеча. Запишите пару якорей для своей комнаты: моя кухня даёт 620 у окна днём и 90 при выключенном потолочном свете — от этих двух чисел и отсчитывается порог ночника.
Порог день/ночь: гистерезис 50 единиц против мигания
Порог «светло/темно» — одна строка if, и именно здесь ночники начинают кашлять. В сумерках сырые значения стоят у самой границы: у меня 247, 253, 249 при пороге 250 — младшие биты analogRead не обязаны стоять как вкопанные, и светодиод щёлкает туда-сюда по несколько раз в минуту. Лечение — гистерезис: включаю ночник, когда значение упало ниже 250, выключаю только когда светло поднялось выше 300. Зазор в 50 единиц держит режим мёртво: внутри полосы решение не качается, сколько ни дрожат биты.
- всегда 0 — обрыв верхнего плеча: провод от 5V к фоторезистору отошёл, и АЦП читает землю через нижний резистор; проверяйте перемычку, а не код
- всегда 1023 — нет нижнего резистора на GND: средняя точка повисла на питании через датчик; без второго плеча делитель не делитель
- число скачет на 30-50 единиц при ровной лампе — наводки: длинный провод работает антенной; укорачивайте шлейф, ставьте конденсатор 100 нФ у входа, усредняйте
- значение меняется от руки у провода, а не от света — сигнал висит в воздухе: датчик воткнут в другой пин или перемычка выпала из макетки
Ночник собирается за полчаса: к делителю добавляется светодиод через резистор 220 Ом на пин D3 или D9 — любой из ШИМ — и порог из предыдущего абзаца. Хотите плавность — analogWrite с map() растянет 0-1023 в 0-255, и ночник будет разгораться по мере заката, а не щёлкать: механика растяжки шкалы — в уроке про map и диммер. Дальше по нарастающей: меню из трёх режимов и память режима в EEPROM — это уже итоговый ночник раздела osnovy.
Фоторезистор, фотодиод или BH1750: что брать под задачу
Фоторезистор отвечает на один вопрос — «светло или темно», и для этого вопроса он идеален. Автоматический ночник, штора, солнечный трекер на двух LDR с перегородкой: схема трекера разобрана в разделе servo — везде нужен не уровень освещённости, а порог и разность, и копеечный LDR закрывает задачу. Честные люксы он не даст: зависимость сопротивления от света нелинейная и плавает от партии к партии. Нужны единицы — берите BH1750, он отдаёт готовые люксы по I2C: подключение и перевод сырых байтов в люксы — в отдельном уроке. А фотодиод — про скорость: LDR меняет сопротивление за 20-30 мс и не видит несущую ИК-пульта, поэтому счётные задачи на свету LDR кроет с гистерезисом, как в лазерной шторке с пересечением луча, а передача данных остаётся фотодиодам и фототранзисторам.
| Критерий | Фоторезистор (LDR) | Фотодиод | BH1750 |
|---|---|---|---|
| Что меряет | порог «светло/темно», условные единицы | факт света, ток линеен освещённости | освещённость в люксах по паспорту |
| Скорость отклика | 20-30 мс: закат ловит, пульт нет | микросекунды: годится для передачи сигнала | 16-120 мс на замер, зависит от режима |
| Линейность | нелинеен, шкала плавает между партиями | линеен, но требует усилителя или компаратора | цифровой пересчёт в люксы внутри чипа |
| Схема и код | делитель с 10 кОм плюс analogRead, три строки | обвязка: резисторы, компаратор, питание | два провода I2C, адрес 0x23, библиотека |
| Цена | десяток рублей за деталь | в разы дороже вместе с обвязкой | модуль GY-302 — от сотни рублей |
| Когда брать | ночник, штора, трекер, порог день/ночь | быстрая оптика, счёт импульсов света | метеостанция, люксметр, журналирование |
Итог для первого проекта: берите фоторезистор, резистор 10 кОм и не думайте о точности — для «светло или темно» она не нужна. Когда упрётесь в потолок и захочется логировать освещённость в настоящих единицах, возвращайтесь к таблице и уводите свет на I2C — подробный разбор BH1750 с примерами кода под рукой, а остальную коллекцию подберёте по справочнику датчиков. Экономика простая: LDR стоит копейки, и пока задача решается порогом, платить за люксы смысла нет.