Часы на кухонной полке жили с подсветкой на полную: днём её не видно из-за солнца, а вечером, когда на кухне гас верхний свет, экран выжигал сетчатку с трёх метров. Ручной диммер я собрал за полчаса и неделю с ним прожил, крутя ручку по четыре раза в день — пока не понял, что решать, день сейчас или ночь, должен сам прибор. Фоторезистор за сорок рублей на входе, транзистор на подсветке — и экран сам притемняется, когда в кухне темнеет, и разгорается утром. Классическая боль вечерней кухни, и лечится она за вечер.
Соседние сюжеты разграничу сразу, чтобы вы не читали одно и то же дважды. Диммер и уровни день/ночь как идея, экономика тока подсветки — в уроке про экономную подсветку; гашение экрана при простое — в уроке про сон подсветки; питание самой панели от пина — в уроке про питание от пина; контраст, который плывёт от температуры, — в уроке про светостойкость. Здесь — силовая часть и логика: делитель с LDR, транзистор в катоде подсветки, ШИМ и два порога с гистерезисом, чтобы подсветка не щёлкала в сумерках.
План такой: схема делителя и почему транзистор честнее прямого привода с пина, скетч с плавным переходом, пороги и их калибровка. В симуляторе подсветку LCD движок не диммирует, поэтому её изображает светодиод макетки — логика порогов и плавности при этом настоящая, из скетча урока.
Почему я колдую именно с подсветкой, а не с контрастом? Контраст определяет, насколько тёмные буквы относительно фона, и при тусклой подсветке экран по-прежнему читается: столбики цифр остаются, просто светятся слабее. Поднять читаемость контрастом при слепящей подсветке нельзя — лишний свет даёт именно анод. Плюс экономика: подсветка — главный потребитель панели, 20-25 из тех 30-35 миллиампер, что ест весь модуль; логике и контроллеру достаются единицы. Управляешь анодом — управляешь всем бюджетом прибора сразу, и никакая другая ручка такого рычага не даёт.
Схема: делитель и транзистор в катоде
Датчик света — фоторезистор в делителе: LDR между 5 В и точкой замера, резистор 10 кОм от точки на землю, точка — на A1. Светло — сопротивление LDR падает, число на A1 растёт: у меня день в кухне читается 700-900, сумерки 300-400, ночью 100 и ниже. Партии LDR гуляют на треть в обе стороны, поэтому цифры именно ориентиры, а не паспорт; сама схема делителя с расчётом плеч разобрана в уроке про фоторезисторный ночник. Хотите инвертированную логику — поменяйте плечи местами, но честнее держать схему стандартной и инвертировать в коде: схема на бумаге, инверсия — одна строка.
Теперь силовая часть. Подсветка 16x2 — светодиодная планка: анод A (пин 15 разъёма), катод K (пин 16), паспортный ток 20-30 мА при 3-4,2 В; на большинстве модулей токоограничивающий резистор уже стоит на плате. Пин Uno тянет максимум 40 мА абсолютного потолка при рекомендованных двадцати — прямой привод подсветки с пина идёт по грани, и я от него отказался после первой же макетки с греющейся ножкой. Честный путь — NPN-транзистор низкой стороной: катод подсветки к коллектору 2N2222, эмиттер на землю, база через резистор 1 кОм к ШИМ-пину. Ток подсветки через пин не идёт — от пина уходит только миллиамп базы, а ключом командует ШИМ. Ключевая механика NPN по шагам — в уроке про транзисторный ключ.
Пин для базы выбирайте из ШИМ-набора: на Uno это 3, 5, 6, 9, 10, 11 — вся тема заполнений разобрана в уроке про ШИМ. У меня стоит D9, и это не случайность: 980 Гц частоты этого пина глаз воспринимает ровно, без заметного мерцания, тогда как 490 Гц пинов 3, 5, 6 на нижних заполнениях иногда дают лёгкий строб по краям зрения. Разница на бумаге в два раза, на глаз — между «экран просто тусклый» и «экран подмигивает».
#include <Wire.h>#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);const int ldrPin = A1; // делитель: LDR к 5V, 10 кОм к GNDconst int pinPodsvet = 9; // ШИМ-пин в базу через 1 кОм const int POROG_NOC = 250; // ниже - ночьconst int POROG_DEN = 450; // выше - деньconst int YARK_NOC = 60; // ночная яркость из 255const int YARK_DEN = 255; // дневная int tekuschaya = YARK_DEN; // текущее заполнение ШИМint rezhim = 1; // 0 - ночь, 1 - деньunsigned long last = 0; void setup() { pinMode(pinPodsvet, OUTPUT); lcd.init(); lcd.backlight(); analogWrite(pinPodsvet, tekuschaya);} void loop() { if (millis() - last < 25) return; last = millis(); int svet = analogRead(ldrPin); // два порога с гистерезисом: между ними режим держится if (svet < POROG_NOC && rezhim == 1) rezhim = 0; if (svet > POROG_DEN && rezhim == 0) rezhim = 1; // цель по режиму и плавный шаг к ней int tselevaya = (rezhim == 1) ? YARK_DEN : YARK_NOC; if (tekuschaya < tselevaya) tekuschaya++; if (tekuschaya > tselevaya) tekuschaya--; analogWrite(pinPodsvet, tekuschaya); // служебная строка для калибровки порогов lcd.setCursor(0, 0); lcd.print("L:"); lcd.print(svet); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(rezhim == 1 ? "DEN" : "NOC"); lcd.print(" PWM "); lcd.print(tekuschaya); lcd.print(" ");}| Способ | Что умеет | Ток и оговорка |
|---|---|---|
| Перемычка подсветки на модуле | Горит всегда, ничего не переключает | 20-25 мА без контроля |
| backlight()/noBacklight() через P7 переходника | Только вкл/выкл библиотекой | Резких скачков яркости в сумерках |
| Прямо с пина Arduino | ШИМ, но на грани паспорта пина | 20-30 мА при потолке пина 40 мА — впритык |
| NPN в катоде + ШИМ-пин | Полный диапазон 0-255 плавно | Пин отдаёт только миллиампы базы |
Пороги, гистерезис и сумерки
Один порог — красивая идея, которая стреляет в сумерках. АЦП шумит на пару-тройку единиц, а показания LDR вокруг порога ходят волнами: облако прошло — минус сорок, включился свет в коридоре — плюс шестьдесят. С одним порогом подсветка щёлкает туда-сюда по несколько раз в минуту, и через вечер вы её отключите. Лечится разрывом: ниже 250 — ночь, выше 450 — день, между — режим держится прежним. Разрыв в двести единиц — это примерно вольт делителя, больше любого правдоподобного шума: чтобы состояние перещёлкнулось, освещённость должна измениться по-настоящему, а не дрогнуть.
Переход между режимами делайте плавным: в скетче заполнение шагает по единице каждые 25 миллисекунд, и переход с 255 на 60 занимает около пяти секунд. Можно и быстрее — шаг 5 даст секунду-полторы, глаз всё равно ступеней не увидит, — но резкий бросок яркости в тёмной комнате раздражает не меньше щелчков, я проверил оба варианта на себе. Ночную яркость не задирайте: 40-60 из 255 хватает читать с метра, а средний ток подсветки падает вчетверо — панель, которая ела 25 мА, переходит на 5-7.
Калибровка порогов — полдня наблюдений, и пропускать её нельзя: у каждого помещения свои числа. Первые два дня печатайте сырое значение с A1 в Serial или в служебную строку экрана: утром, днём, при лампах, ночью. Выпишите четыре числа, поставьте пороги посередине между режимами — и зашейте константы. Одна оговорка про место LDR: он должен смотреть в ту сторону комнаты, которую освещает человек, а не в окно и не в плафон — тень вашего тела в вечерней кухне меняет показания на сто-двести единиц, и если датчик стоит под лампой, гистерезис не спасёт: показания будут гулять вместе с вами по кухне.
Пороги не вечны — их стоит перепроверять по сезонам. Летом кухня светлая до десяти вечера, зимой сумерки сползают к обеду: разница показаний LDR между «вечером июня» и «вечером декабря» у меня вышла порядка полутораста единиц. Разрыв гистерезиса в двести единиц перекрывает и это, но нижнюю границу ночи иногда приходится двигать: экран включается слишком рано и зря ест ток — опускай порог; уже темнеет, а экран всё слепит — поднимай. Одна константа, два наблюдения в год, ноль пайки — дешёвая подстройка, которую новичок почему-то делает последней.
Отдельно про модули с I2C-переходником, потому что их у большинства больше, чем голых стекол. За подсветку на переходнике отвечает вывод P7 чипа PCF8574 и его собственный транзистор на плате, поэтому lcd.backlight() и noBacklight() дают только вкл/выкл — промежуточных уровней библиотека не умеет. Для плавного ШИМ на таком модуле цепь подсветки разрывают: выпаивают перемычку или дорожку от P7 и заводят катод на свой транзистор с ШИМ-пином, как в схеме урока. Честная оговорка из практики: в восьми случаях из десяти хватит и вкл/выкл по порогу, как в соседнем уроке про экономную подсветку, — плавность стоит пайки, и решать, нужны ли вам пять секунд мягкого перехода за час работы паяльником, только вам.
И последнее — про обещание из начала урока, что прибор решает сам. Через месяц с автоподсветкой я понял, что забыл про неё как про настройку: экран тускнеет сам, когда стемнеет, и разгорается поутру без единого касания. Добавьте к этому сон подсветки при простое из соседнего урока — и получите прибор, который в темноте почти не ест ток, а в работе всегда читаем. Оставшаяся инфраструктура — делитель, транзистор, два порога — стоит копейки и живёт в каждом моём устройстве с экраном с тех пор.
- 1. Какой ток подсветки экрана 16x2 считается паспортным?
- 2. Почему прямой привод подсветки с пина Arduino — решение на грани?
- 3. Куда ставят NPN-транзистор в схеме управления подсветкой?
- 4. Зачем подсветке два порога вместо одного?
- 5. Что произойдёт при analogWrite на пине D12 Uno?
- Делитель: LDR к 5 В, 10 кОм к GND, точка на A1; светло — число растёт, партии гуляют на треть
- Подсветка 16x2: 20-30 мА, привод с пина — на грани паспорта; честнее NPN в катоде, база через 1 кОм
- ШИМ-пин из набора 3, 5, 6, 9, 10, 11; D9 на 980 Гц мерцает незаметнее пинов 490 Гц
- Гистерезис: 250/450 с разрывом в 200 единиц против строба в сумерках, переход плавный шагами
- На I2C-модуле P7 даёт только вкл/выкл; плавный ШИМ требует разрыва цепи и своего транзистора
Частые вопросы по теме урока
- Какой ток подсветки экрана 16x2 считается паспортным?
- Планка подсветки 16x2 ест 20-30 мА, на модулях токоограничивающий резистор обычно уже стоит на плате. 20-30 мА при напряжении 3-4,2 В
- Почему прямой привод подсветки с пина Arduino — решение на грани?
- Абсолютный потолок пина — 40 мА, рекомендовано до 20. Подсветка на грани, отсюда греющиеся ножки; честнее NPN-ключ. Ток 20-30 мА впритык к рекомендованным двадцати при потолке 40 мА
- Куда ставят NPN-транзистор в схеме управления подсветкой?
- Низкая сторона предсказуема: коллектор в катоде, эмиттер на GND, база через 1 кОм к ШИМ-пину. Высокая сторона на NPN съедает 0,7 В. В разрыв катода: катод к коллектору, эмиттер на землю
- Зачем подсветке два порога вместо одного?
- Шум АЦП и волны освещённости вокруг одного порога дают щелчки. Ниже 250 — ночь, выше 450 — день, между — режим держится. Разрыв порогов — гистерезис: без него подсветка стробит в сумерках
- Что произойдёт при analogWrite на пине D12 Uno?
- На Uno диммируют только 3, 5, 6, 9, 10, 11. На остальных пинах analogWrite даёт два крайних состояния. Вырождение: либо 0, либо 255, промежуточных уровней нет