Метеоточка в теплице на Arduino Uno держалась от кроны ровно десять часов, и это была самая короткая жизнь проекта в моей практике. Схема работала безупречно: датчик раз в две секунды, печать в монитор, всё по правилам. Но Uno — не про батарейки: стабилизатор, USB-чип и бортовой светодиод L съедают 45–50 миллиампер даже когда скетч спит. Крона на 500 мА·ч при таком аппетите — это арифметика для третьего класса, а не проект. От USB-питания я уходил в уроке про питание без USB, и там уже было видно: батарейное приложение живёт по другим законам.
Спасение называется глубокий сон. Контроллер засыпает так, что от него остаётся единицы микроампер, просыпается по будильнику, делает дело — измерить, отправить, посчитать — и снова в сон. Прибор проводит во сне 99,9 % времени, и средний ток падает в тысячу раз. В этом уроке посчитаем бюджет батарейки по-честному, с токами каждой статьи расхода, найдём узкое место, которым окажется не контроллер, и соберёт симулятор, где бюджет можно крутить кнопкой.
Почему это не delay, и почему не Uno
Глубокий сон — это режим power-down самого чипа: остановлены ядро, тактовые генераторы, большая часть периферии, просыпается только Watchdog-таймер или прерывание. Отличие от delay принципиальное: delay — это занятое ожидание на полном ходу, все 15–20 миллиампер налицо; power-down опускает голый ATmega328P до десятых долей микроампера. На практике берут Arduino Pro Mini 3,3 В и выпаивают или обводят стороной стабилизатор со светодиодом питания — остаётся около 5 мкА. Уроки о пробуждении по часам уже ждут в разборе watchdog и сна.
Сначала прикинем худший случай, чтобы понимать масштаб. Пусть Uno бодрствует 200 миллисекунд на цикл, читает датчик, отправляет данные и засыпает «как умеет» — то есть на тех же 45 мА. Средний ток почти не отличим от полного: 45 мА круглосуточно съедят крону за полсуток, три АА на 2500 мА·ч — за двое суток. Вывод неутешительный и однозначный: батарейный проект начинается с платы без светодиодов и стабилизатора, а не с оптимизации скетча. Мои замеры токов разных плат и правда о саморазряде — в уроке про бюджет тока проекта.
| Статья расхода | Ток | Комментарий |
|---|---|---|
| Активная фаза: чтение DHT + передача | ≈15 мА | 200 мс на цикл: чтение 5 мс, радио и накачка — остальное |
| ATmega328P в power-down | 0,1–5 мкА | Pro Mini без стабилизатора и светодиода |
| Ток покоя DHT22 | 40–50 мкА | датчик не спит никогда — становится главным едоком |
| Uno «во сне» | 30–50 мА | стабилизатор и USB-чип не отключаются — для батареек мимо |
Арифметика бюджета: где кончается выгода
Считается бюджет в три строчки. Скважность duty — доля активной фазы: 200 мс делить на период. Средний ток — смесь сна и бодрствования: ток сна умножить на время сна плюс ток активности на время активности. Срок — ёмкость батареи делить на средний ток. Период 10 минут, активная фаза 200 мс при 15 мА, сон 5 мкА: duty выходит 0,033 %, средний ток — около 55 мкА, и три АА по 2500 мА·ч дают арифметических 1894 суток, почти пять лет.
А теперь фокус, который я узнал, потеряв неделю на оптимизацию не того конца. Удлиним сон до 30 минут — срок вырастет с 1894 до 2016 суток, плюс шесть процентов. Причина в таблице выше: после десятиминутного периода главным едоком становится ток покоя DHT22 — его 40–50 мкА снуют в землю больше, чем весь спящий контроллер. Сон дольше 10 минут для этой схемы почти ничего не даёт. Решение — обесточивать сам датчик: DHT22 на измерении ест 1–1,5 мА, а пин Arduino отдаёт до 40 мА, поэтому датчик питают прямо с цифрового пина: перед измерением HIGH, после — LOW, и во сне жрут только 5 мкА контроллера. Тогда срок упирается уже в саморазряд батареи, а не в электронику.
Обратная сторона обесточивания — прогрев. DHT22 после подачи питания требует до двух секунд, чтобы показания стали осмысленными, а интервал между запросами у него свой, из урока про интервал опроса. Будите питание датчика первым делом, потом делайте остальные дела активной фазы, и читайте сенсор последним — эти две секунды перекроются передачей данных. Место для уличной метеоточки и защита сенсора от конденсата разобраны в уроке про установку DHT22.
#include "DHT.h"#include "LowPower.h" // библиотека Rocket Scream LowPower #define DHT_PWR 4 // питание DHT22 — с цифрового пина#define DHT_DATA 2 DHT dht(DHT_DATA, DHT22); void setup() { pinMode(DHT_PWR, OUTPUT); digitalWrite(DHT_PWR, LOW); // датчик обесточен dht.begin();} void loop() { digitalWrite(DHT_PWR, HIGH); // подать питание на датчик delay(2000); // прогрев сенсора float t = dht.readTemperature(); float h = dht.readHumidity(); Serial.print("t="); Serial.print(t, 1); Serial.print(" h="); Serial.println(h, 0); digitalWrite(DHT_PWR, LOW); // обесточить до следующего цикла LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // восемь повторов = цикл около минуты; для длинных пауз — RTC-будильник}Считаем бюджет в симуляторе
Движок симулятора не эмулирует сон — микросхему сна он не рисует, и это честно: сон проверяется мультиметром на живой плате. А вот арифметика бюджета — вычисления, и в симуляторе ей самое место. Ниже скетч-калькулятор: на каждом такте он изображает активную фазу — вспышка светодиода, чтение датчика, печать показаний — и печатает бюджет для выбранного периода сна. Кнопка на пине 3 переключает период по кругу: минута, десять минут, тридцать минут.
Смотрите, как реагируют строки iavg_ua= и days=: на минутном периоде средний ток около 100 мкА и арифметика обещает тысячу с лишним суток; на десяти минутах ток падает до 55 мкА, срок прыгает к пяти годам; на тридцати — выигрывается всего пара процентов, потому что дальше платит ток покоя датчика. Числа в мониторе — точь-в-точь расчёт из раздела выше, только теперь его можно вертеть руками. О том, что саморазряд батарейки съест все многолетние обещания, напомню один раз: арифметика показывает потолок схемы, батарея ставит свой.
- Посчитайте в уме период, при котором средний ток сравняется с 10 мкА, потом проверьте кнопкой симулятора — на трёх пресетах этого не случится, и это ответ.
- Вычтите ток покоя датчика из схемы: поставьте iSleep = 0.005 и сравните days на трёх периодах. Без DHT22 в цепи удлинение сна снова начинает работать.
- Уменьшите activeMs со 200 до 80 и посмотрите, насколько подрос days: активная фаза — второе по силе плечо после тока покоя, и тоже стоит оптимизации.
- 1. Почему Uno даже со сном в скетче не живёт от батарейки?
- 2. Чем глубокий сон принципиально отличается от delay(60000)?
- 3. Почему после 10 минут сна удлинение паузы почти не экономит батарею?
- 4. Как обесточить DHT22 на время сна?
- 5. Сколько занимает честный расчёт бюджета батарейки?
- Батарейный проект начинается с платы: Uno со стабилизатором и светодиодом не спасёт никакой сон.
- Power-down — это единицы микроампер и будильник; delay — полный ток на всём ходу.
- Бюджет — три строчки арифметики: доля активности, средний ток, ёмкость делить на ток.
- После десятиминутного периода главный едок — ток покоя DHT22: рвите питание датчика пином.
- Прогрев обесточенного сенсора — до двух секунд: питание первым делом, чтение последним.
Следующий шаг — будить плату по расписанию похоже на настоящие часы: RTC-модуль умеет прерывание раз в минуту или в час, а точность хода и подстройка — в уроке про точность DS3231. Если данные пора показать миру, тот же батарейный каркас дружит с радио и облачными протоколами — стартовая точка в уроке про публикацию показаний по MQTT.
И последний совет из практики: прежде чем прятать метеоточку в теплицу на полгода, дайте ей пожить на столе неделю с этим же калькулятором в мониторе. Подставьте в скетч ток, измеренный вашим мультиметром на настоящей плате, — моя первая Pro Mini после выпайки светодиода показала 6 мкА вместо обещанных пяти, и бюджет честно пересчитался. Арифметика из урока — карта, мультиметр — территория, и сверять одно с другим — привычка, которая отличает работающий проект от работающего на бумаге.
Частые вопросы по теме урока
- Почему Uno даже со сном в скетче не живёт от батарейки?
- До чипа сон не доходит: обвязка платы — стабилизатор, USB-мост, светодиод — тратит 30–50 мА независимо от режима ядра. Нужна плата без обвязки. Стабилизатор, USB-чип и светодиод едят десятки миллиампер даже во сне
- Чем глубокий сон принципиально отличается от delay(60000)?
- delay — это активное ожидание при полном потреблении. Power-down останавливает ядро и периферию, оставляя единицы микроампер и будильник. Во сне останавливается ядро, и ток падает до микроампер; delay — работа на полном ходу
- Почему после 10 минут сна удлинение паузы почти не экономит батарею?
- После десятиминутного периода вклад активной фазы мизерный, и средний ток сходится к току покоя датчика. Лечится обесточиванием сенсора. Главным едоком становится ток покоя DHT22 — 40–50 мкА
- Как обесточить DHT22 на время сна?
- На измерении DHT22 ест 1–1,5 мА, лимит пина — 40 мА, поэтому питание с пина законно. Проснулись, подали питание, выдержали прогрев, измерили, обесточили. Питать датчик с цифрового пина: HIGH перед измерением, LOW после
- Сколько занимает честный расчёт бюджета батарейки?
- Duty — доля активной фазы, средний ток — смесь сна и бодрствования, срок — ёмкость на средний ток. Именно эти строки печатает симулятор урока. Три строчки: скважность, средний ток, ёмкость минус ток