Найти в Дзене
DigitalComfort

DIY WiFi-датчик температуры на ESP8266 с аккумуляторным питанием

Эта самоделка была для меня в первую очередь экспериментом - реально ли сделать умное WiFi-устройство с батарейным (аккумуляторным) питанием, чтобы заряжать его хотя бы не каждый день? И ответ на этот вопрос - да, возможно, но с ограничениями. Идея возникла сразу же, как я узнал о наличии у контроллеров ESP8266/ESP32 режима глубокого сна (deep sleep mode). Именно за счёт применения этого режима и удалось в итоге обеспечить продолжительность работы без подзарядки до четырёх месяцев при работе от одного аккумулятора 18650. Компоненты для сборки В качестве функциональной нагрузки устройства ничего интереснее, чем датчик температуры, в голову не пришло. Не мудрствуя лукаво, использовал классические датчики Dallas DS18B20: Два таких датчика в трёхпроводном исполнении (не с паразитным питанием) повесил в параллель на один пин микроконтроллера. Микроконтроллер ESP8266 взял в исполнении платы ESP12-E, как наиболее компактный (но не мизерный и удобный для ручного монтажа) со встроенной антенно

Эта самоделка была для меня в первую очередь экспериментом - реально ли сделать умное WiFi-устройство с батарейным (аккумуляторным) питанием, чтобы заряжать его хотя бы не каждый день? И ответ на этот вопрос - да, возможно, но с ограничениями.

Идея возникла сразу же, как я узнал о наличии у контроллеров ESP8266/ESP32 режима глубокого сна (deep sleep mode). Именно за счёт применения этого режима и удалось в итоге обеспечить продолжительность работы без подзарядки до четырёх месяцев при работе от одного аккумулятора 18650.

Компоненты для сборки

В качестве функциональной нагрузки устройства ничего интереснее, чем датчик температуры, в голову не пришло. Не мудрствуя лукаво, использовал классические датчики Dallas DS18B20:

Водонепроницаемый датчик температуры из посылки стали DS18B20, зонд с кабелем 18b20, 1 м/3 метра на AliExpress

Два таких датчика в трёхпроводном исполнении (не с паразитным питанием) повесил в параллель на один пин микроконтроллера.

Микроконтроллер ESP8266 взял в исполнении платы ESP12-E, как наиболее компактный (но не мизерный и удобный для ручного монтажа) со встроенной антенной и достаточным количеством пинов:

Беспроводной модуль ESP8266 на AliExpress
-2

Для зарядки аккумулятора 18650 хотелось не извлекать его из устройства, а заряжать обычной USB type-C зарядкой. Для этого нашлась готовая платка контроллера заряда литиевых аккумуляторов TP4056:

Модуль зарядного устройства TZT type-c / Micro USB 5 В 1 А 18650 TP4056 Модуль зарядного устройства для литиевой батареи на AliExpress
-3

Поскольку диапазон напряжения питания микроконтроллера ESP8266 составляет 1.7 - 3.6 В, а при зарядке аккумулятора на него может подаваться напряжение до 4.3 В, то для возможности питать устройство от пятивольтовой USB-зарядки, когда аккумулятор 18650 разряжен и находится в процессе зарядки, использовал готовый модуль DC-DC преобразователя на микросхеме AMS1117 с выходом на 3.3 В:

Понижающий модуль питания для Bluetooth Raspberry Pi на AliExpress
-4

Так как к контактам аккумулятора нельзя припаивать проводники, а оборудованием точечной сварки я не располагаю, то для надёжного и безопасного размещения аккумулятора 18650 в корпусе устройства использовал кейс с подпружиненным контактом:

Чехол для внешнего аккумулятора 18650 s, 1X, 2X, 3X, 4X, 18650 на AliExpress
-5

Для пущей надёжности и повышения пожаробезопасности для сборки устройства применил не пластиковый, а алюминиевый герметичный корпус. Хотя, в случае возгорания литиевого аккумулятора это и не особо сильно поможет, но всё же немного лучше, чем пластик.

Отдельно отмечу, что несмотря на металлический корпус, без выносной антенны связь по WiFi в пределах квартиры устойчивая. Я проводил замеры (цифр не помню уже), и с открытой крышкой корпуса связь была получше, конечно, но незначительно.

Принципиальная схема устройства

-6

Для контроля текущего уровня заряда аккумулятора применил простейший делитель напряжения на резисторах 30 к и 7.5 к, а его среднюю точку завёл на вход АЦП микроконтроллера (пин 2 ADC).

Светодиод выведен на отдельный пин, и это системный светодиод, который управляется из прошивки и индицирует текущий статус устройства "соединение", "передача", "сон".

Для подключения датчиков использовал разъёмное соединение на обычной гребёнке штыревых пинов, и такую же гребёнку поставил в качестве разъёма для первоначальной прошивки микроконтроллера по кабелю.

Сборка

Поскольку устройство изначально планировалось сделать как макет, то с разводкой и изготовлением платы не заморачивался, собрал всё на слепыше с помощью провода МГТФ. Получилось страшно, но работоспособно:

-7

Здесь снизу - это гребёнка для подключения датчиков. Сверху - гребёнка для прошивки (справа от микроконтроллера):

-8

На модуль зарядки аккумулятора установил два светодиода - красный (зарядка подключена) и синий (зарядка окончена). Справа на модуле рычажковый выключатель питания.

-9

В корпус всё влезло с большим трудом. Буквально все модули пришлось подрезать и подпиливать, даже кейс для аккумулятора пришлось подточить:

С прорезями в корпусе под разъём, светодиоды и выключатели я сильно не заморачивался, макет же. Получилось не шибко аккуратно, но и цели такой не было:

-11
-12

Прошивка микроконтроллера

Поскольку я использую ESP8266 в связке с Home Assistant, то и прошивка основана на ESPHome. В коде нет ничего уникального, он максимально прост.

При загрузке сразу же запрещаем уход в deep_sleep (строка 23) и включаем 50-процентный шим на светодиоде (светодиод мигает до тех пор, пока не произошло подключение по WiFi) (строки 26-28). Шим настроен в строках 64-68.

С интервалом в 1 секунду проверяем наличие WiFi-соединения (строка 31), и если оно установлено (строка 35), включаем шим на 100% (строки 37-39) - светодиод горит не мигая. Это значит, что соединение с сервером установлено, и при следующем получении данных с датчика температуры (интервал 5 секунд - строки 77 и 85) эти данные будут отправлены на сервер:

-13

Безопасный режим разрешён (строка 16), он включится автоматически после 10 циклов перезапуска после сбоя. Но можно и вручную принудительно включить этот режим из интерфейса Home Assistant (строки 41 - 43).

Настраиваем WiFi на максимальный режим энергосбережения (строка 49) и быстрое подключение (строка 48).

-14

Для ADC подобрал опытным путём значение множителя (строка 76), чтобы показания были сразу в вольтах.

Датчиков температуры два, опрашиваются они по очереди. Опытным путём установил, какой датчик опрашивается вторым, и по факту получения с него данных (строка 86) при условии, что из интерфейса Home Assistant не запрещён уход в deep_sleep (строки 90 и 93) включаем режим мигания светодиода для следующего пробуждения (строки 94-96) и погружаем устройство в глубокий сон (строка 97).

Глубокий сон настроен в строках 106-108, устройство просыпается и отправляет данные на сервер каждые 20 минут.

В строках 110-113 настроен переключатель для запрета ухода устройства в глубокий сон - это нужно на период перепрошивки. Для этого сначала переключаем этот переключатель в Home Assistant, затем перезапускаем устройство по питанию, оно загрузится, отправит данные, но не уснёт - можно перепрошивать.

-15

Эта самоделка валяется у меня на подоконнике уже два года и до сих пор исправно работает. Один датчик выброшен за окно, второй измеряет комнатную температуру.

На фото выше видно, что установлен серенький аккумулятор 18650. Это дешёвенький китайский аналог с плохонькой ёмкостью. Его хватает примерно на полтора месяца работы устройства. А вот оригинальные зелёные японские аккумуляторы LiitoKala позволяют не заряжать девайс более четырёх месяцев. Очевидно, что если добавить в параллель ещё пару аккумуляторов, то их суммарного заряда хватит на целый год.

Практический смысл устройства именно в таком исполнении - только лишь эксперимент, показывающий возможность создавать DIY-устройства на батарейках с подключением по WiFi к Home Assistant. Но интервал пробуждения в значительной мере влияет на время работы от одного заряда аккумулятора.