Теплица с метеостанцией жила на трёх батарейках AA — 2000 мА·ч при 4,5 В, если верить упаковке. По расчётам выходило около сотни часов, по факту — двое суток. Мультиметр расставил всё по местам: плата с датчиками брала 18 мА, а дисплей с горящей подсветкой — 24 мА. Больше половины бюджета улетало в экран, который ночью в пустой теплице не был нужен никому. Я уже занёс руку над скетчем с таймерами, но сначала попробовал самое прямое решение: отрезать дисплею питание целиком. Один цифровой пин — и подсветка, и логика гаснут разом.
В уроке про подсветку и сон (/lesson/lcd/lcd-podsvetka-i-son/) мы уже темнили экран командой noBacklight — экран чернел, но контроллер дисплея продолжал жить и есть свои миллиамперы. Здесь шаг дальше: пин разрывает питание всего модуля, и потребление дисплея падает до нуля — вернее, до токов утечки, которые мультиметр уже не ловит. Правда, у этого решения есть два острых угла: реинициализация после пробуждения и фантомное питание через сигнальные линии. Разберём оба, а заодно посчитаем, когда оно вообще имеет смысл.
Сколько берёт дисплей и что выдержит пин
Сначала арифметика, чтобы не сжечь пин. Логика HD44780 с переходником — это 1–2 мА. Подсветка — основной едок: у 16x2 на модулях из наборов я мерил 20–25 мА, у 20x4 встречал от 25 до 60 мА — зависит от светодиодов и резистора, который поставил производитель. Паспорт ATmega328P разрешает 40 мА на один пин, но это абсолютный максимум, за которым начинается деградация выходного каскада; режим, в котором пин живёт долго, — до 20 мА. Отсюда границы: логику дисплея с пина ведём без раздумий; модуль 16x2 целиком — 22–27 мА — формально проходит, но я так не оставляю; 20x4 и RGB-варианты — только через транзисторный ключ BC337 с базой через 1 кОм: ток базы около 4 мА, коллектор держит 500 мА — запас в десять раз, как мы разбирали в уроке про NPN-ключ (/lesson/breadboard/tranzistor-npn-klyuch-2n2222/).
Экономия того стоит. Батарея 2000 мА·ч при потреблении 42 мА (плата плюс экран) кончается через 2000/42 — около 47 часов; без экрана — 2000/18, около 111 часов. Если экран горит только пятую часть времени, средний ток выходит 18 + 42 × 0,2 = 26 мА — около 75 часов. Числа ориентировочные: подсветка у модулей разная, а плата без сна ест своё — общий бюджет считаем заранее (/lesson/breadboard/byudzhet-toka-proekta/). И помним, что батарейное питание целиком — отдельная наука (/lesson/ide/pitanie-bez-usb-batarejki/).
Про просадку скажу отдельно, потому что она подстерегает именно на пине. При токе 20 мА выходной каскад ATmega328P роняет на себе около полувольта: паспорт обещает не ниже 4,2 В при 5-вольтовом питании и не выше 0,9 В на земле. Для дисплея это терпимо, но резерва уже нет: добавьте просадку батарей под нагрузкой — и питанию модуля станет не хватать долей вольта до нормы, экран начнёт глючить по непонятным причинам. Транзисторный ключ снимает вопрос: на BC337 при 30 мА на коллекторе теряются сотые доли вольта, дисплей видит честные пять.
| Что питаем от пина | Ток | Как |
|---|---|---|
| Логика дисплея, подсветка отдельно | 1–2 мА | напрямую с пина — безопасно с запасом |
| Модуль 16x2 целиком | 22–27 мА | на грани: формально проходит, я беру транзистор |
| Модуль 20x4 целиком | 30–60 мА | только через BC337 или 2N2222 |
| RGB-подсветка | до 90 мА | транзистор, база через 1 кОм |
Два пути гашения — и у каждого своя цена. Первый: гасить только подсветку, командой или ключом — дисплей просыпается мгновенно, данные в его памяти живы, никакой реинициализации. Это мой дефолт для приборов, где экран нужен каждые пару минут. Второй: снимать питание со всего модуля — экономия максимальная, но контроллер забывает всё: разрядность шины, число строк, режим курсора. Мой первый сон-режим я проворонил именно здесь: будил дисплей пином и сразу писал текст — а на экране мусор и квадраты. После подачи питания обязателен lcd.init(), и не сразу: сначала порядка 50 миллисекунд, пока напряжение устаканивается и конденсаторы модуля заряжаются.
Пробуждение посчитайте честно: 50 мс на устаканивание плюс стартовая последовательность с её собственными ожиданиями — суммарно около сотни миллисекунд до первой буквы. Для прибора, который включают кнопкой, это незаметно; для экрана, просыпающегося по датчику движения каждую минуту, — уже аргумент вернуться к гашению одной подсветки. Мой выбор по границе: экран нужен чаще раза в десять минут — гашу подсветку; прибор молчит часами — снимаю питание целиком.
const int PWR = 8; // через него живёт весь модуль дисплея void lcdOn() { digitalWrite(PWR, HIGH); delay(50); // даём напряжению устаканиться lcd.init(); // дисплей проснулся с чистой памятью lcd.backlight(); drawScreen(); // заново рисуем то, что было} void lcdOff() { lcd.clear(); lcd.noBacklight(); // гасим линии, чтобы не тлело фантомно digitalWrite(PWR, LOW);}Симулятор: прибор с засыпающим экраном
Тренажёр собирает прибор целиком. Ручка A0 — датчик влажности, экран показывает значение живьём. Восемь секунд без нажатий — в реальном приборе минуты, подбираются под сценарий, — и пин D12 снимает питание с дисплея: Serial печатает pwr=0, экран в тренажёре пустеет и гаснет, светодиод гаснет вместе с ним. Кнопка D2 будит: pwr=1, init=zanovo — вот та самая реинициализация, без которой после сна был бы мусор. Тумблер D3 — режим «экран всегда включён» для наладки: таймер простоя останавливается, дисплей не засыпает. На настоящей плате экран гаснет сам, потому что пин отрубил VCC; в тренажёре мы имитируем это очисткой и выключенной подсветкой — логика сон-пробуждение при этом один в один.
Обратите внимание: после сна экран в тренажёре пустой, а не затемнённый — мы честно очистили его и сняли подсветку. На настоящем железе после подачи питания модуль выглядит как свежевключённый: пустой экран с настраиваемым контрастом, а то и ряд квадратов — до первого init. Если ваш прибор при пробуждении показывает квадраты, я первым делом ищу в скетче lcd.init() после подачи питания: это самый частый симптом сна без реинициализации, и лечится он одной строкой.
Нюансы сборки. Пусковой ток при включении: модуль с входными конденсаторами первый момент ест больше рабочего — обычно пин переваривает это молча, но если на плате стоит электролит от сотни микрофарад, я ставлю в разрыв резистор 5–10 Ом, он же сглаживает бросок; про роль конденсаторов в питании был отдельный урок (/lesson/breadboard/kondensator-filtr-pitaniya/). Контрастный потенциометр оставляем на общей шине: при снятом питании он перестаёт влиять, и это нормально. Таймер сна — на millis(), без delay(), иначе прибор перестанет замечать кнопку (/lesson/prodvinutye/millis-vmesto-delay/). И наливайте сон с запасом: восемь секунд в тренажёре — для демонстрации, в приборе я ставлю от минуты до пяти в зависимости от сценария — каждое лишнее пробуждение стоит дороже секунд горения, потому что включает полный старт дисплея. А если экономить всерьёз — усыпляйте заодно и плату: watchdog и режимы сна разобраны в соседнем разделе (/lesson/prodvinutye/watchdog-tajmery-son/). Экран и плата, засыпающие вместе, выжимают из трёх батареек недели, а не сутки.
- Логика HD44780 — 1–2 мА, подсветка 16x2 — 20–25 мА, модуль 20x4 — 30–60 мА
- Пин ATmega328P: 20 мА — рабочий режим, 40 мА — абсолютный максимум; модуль целиком ведём через BC337
- После подачи питания — пауза около 50 мс и lcd.init(): дисплей забыл разрядность, строки и курсор
- Перед снятием питания гасите линии: clear и noBacklight — иначе фантомное питание через защитные диоды
- Только подсветка — мгновенное пробуждение; снятие VCC — максимальная экономия ценой реинициализации
- 1. Почему весь модуль 20x4 нельзя питать прямо с пина?
- 2. Дисплей проснулся после снятия питания. Что сделать до первой печати?
- 3. Экран тлеет в темноте при выключенном пине. В чём причина?
- 4. Прибор без экрана берёт 18 мА, с экраном — 42 мА. Экран горит только пятую часть времени. Каков средний ток?
- 5. Логика дисплея без подсветки — 1–2 мА. Можно ли вести её с пина напрямую?
Частые вопросы по теме урока
- Почему весь модуль 20x4 нельзя питать прямо с пина?
- Пин живёт долго до 20 мА, абсолютный максимум 40 мА. Токи 20x4 в 30–60 мА требуют транзисторного ключа. Подсветка 20x4 берёт 30–60 мА — за пределами разумного для пина
- Дисплей проснулся после снятия питания. Что сделать до первой печати?
- Контроллер после включения забывает все настройки — разрядность, число строк, режим. Без повторной инициализации на экране мусор и квадраты. Подождать около 50 мс и вызвать lcd.init()
- Экран тлеет в темноте при выключенном пине. В чём причина?
- Линии под 5 В подпитывают выключенный дисплей через защитные диоды. Перед снятием питания гасите clear() и noBacklight(), уровни — в LOW. Ток подтекает через сигнальные линии и защитные диоды
- Прибор без экрана берёт 18 мА, с экраном — 42 мА. Экран горит только пятую часть времени. Каков средний ток?
- 18 + 42 × 0,2 = 26,4 мА. На батарее 2000 мА·ч это около 75 часов против 47 при постоянно горящем экране. Около 26 мА
- Логика дисплея без подсветки — 1–2 мА. Можно ли вести её с пина напрямую?
- 1–2 мА — на порядок ниже рабочего предела пина в 20 мА. А вот подсветку и крупные модули уже ведут через транзистор. Да, это безопасно с запасом