В сарае у знакомого я поставил датчик температуры, и выяснилось, что электричества там нет — только то, что принесёшь с собой. Взял Uno, модуль SD, три батарейки AA — и через два дня сборка молча умерла: 2000 мА·ч на 45-50 мА постоянного потребления — это около сорока часов, я проверил таймером. Первые часы всё шло хорошо, и я успел настроить график на телефоне — обидно вышло именно из-за этого. Никакой мистики: плата со своим LED, USB-чипом и стабилизатором ест сама по себе, и логгер не спал ни секунды.
Батарейный логгер — это в первую очередь арифметика, а уже потом скетч. Запись раз в пять минут занимает полсекунды; остальные двести девяносто девять с половиной секунд прибор мог бы не тратить почти ничего, если бы умел спать. Скетч ниже делает ровно это: ритм сон-просыпание, одна сессия записи на цикл, счётчик сессий в EEPROM, LED на окно записи. Ничего лишнего в loop нет: каждый проход либо спит, либо работает на одну строку журнала.
Дальше разберём, сколько это живёт на бумаге и сколько в сарае зимой, где съедается бюджет — от SD.begin до токов покоя карты — и почему диод Шоттки стоит в плюсовом проводе каждой моей батарейной сборки. Ритм CSV-записи возьмём готовый из урока про минутный CSV-лог, здесь меняется интервал и добавляется сон. Счётчик сессий заменит вам дату, пока не нужен календарь: строка № 8721 не хуже штампа, если интервал вы знаете.
Ритм сон-просыпание: millis как каркас
Каркас ритма — тот же millis-планировщик, что и в любом неблокирующем логгере: срок подошёл — сессия, не подошёл — плата спит дальше. Разница в том, чем заполняются паузы. На классической Uno настоящий powerdown экономит смешное: LED питания и USB-чип продолжают жрать десятки миллиампер, и никакой сон их не выключает. Батарейные сборки у меня давно на Pro Mini 3,3 В или голом 328P: там powerdown через библиотеку LowPower опускает потребление до десятков микроампер. Экономия почувствуется сразу в разы, но только если вы выкинули из схемы светодиоды-светлячки и лишние модули: каждый горящий огонёк — миллиампер. У Pro Mini перед прошивкой я сразу откусываю светодиод питания: он один стоит половину всего сна.
Честная оговорка про millis: при powerdown таймер Timer0 стоит, и millis замирает вместе с платой. Счётчиком времени в батарейном логгере millis быть не может — поэтому номер сессии я веду в EEPROM: проснулся, прибавил единицу, записал, отработал, уснул. Заодно счётчик переживает любое питание, и строка в журнале всегда знает свой номер. Шаг сна на Uno ограничен watchdog'ом в восемь секунд, длинный интервал собирается циклом из таких шагов. Четыре секунды на пятиминутный интервал — семьдесят пять проходов цикла, это нормально и на коде не отражается.
По-настоящему глубокий сон с таймером на годы — это ESP32: deep sleep, десятки микроампер, просыпание по таймеру или по кнопке, и весь жанр раскрыт в уроке про глубокий сон ESP32. На Arduino-железе рамка честнее: сон на секунды-минуты и экономия в десятки раз, которая целиком зависит от того, что вы выкинули из постоянного потребления. Замер тока в разрыве питания мультиметром стоит десяти минут и сразу показывает, где всё просело. Скелет неблокирующего цикла без сна остаётся прежним — millis вместо delay.
#include <SPI.h>#include <SD.h>#include <EEPROM.h>#include <LowPower.h> // github.com/rocketscream/Low-Power const int CS_PIN = 10;const int LED_WR = 12;const unsigned long INTERVAL = 300000UL; // 5 минут между записямиconst int ADDR = 0; // счётчик сессий в EEPROM unsigned long slept = 0; // мс сна в текущем интервале void session() { unsigned long t0 = millis(); File f = SD.open("bat.csv", FILE_WRITE); // карта поднимается только здесь if (!f) { Serial.println("open: нет ответа карты"); return; } f.print(EEPROM.read(ADDR)); // номер сессии вместо часов f.print(","); f.println(analogRead(A0)); f.close(); digitalWrite(LED_WR, HIGH); delay(20); digitalWrite(LED_WR, LOW); Serial.print("сессия "); Serial.print(EEPROM.read(ADDR)); Serial.print(", запись "); Serial.print(millis() - t0); Serial.println(" мс");} void setup() { Serial.begin(9600); pinMode(LED_WR, OUTPUT); int n = EEPROM.read(ADDR) + 1; // новый старт = новая сессия EEPROM.update(ADDR, n); Serial.print("старт, сессия № "); Serial.println(n); session(); // первая строка сразу} void loop() { LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); // единицы мкА..0,1 мА slept = slept + 4000; if (slept >= INTERVAL) { int n = EEPROM.read(ADDR) + 1; // millis при powerdown стоит, EEPROM.update(ADDR, n); // счёт живёт в EEPROM session(); slept = 0; }}Бюджет батарейки: арифметика с условиями
Считаем на бумаге. Сон Pro Mini с powerdown: 0,1-0,3 мА вместе с обвязкой. Сессия раз в пять минут — SD.begin на 200-300 мс и запись, итого полсекунды при 15-20 мА, что даёт 20 × (0,5/300) ≈ 0,03 мА в среднем. Итого порядка 0,15-0,35 мА, и 2000 мА·ч делятся на это в пять-тринадцать тысяч часов: от восьми месяцев при честной сборке до пары лет в идеальной. Порядок цифр совпадает у всех, кто считал сходным образом — и расходится, как только меняется частота записи. Запись раз в минуту режет бумажный срок примерно втрое, раз в час — поднимает его за горизонт года.
Полевые поправки съедают половину. Щелочные AA на морозе отдают заметно меньше паспортной ёмкости — в неотапливаемом сарае минус треть это норма; батарейки с полки склада тоже не вечны. Дешёвые солевые банки в логгерах не живут вовсе: просадка при инициализации гасит плату раньше, чем уйдёт счётчик мА·ч. Если модуль SD не обесточивать между сессиями, карта в дежурке тянет 0,5-2 мА сама — и бюджет падает до пары месяцев. Разница между обесточенной картой и живой — самая крупная строка всего бюджета, больше любой поправки на мороз. Практический итог моих сборок: 3×AA при записи раз в пять минут живут 4-6 месяцев, и это честная цифра с холодом и старением, а не маркетинговая.
Отсюда два железных элемента схемы. Первый — MOSFET в плюсе модуля SD: карта полностью обесточена между сессиями, ток покоя уходит в нули, и поднимается она только на свою сессию. Второй — диод Шоттки в плюсовом проводе от батареи, копеечная защита от переполюсовки, о нём ниже в совете. Просадки на старте записи разобраны в уроке про просадки питания, а общая компоновка автономного дата-логгера — в уроке про логгер со сном; здесь добавляются счётчик сессий и бюджет до месяцев. MOSFET берите логического уровня с малым сопротивлением канала: силовой полевик с затвором от 3,3 В откроется не до конца и сгноит вам плюс.
В модели счётчик сессий читается из EEPROM на старте и пишется update'ом на каждом пробуждении: движок держит ячейки честно, и на плате поведение то же — снятие питания счётчик не стирает. LED горит ровно на время окна сессии, на плате это те самые 200-300 мс инициализации плюс запись, и в этом окне питание рвать нельзя: обрыв посреди записи портит хвост файла, что уже разбиралось в уроке про обрыв питания и кластеры. LED в окне записи — тоже страховка: горит — значит сессия в разгаре.
Бюджетная строка внизу лога пересчитывает средний ток из условий урока: сон 0,3 мА плюс сессия по формуле ток × доля времени. Подставьте в скетч свои числа — частоту, длительность сессии, ток сна своей платы — и получите свой прогноз, а не мой. Бюджет, посчитанный от чужих цифр, не стоит ничего: у соседа модуль другой, у вас стабилизатор третий, и средний ток ваш собственный. Я печатаю бюджет строкой при каждой сессии: число перед глазами дисциплинирует лучше любых планов на бумаге.
| Схема питания | Средний ток | Бюджет 2000 мА·ч | Когда брать |
|---|---|---|---|
| Uno как есть, без сна | 45-50 мА | около 40 часов | стол, отладка, боксы с розеткой |
| Pro Mini + powerdown | 0,15-0,35 мА | 8 мес на бумаге, 4-6 полевых | замеры раз в минуты |
| карта не обесточивается | +0,5-2 мА ток покоя | минус половина бюджета | когда MOSFET ставить лень |
| ESP32 deep sleep | 20-150 мкА во сне | месяцы и годы | Wi-Fi по расписанию |
Когда батарейка вообще не нужна, тоже скажу прямо: если рядом солнечная панелька или розетка на 5 В, не мучайтесь со сном — millis-ритм и пакетная запись решают остальное. Сон оправдан там, где прибору предстоит месяцами жить без присмотра: дача, сарай, колодец, тара в дороге — везде, где поездка с ноутбуком дороже самой сборки. И чем реже замеры, тем выгоднее сон: раз в час powerdown отдаёт почти весь срок батарейки, раз в секунду — почти ничего. На границе этих полюсов и лежит ваша частота: считайте от неё, а не от чужих сборок.
Моя граница выбора простая. Замеры реже раза в минуту и питание только от батареек — powerdown и счётчик сессий в EEPROM. Замеры чаще раза в минуту — сон уже мешает ритму: держите прибор проснувшимся, а экономьте на карте — обесточивание между сессиями и короткие сессии записи дают половину эффекта без единой библиотеки. Wi-Fi-проектам с редкой отсылкой данных сразу берите ESP32 с его глубоким сном: Uno там не лучший кандидат. А если прибор встанет в шкаф с розеткой — верните ему обычный millis-ритм: сон ради сна только усложняет отладку.
- 1. Сколько живёт классическая Uno на 3×AA без всякого сна?
- 2. Почему счётчик сессий ведут в EEPROM, а не в millis?
- 3. Что дороже по энергии у батарейного логгера?
- 4. Сколько тянет карта SD, оставленная под питанием в простое?
- 5. Зачем в плюсовом проводе диод Шоттки?
- Классическая Uno на батарейке не экономится: LED и USB-чип держат 45-50 мА; батарейная сборка — Pro Mini 3,3 В или голый 328P.
- При powerdown Timer0 стоит и millis замирает: счётчик сессий живёт в EEPROM и переживает любое питание.
- SD.begin на 100-300 мс при 15-20 мА дороже самой записи в разы: одна сессия на пробуждение, карта не поднимается в простое.
- Бюджет 3×AA 2000 мА·ч при записи раз в 5 минут: 8 месяцев на бумаге, 4-6 в холодном сарае.
- MOSFET обесточивает карту между сессиями, диод Шоттки в плюсе защищает от переполюсовки.
Частые вопросы по теме урока
- Сколько живёт классическая Uno на 3×AA без всякого сна?
- 45-50 мА постоянного потребления делят 2000 мА·ч на сорок часов: LED, USB-чип и стабилизатор платы не выключаются никаким сном. Батарейные сборки собирают на Pro Mini или голом 328P. Около 40 часов: 2000 мА·ч на 45-50 мА
- Почему счётчик сессий ведут в EEPROM, а не в millis?
- Powerdown останавливает Timer0, и millis замирает вместе с платой. Счётчик сессий в EEPROM живёт и сквозь сон, и сквозь снятие питания, заодно нумеруя строки журнала. При powerdown таймер стоит и millis замирает
- Что дороже по энергии у батарейного логгера?
- SD.begin тянет 15-20 мА на 100-300 мс — это 2-6 мА·с, в пять-десять раз дороже самой записи строки. Поэтому карту поднимают один раз за пробуждение и не держат в простое. Инициализация SD.begin на 100-300 мс
- Сколько тянет карта SD, оставленная под питанием в простое?
- Даже не трогаемая карта в дежурке ест пол-миллиампера-два — на фоне сна в 0,1-0,3 мА это переворачивает бюджет с месяцев на пару месяцев. Лечение — MOSFET, обесточивающий модуль между сессиями. 0,5-2 мА, что ломает бюджет
- Зачем в плюсовом проводе диод Шоттки?
- SS14 или 1N5819 стоят копейки и не дают сборке умереть от перепутанных проводов на морозе. Плата за это — 0,2-0,3 В падения, которые надо оставить в бюджете на просадки. Защита от переполюсовки ценой 0,2-0,3 В