Балконный метеодатчик первой сборки выглядел солидно: Uno, макетка, BME280, замер каждой секунды в Serial. Питание — банка 18650 на 3400 мА·ч. Планов было много; продержался он трое суток с четвертью. Арифметика из урока про watchdog и сон жестокая и честная: 3400 мА·ч на 45 мА активной платы — это 75 часов. Я её знал. Просто не поверил, что три дня — весь срок жизни яркого проекта с макеткой на борту.
Вторая сборка учла урок наполовину: Pro Mini 3,3 В, светодиод питания выпаян, опрос раз в минуту — но сна в скетче всё ещё не было, я рассчитывал на честные 4-5 мА активного потребления. На бумаге выходил ровно месяц: 3400 / 4,5 / 24 ≈ 31 день. В реальности датчик умер на двадцать седьмые сутки: саморазряд банки, холод на балконе и мои же вспышки индикации съели четыре дня. Месяц — план, который прощает только безупречную сборку.
Третья сборка дожила до весны. Разница — не в железе, а в порядке действий: сперва энергобюджет на бумаге, потом паяльник, потом скетч. Разберём методику, соберём цикл с powerDown и кольцевым журналом в EEPROM, а в конце поиграем с моделью, которая печатает прогноз жизни банки в днях — от месяца до лет в зависимости от периода тишины. Обещание месяца останется планом-минимумом: правильная сборка на том же железе живёт в разы дольше.
Энергобюджет: кто ест банку
Методика простая до скучности: перечислите потребителей, у каждого выпишите ток и время работы за цикл, перемножьте, сложите, поделите ёмкость на результат. Лишнее выбрасывайте паяльником, а не кодом. Светодиод питания Pro Mini через резистор 330 Ом берёт около 4,5 мА круглосуточно — одна эта строка съедает банку за 31 день, и никакой сон её не прячет: светодиоду безразлично, спит чип или нет. Выпаиваете резистор, а не датчик-индикатор журнала — это разные светодиоды. И проверяйте модули в сборе: платка с собственной обвязкой умеет есть миллиамперы и во сне вашего узла.
Вторая скрытая строка — стабилизатор. У части клонов Pro Mini стоит AMS1117 с током покоя около 5 мА: такой узел перечёркивает весь сон, потому что во power-down плату кормит не чип, а регулятор. Рабочие версии — на MCP1700 с током покоя 1,6 мкА; перед покупкой я смотрю не на чип, а на маркировку стабилизатора. Итог правильной сборки из таблицы ниже — около 25 мкА среднего тока, и 3400 мА·ч по этой арифметике хватает на пятнадцать лет. То есть жизнь обрежет не чип, а саморазряд банки — два-три процента в месяц.
| Потребитель | Ток | Время за цикл в минуту | Вклад в средний ток |
|---|---|---|---|
| Чип активный, 8 МГц, 3,3 В | около 4 мА | 250 мс | 0,017 мА |
| BME280, forced-замер по I2C | 0,35-0,65 мА | 20 мс | 0,0002 мА |
| Чип в power-down с watchdog | 6-8 мкА | 59,75 с | 0,008 мА |
| Светодиод питания, если жив | около 4,5 мА | всегда, включая сон | 4,5 мА — банка за 31 день |
Скетч цикла: семь powerDown(SLEEP_8S) и один powerDown(SLEEP_4S) — минута тишины, поверх которой добавляются свои 250 мс активной фазы; для погодной телеметрии такая погрешность безразлична. Замер — forced-режим BME280: измерение по I2C занимает десятки миллисекунд при 0,35-0,65 мА, после чего датчик засыпает сам, без вашей заботы — по даташиту в паузах он берёт 0,1 мкА. Запись — в кольцевой журнал EEPROM парой байт: десятые доли температуры, затем влажности; урок про кольцевой буфер разбирал такую раскладку со сдвигом износа, отсюда я беру одну деталь — EEPROM.update вместо write: update не трогает ячейку, если байт не изменился, и износ падает в разы.
Про Serial на балконе: его там нет, и это лучшая оптимизация из всех — печать тянет за собой USB-чип и десятки миллиампер. Диагностику выношу в один светодиод — вспышка на каждой записи, двойная на провале шины I2C; сама вспышка — это digitalWrite из самого первого урока про светодиод, просто в служебной роли: 20 мА на двадцать миллисекунд раз в минуту. Забирать журнал приходит ноутбук с адаптером раз в неделю: за минуту он читает кольцо от адреса головы и уходит, а датчик продолжает жить.
Мелочь, которой в таблице нет, но которую даташит просит прямо: неподключенные входы подтянуть. Висящий в воздухе вход во сне переключается от наводок и гоняет логику впустую; я оставляю неиспользуемые пины в OUTPUT LOW, а всё, что живёт на входах, накрываю INPUT_PULLUP. Пара строк в setup, а в паузах экономит больше, чем любой хитрый алгоритм записи.
// Метеодатчик на батарейке: раз в минуту замер и запись в EEPROM.// Плата: Pro Mini 3,3 В, светодиод питания выпаян, стабилизатор MCP1700.#include <LowPower.h>#include <Wire.h>#include <Adafruit_BME280.h>#include <EEPROM.h> Adafruit_BME280 bme; // forced-режим: датчик сам спит между замерамиint slot = 0; // номер текущей пары байт в кольцеconst int GOLOVA = 200; // ячейка с адресом головы журнала void setup() { bme.begin(0x76); pinMode(12, OUTPUT); slot = EEPROM.read(GOLOVA); // 255 = свежая память, начинаем с нуля if (slot == 255) { slot = 0; }} void minutTishiny() { for (int i = 0; i < 7; i++) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // 56 с } LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); // ещё 4 с: итого минута} void loop() { minutTishiny(); float t = bme.readTemperature(); // десятки мс при 0,35-0,65 мА float v = bme.readHumidity(); int t10 = (int)(t * 10); // температура в десятых долях градуса int v10 = (int)(v * 10); // влажность так же int addr = 2 * slot; EEPROM.update(addr, t10); // update не трогает ячейку без изменений EEPROM.update(addr + 1, v10); digitalWrite(12, HIGH); // вспышка: запись прошла delay(20); digitalWrite(12, LOW); slot = (slot + 1) % 100; // кольцо на сто показаний EEPROM.update(GOLOVA, slot);}Модель прогноза в симуляторе
Сон в симуляторе не эмулируется — здесь модель энергобюджета, и её допущения перечислены в описании макетки: активная фаза 0,5 секунды при 20 мА — с запасом на датчик, вспышку индикации и журнальную запись, сон при 8 мкА, банка 18650 на 3400 мА·ч. Потенциометр A0 задаёт период тишины от двух до шестидесяти секунд, светодиод D12 мигает на активной фазе, кнопка D2 изображает внезапное пробуждение — тот случай, когда PCINT-будильник из первого урока триплета сработал на ветер.
Смотрите на tokUa= — средний ток в микроамперах — и на dni= — прогноз в днях. Потянули ручку к двум секундам тишины: прогноз около тридцати пяти дней, план месяца выполнен, но без запаса. Увеличили до восьми — четвёртый месяц. Ушли к шестидесяти — два с лишним года, и дальше прогноз уже врёт: саморазряд банки забирает больше, чем весь скетч. Кнопкой D2 нащёпайте ложных пробуждений и посмотрите, как дни утекают: несколько десятков лишних активаций в сутки — минус месяц жизни. И помните: модель с запасом — реальный журнал из code-блока тратит на активную фазу втрое меньше.
После модели — три вывода, которые я перепроверил на своём датчике. Первый: период сна — сильнейший рычаг, потому что он делит расход активной фазы; периодике отдаём максимум времени, мгновенным событиям — PCINT. Второй: энергобюджет пишут до сборки, а не после разряда — таблица из четырёх строк сэкономила мне пару банков. Третий: после оптимизации лимит узла задаёт химия — саморазряд и холод; два-три процента в месяц от 3400 мА·ч — это 68-102 мА·ч, вчетверо-вшестеро больше расчётного расхода журнала за тот же срок. Дальше улучшать нечего: берите банку больше или измеряйте реже.
Если ваш узел вместо EEPROM шлёт данные по радио или в MQTT, бюджет считайте так же — добавьте строку передатчика с её пиками: короткий пакет в десятки миллиампер на миллисекунды почти ничего не стоит, а постоянный приём убьёт любой сон. База по режимам сна — в уроке про watchdog, а обоим урокам триплета предшествует дисциплина неблокирующего loop() из урока про кооперативный цикл: сон легко встраивается только в скетч, где нет delay().
- Энергобюджет — таблица потребителей: ток умножить на время за цикл, сложить, разделить ёмкость; месяц на 18650 — план со средним током около 4,7 мА
- Светодиод питания — 4,5 мА круглосуточно и банка за 31 день; стабилизатор AMS1117 добавляет около 5 мА покоя — нужны версии на MCP1700
- Рабочий цикл: 7 × SLEEP_8S + SLEEP_4S = минута тишины; forced-замер BME280 — 0,35-0,65 мА на десятки миллисекунд, запись в EEPROM через update
- Итог сборки — около 25 мкА: по арифметике пятнадцать лет, реально обрежет саморазряд 2-3 % в месяц и холод на балконе
- Период тишины — главный рычаг: с 2 с до 60 с прогноз растёт с месяца до лет; ложные пробуждения списывайте в расход наравне со всем остальным
- 1. Какой средний ток позволяет банке 18650 на 3400 мА·ч прожить месяц?
- 2. Что первым делом выпаять на Pro Mini перед батарейной жизнью?
- 3. Что происходит с millis() после каждого powerDown(SLEEP_8S) на плате?
- 4. Какой стабилизатор похоронит батарейный сон, даже если чип идеален?
- 5. Почему для журнала показаний берут EEPROM.update, а не write?
Частые вопросы по теме урока
- Какой средний ток позволяет банке 18650 на 3400 мА·ч прожить месяц?
- 3400 мА·ч делим на 30 суток по 24 часа: 3400 / 720 ≈ 4,7 мА. Uno с её 45 мА в этот бюджет не влезает даже вдвое, активный Pro Mini — на грани. около 4,7 мА
- Что первым делом выпаять на Pro Mini перед батарейной жизнью?
- Power-LED с резистором 330 Ом берёт около 4,5 мА круглосуточно — банка за 31 день независимо от сна. Кварц, Reset и разъём сна не касаются. светодиод питания вместе с его резистором
- Что происходит с millis() после каждого powerDown(SLEEP_8S) на плате?
- В power-down остановлены и ядро, и таймеры, включая Timer0 с его millis(). Периоды дольше восьми секунд живёт счётчик циклов сна. не тикает: Timer0 во сне стоит, время считайте снами
- Какой стабилизатор похоронит батарейный сон, даже если чип идеален?
- AMS1117 жрёт порядка 5 мА просто на покой — это сопоставимо с активным чипом и перечёркивает power-down. Отсюда правило: смотреть на маркировку регулятора до покупки платы. AMS1117 с током покоя около 5 мА
- Почему для журнала показаний берут EEPROM.update, а не write?
- update сначала читает ячейку и пишет только при расхождении. Для погодных журналов, где соседние замеры часто совпадают, это резко сокращает износ ячеек. update не трогает ячейку, если байт не изменился, — износ падает в разы