Метеостанция переехала в спальню — и в первую же ночь выяснилось, что синяя подсветка в темноте работает как ночник: светодиод за стеклом бьёт в глаза с полуметра и мешает спать. Командное решение я знал: в уроке про подсветку и сон экран гаснет по таймеру бездействия, в уроке про питание от пина — отключается целиком. Но хотелось не выключателя, а диммера: ночью — еле тлеющие десять процентов, к вечеру — сорок, днём — полная яркость. Библиотека такого не умеет: backlight и noBacklight — это два состояния, между которыми пусто. Пустоту заполняет железо — и один пин с ШИМ.
Почему нельзя повесить аналоговую запись прямо на анод? Арифметика против. Подсветка ест 20-60 мА в зависимости от модуля, у отдельных панелей — за сотню; рабочий ток пина ATmega328P — до 20 мА, сорок — абсолютный максимум, за которым деградирует выходной каскад. Синий 16x2 с резистором на плате балансирует на грани, а яркая панель 2004 выжигает пин гарантированно. Выход стар как транзисторы: между пином и подсветкой ставится ключ, пин управляет базой или затвором, и уже ключ тащит ток диодов.
План урока: два варианта ключа — NPN на катоде и p-канальный MOSFET на аноде, ловушки ШИМ на Uno (не каждый пин умеет), ночная яркость по датчику света и по расписанию часов, и батарейная арифметика: сколько даёт переход от 100 к 10 процентам заполнения. В симуляторе яркость двоичная — движок рисует только включено-выключено, — зато логику порогов с гистерезисом он покажет честно.
Анод под ключом: NPN или p-MOSFET
На плате модуля подсветка выведена крайними контактами с маркировкой A (анод) и K (катод), ограничивающий резистор уже распаян производителем — ваша задача только замкнуть и размыкать цепь. Вариант первый, простейший: NPN-транзистор вроде BC337 в разрыв катодной линии. Коллектор — к контакту K, эмиттер — на землю, база — к пину через 1 кОм. Это классическая низкая сторона, вся механика с токами базы и запасом по коллектору разобрана в уроке про NPN-ключ — повторять её не буду. При 60 мА коллектора BC337 теряет сотые доли вольта: подсветка видит честные пять вольт.
Вариант второй, для педантов и для случаев, когда катодную линию трогать нельзя: p-канальный MOSFET (IRLML6402, AO3401) в разрыв анода — высокая сторона. Исток к 5 В, сток к контакту A, затвор через 150-200 Ом к пину. Две детали, на которых спотыкаются: затвор подтягивается резистором 10 кОм к питанию, чтобы при старте, пока пин ещё висит в третьем состоянии, подсветка не мигала хаотично; и MOSFET нужен логического уровня — с порогом открытия заметно ниже 5 В. Разрывать только одну линию: и анод, и катод в ключи ставить не надо, общего провода достаточно.
Дальше яркость делает analogWrite: заполнение от 0 до 255, транзистор открывается на соответствующую долю периода, средний ток диодов падает во столько же раз. На Uno ШИМ умеют пины 3, 5, 6, 9, 10, 11 — на остальных analogWrite вырождается в ноль или полный, это самая дорогая ловушка урока, ей посвящён отдельный разбор ниже. Частота на большинстве пинов — около 490 Гц, на 5 и 6 — около 980: глазу оба варианта кажутся ровным светом, а камера на 490 Гц ловит полосы — если экран попадает в кадр видео, берите пятый или шестой пин.
#include <Wire.h>#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); const int btn = 2;const int pwmPin = 9; // только ШИМ-пин: 3, 5, 6, 9, 10, 11 на Uno // уровни: заполнение ШИМ и подписьconst int urovni[4] = {255, 102, 26, 0};const char* nazvanie[4] = { "DEN 100%", "VECHER 40%", "NOCH 10%", "SON 0%"}; int uroven = 0;bool lastBtn = LOW; void setup() { pinMode(btn, INPUT); pinMode(pwmPin, OUTPUT); analogWrite(pwmPin, urovni[uroven]); // стартуем с полного дня lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("YARKOST LCD"); lcd.setCursor(0, 1); lcd.print(nazvanie[uroven]); lcd.print(" PWM "); lcd.print(urovni[uroven]);} void loop() { bool b = digitalRead(btn); if (b == HIGH && lastBtn == LOW) { uroven = uroven + 1; if (uroven > 3) uroven = 0; analogWrite(pwmPin, urovni[uroven]); lcd.setCursor(0, 1); lcd.print(nazvanie[uroven]); lcd.print(" PWM "); lcd.print(urovni[uroven]); lcd.print(" "); } lastBtn = b; delay(20);}Ночная яркость: по свету и по часам
Кто решает, что на улице ночь? Два рабочих варианта. Первый — датчик света: LDR на A1 в делителе с резистором 10 кОм, светло — число растёт, темно — падает. Порога два, а не один: ниже 300 — гасим до ночной яркости, выше 500 — возвращаем дневную. Разрыв между порогами называется гистерезисом и лечит строб на границе: без него в сумерках подсветка скачет на каждом шуме АЦП, включаясь и выключаясь по несколько раз в минуту. Второй вариант — расписание по часам: DS3231 даёт честное время, с 23:00 до 7:00 — ночная яркость; там, где интерьер со шторами и датчик света ловит блики от лампы, расписание надёжнее, а сравнение millis с RTC я разбирал в уроке про часы и millis.
Переход между уровнями делайте плавным — за одну-две секунды шагами: в цикле на millis поднимайте или опускайте заполнение на 5 единиц каждые 20-30 мс. Арифметика на пальцах: переход с полного дня (255) на ночные 26 единиц при шаге 5 — это 46 шагов, по 25 мс каждый, около 1,2 секунды — глаз не видит ступеней, а резкий бросок яркости в тёмной комнате исчезает: он и раздражал больше всего. Батарейная цена режимов считается в уме: при десяти процентах заполнения средний ток подсветки падает в десять раз, панель, которая ела 25 мА, переходит на 2-3 мА и в бюджете сравнивается с самой логикой.
| Режим | Заполнение ШИМ | Ток подсветки 16x2 | Где уместен |
|---|---|---|---|
| День | 255 (100%) | 20-25 мА | яркая комната, улица, витрина |
| Вечер | 102 (40%) | 8-10 мА | лампа в комнате, экран не слепит |
| Ночь | 26 (10%) | 2-3 мА | спальня: читается вблизи, не мешает |
| Сон | 0 | 0 мА, текст жив | нет движения 10 секунд — логика из урока про сон |
Автодиммер, если он вам нужен, делает одно уточнение к схеме с LDR: не доверяйте мгновенному значению. Свет от фар, фонарика, прохода хозяйки — и уровень прыгает, хотя на улице ничего не поменялось. Рабочая версия копит выборки в счётчик и раз в минуту берёт среднее за минуту: медленно, зато ни один фонарик не дёргает яркость, а закат отрабатывает за те же полторы секунды плавного перехода. Мгновенное значение оставьте для крайних случаев — полная темнота и прямой свет — там реакция нужна сразу.
Отдельная ветка — панели с RGB-подсветкой: там за стеклом не один светодиод, а три, и выводы A для каждого цвета свои. Три канала — три ключа по схеме из первой половины урока, и возможности растут от диммера до смешивания: днём белый, вечером янтарный, ночью тускло-красный, который почти не сбивает темновую адаптацию глаза. Какая ножка за какой цвет отвечает, удобно сверять по анатомии панели в уроке про устройство HD44780 — там и распиновка, и ограничения по току на канал.
И важная деталь для I2C-модулей: на переходнике PCF8574 подсветкой управляет один бит шины, и это всегда вкл-выкл — никаких полутонов через библиотеку. Ключ для диммирования ставится между переходником и самой панелью, в разрыв линии, которая идёт на выводы A и K стекла: у большинства модулей эти линии щадяще доступны на разъёме панели. Я перепаивал один модуль и потерял на этом вечер — теперь на всех сборках с диммированием либо параллельный выход на ключе, либо I2C, но с доступом к ножкам подсветки.
Батарейная арифметика на живом примере. Панель 16x2 с полной подсветкой берёт около 23 мА — при батарее 2000 мА·ч это примерно 87 часов горения, три с половиной суток, мой гаражный рекорд неэффективности. Разложим те же 2000 мА·ч по режимам: двенадцать дневных часов на 100 процентах, четыре вечерних на 40 и остальные восемь ночных на 10 — средний ток подсветки выходит около 15 мА против 23, счётчик часов вырос бы в полтора раза. Добавьте сон экрана по бездействию ночью — и тот же ресурс уезжает за четверо-пятеро суток. Точные вводные у вашего модуля свои: снимите ток мультиметром и подставьте в ту же пропорцию, общая механика бюджета — в уроке про бюджет тока проекта.
Честная оговорка напоследок: если вам не нужны промежуточные уровни — транзистор не нужен. Программное noBacklight из урока про сон бесплатное, мгновенное и закрывает сценарий погасшего экрана целиком. Диммер окупается там, где экран живёт в переменном свете: спальня, окно на солнце, прибор с ночными сменами. Мой тепличный термометр так и остался на двух состояниях, а спальня получила четыре — и обе схемы честно делают свою работу.
- 1. Сколько тока берёт подсветка типичного модуля 16x2 на полной яркости?
- 2. Почему analogWrite не подают прямо на анод подсветки?
- 3. Какие пины Uno умеют ШИМ через analogWrite?
- 4. analogWrite(12, 64): что увидит подсветка, подключенная ключом к 12-му пину?
- 5. Зачем порогам день-ночь нужен гистерезис — два порога вместо одного?
- Подсветка ест 20-60 мА (отдельные партии 2004 — за сотню), логика — 1-2 мА: экономить имеет смысл только её
- Прямо на пин анод не вешаем: рабочий лимит 20 мА; ключ — NPN на катоде через 1 кОм или p-MOSFET на аноде с подтяжкой 10 кОм
- ШИМ на Uno — пины 3, 5, 6, 9, 10, 11; на остальных analogWrite даёт только ноль и полный уровень
- Ночная яркость: LDR с порогами 300/500 или расписание по DS3231; строб на границе лечится гистерезисом
- 10 процентов заполнения — 2-3 мА вместо 20-25: батарея 2000 мА·ч живёт в разы дольше, камере берите пины 5/6 на 980 Гц
Частые вопросы по теме урока
- Сколько тока берёт подсветка типичного модуля 16x2 на полной яркости?
- 20-25 мА у синих панелей с резистором на плате; 1-2 мА — это логика HD44780, а сотня с лишним — отдельные яркие партии, в основном у 2004. 20-25 мА
- Почему analogWrite не подают прямо на анод подсветки?
- Подсветка ест 20-60 мА и больше, а пин долго живёт только до 20 мА. Между ними ставят ключ: NPN на катоде или p-MOSFET на аноде. Ток подсветки превышает рабочий лимит пина в 20 мА
- Какие пины Uno умеют ШИМ через analogWrite?
- На Uno ШИМ живут на 3, 5, 6, 9, 10, 11. На остальных пинах analogWrite даёт только ноль или полный уровень — промежутка нет. 3, 5, 6, 9, 10, 11
- analogWrite(12, 64): что увидит подсветка, подключенная ключом к 12-му пину?
- Пин 12 не из ШИМ-шестёрки: вызов вырождается в 0 или 255. Ровно это я и ловил сорок минут, пока не перенёс ключ на 9-й пин. Либо темноту, либо полный свет, промежуточного нет
- Зачем порогам день-ночь нужен гистерезис — два порога вместо одного?
- Без разрыва порогов значение рядом с границей болтается из-за шума, и режим мечется. Пороги 300/500 дают мёртвую зону, где ничего не переключается. Чтобы подсветка не стробила на границе при шуме АЦП