DIY ИБП для Raspberry Pi: как не дать умному дому «уснуть» при отключении света

Пошаговое руководство по сборке источника бесперебойного питания для Raspberry Pi на аккумуляторе 18650. Гарантируем корректное выключение при отключении электричества. Скрипты Python, настройка systemd, интеграция с умным домом.
Вот знакомая картина: вы смотрите фильм с домашнего медиасервера на базе Raspberry Pi, или ваш умный дом на Home Assistant вот-вот должен выполнить важную автоматизацию, и… раздается щелчок. Свет гаснет, а вместе с ним — и вся ваша умная экосистема. Плата перезагружается, сервисы падают, а датчики теряют историю. Знакомо? Со мной такое случалось не раз, пока я не решил собрать собственный источник бесперебойного питания (ИБП) для малинки. И оказалось, что это не только полезно, но и увлекательно с инженерной точки зрения.
В этой статье я покажу вам, как собрать не просто резервный аккумулятор, а полноценную систему, которая плавно переключит питание на батарею при пропадании сети, корректно завершит работу одноплатника при длительном отключении и даже отправит вам уведомление. Всё это — с помощью доступных компонентов и открытого ПО.
Почему не купить готовый ИБП?
Готовые решения, конечно, существуют. Но у DIY-подхода есть неоспоримые плюсы: * Гибкость: Вы сами выбираете ёмкость аккумулятора, подходящую именно под ваши нужды (несколько минут для корректного выключения или несколько часов автономной работы). * Контроль: Вы точно знаете, что происходит внутри системы, и можете её доработать. * Интеграция: Самодельный ИБП можно легко «вписать» в экосистему умного дома, например, в Home Assistant, для мониторинга уровня заряда. * Экономия и интерес: Часто выходит дешевле, а процесс сборки и настройки — это ценный опыт.
Что нам понадобится: компоненты и принцип работы
Наша система будет состоять из трех ключевых частей:
- Источник питания (основной): Обычный сетевой адаптер на 5В для Raspberry Pi.
- Резервный источник: Литий-ионный (Li-Ion) или литий-полимерный (Li-Po) аккумулятор. Я выбрал популярный формат 18650 за его доступность и хорошую ёмкость.
- Мозг системы: Плата, которая будет управлять зарядкой аккумулятора от сети и переключением питания на батарею при аварии. Идеально подходит TP4056 с защитой (для зарядки) в паре с повышающим преобразователем (DC-DC Step-Up) на MT3608 или аналогичном.
Принцип работы: Пока есть сетевое напряжение, адаптер питает Raspberry Pi через повышающий модуль (который поднимает напряжение аккумулятора ~3.7-4.2В до стабильных 5.2В), и одновременно через модуль TP4056 заряжает аккумулятор. Как только сетевое напряжение пропадает, аккумулятор продолжает подавать энергию на повышающий преобразователь, и тот, в свою очередь, продолжает питать Raspberry Pi. Плата даже «не моргнет».
Список компонентов для базовой сборки
- Raspberry Pi (любой модели, в примере — Pi 4).
- Сетевой адаптер для Raspberry Pi (5V/3A).
- Аккумулятор 18650 (желательно с запасом ёмкости, например, 3400 мАч).
- Модуль зарядки TP4056 (обязательно с платой защиты от переразряда и перезаряда!).
- Повышающий DC-DC преобразователь MT3608 (или аналогичный, с выходным током не менее 2А).
- Переключатель (тумблер) для ручного отключения.
- Провода типа «папа-папа» и «папа-мама», макетная плата.
- Корпус (например, распечатанный на 3D-принтере или подходящая пластиковая коробка).
Собираем схему: шаг за шагом
Внимание! Работайте с аккумуляторами осторожно. Не допускайте короткого замыкания клемм, перезаряда и переразряда. Использование модуля TP4056 с защитой значительно снижает эти риски.
Схема соединений логична:
1. Аккумулятор 18650 подключаем к клеммам B+ и B- на модуле TP4056.
2. Выходные клеммы модуля TP4056 (OUT+ и OUT-) — это уже защищенный полюс аккумулятора. Их подключаем к входным клеммам повышающего преобразователя MT3608 (IN+ и IN-).
3. Выход повышающего преобразователя (OUT+ и OUT-) настраиваем на 5.2В (небольшой запас для компенсации потерь в проводах) и подключаем к контактам питания GPIO Raspberry Pi (Pin 2 – 5V, Pin 6 – GND). Ни в коем случае не подключайте это питание одновременно с USB-C! Выберите один источник.
4. Сетевой адаптер (5V) подключаем к микросхеме TP4056 (контакты IN+ и IN-). Теперь адаптер будет и заряжать аккумулятор, и, через него, питать повышающий преобразователь.
Между аккумулятором и преобразователем можно врезать тумблер для полного отключения системы.
Настройка повышающего преобразователя
Перед подключением к Raspberry Pi обязательно настройте выходное напряжение без нагрузки: 1. Подключите вольтметр к выходным клеммам MT3608. 2. Вращайте подстроечный резистор на модуле до значения 5.2В. 3. После подключения нагрузки (Raspberry Pi) проверьте напряжение на пинах GPIO. Оно не должно просаживаться ниже 4.8В.
Типичная ошибка: Настройка напряжения без нагрузки на ровно 5.0В. При подключении Pi происходит просадка, и плата может работать нестабильно или вообще не запуститься. Заложите запас в 0.1-0.2В.
Программная часть: мониторинг и корректное выключение
Аппаратная часть обеспечивает бесперебойное питание. Но что, если электричество отключили на долго? Нам нужно дать команду Raspberry Pi корректно завершить работу до того, как аккумулятор разрядится ниже безопасного уровня (обычно ~3.2В для Li-Ion).
Для этого мы будем использовать скрипт, который отслеживает напряжение на аккумуляторе. Как его измерить? Через встроенный АЦП (аналого-цифровой преобразователь) GPIO. Но тут загвоздка: у обычных Raspberry Pi нет аппаратного АЦП. Решений несколько:
- Использовать внешний АЦП, например, на микросхеме ADS1115 (точный, но требует дополнительных компонентов и настроек).
- Использовать цифровой вольтметр на базе I2C, который сам будет измерять и отдавать значение.
- Простой и гениальный способ (который я использую): Воспользоваться тем, что модуль TP4056 меняет состояние одного из своих выводов (
STDBYилиCHRG) при низком заряде. По сути, это готовая сигнальная линия «аккумулятор почти разряжен».
Я пойду по третьему пути, как самому простому для базового сценария.
Подключаем сигнал низкого заряда к GPIO
На модуле TP4056 найдите контакт, который меняет состояние при разряде аккумулятора (часто это STDBY — высокий уровень при заряде, низкий при разряде/окончании заряда). Уточните в даташите вашей конкретной платы.
Подключите этот контакт через делитель напряжения (например, два резистора 1кОм и 2кОм, чтобы снизить возможные 5В до безопасных 3.3В для GPIO) к любому GPIO-пину Raspberry Pi, сконфигурированному на вход (например, GPIO17).
Пишем скрипт-сторож
Создадим скрипт на Python, который будет следить за состоянием этого пина и инициировать выключение.
# Создадим директорию для скриптов и перейдём в неё
mkdir ~/scripts && cd ~/scripts
#!/usr/bin/env python3
# Скрипт ups_monitor.py
import RPi.GPIO as GPIO
import time
import os
import logging
# Настройка логирования
logging.basicConfig(filename='/var/log/ups_monitor.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
# Конфигурация GPIO
BATT_LOW_PIN = 17 # GPIO17, физический пин 11
GPIO.setmode(GPIO.BCM)
GPIO.setup(BATT_LOW_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Подтяжка к 3.3В
def shutdown_pi():
"""Функция корректного выключения Raspberry Pi"""
logging.warning("Низкий заряд аккумулятора! Инициирую выключение...")
# Здесь можно отправить уведомление в Home Assistant или Telegram
os.system('wall "ВНИМАНИЕ: Низкий заряд ИБП. Система будет выключена через 30 сек."')
time.sleep(30)
os.system('sudo shutdown -h now')
def main():
logging.info("Скрипт мониторинга ИБП запущен.")
try:
while True:
# Если пин в состоянии LOW (0В) - аккумулятор разряжен
if GPIO.input(BATT_LOW_PIN) == GPIO.LOW:
logging.error("Обнаружен сигнал LOW на пине разряда аккумулятора.")
shutdown_pi()
break # Выход из цикла перед выключением
time.sleep(10) # Проверяем каждые 10 секунд
except KeyboardInterrupt:
logging.info("Скрипт остановлен пользователем.")
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()
Сделаем скрипт исполняемым и протестируем:
# Даём права на выполнение
chmod +x ~/scripts/ups_monitor.py
# Запускаем для проверки (прервать можно Ctrl+C)
sudo python3 ~/scripts/ups_monitor.py
Настраиваем автозапуск скрипта как службы
Чтобы скрипт работал постоянно, создадим systemd-сервис.
sudo nano /etc/systemd/system/ups-monitor.service
[Unit]
Description=DIY UPS Monitor Service
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/scripts/ups_monitor.py
User=pi
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
# Перезагружаем демон systemd, включаем и запускаем службу
sudo systemctl daemon-reload
sudo systemctl enable ups-monitor.service
sudo systemctl start ups-monitor.service
# Проверяем статус
sudo systemctl status ups-monitor.service
# Смотрим логи
sudo tail -f /var/log/ups_monitor.log
Проверка и тестирование работы системы
Теперь самое интересное — убедимся, что всё работает как задумано.
Тест 1: Бесперебойное переключение.
1. Запустите Raspberry Pi от собранного ИБП. Убедитесь, что аккумулятор заряжен.
2. Подключите к Pi монитор или войдите по SSH.
3. Запустите команду, которая будет постоянно писать время в лог, чтобы видеть момент прерывания:
bash
while true; do echo $(date) >> /home/pi/uptime_test.log; sleep 1; done
4. Аккуратно выдерните сетевой адаптер из розетки. Светодиоды на Raspberry Pi должны продолжать гореть, запись в лог — не прерываться. В идеале в логе не должно быть пропусков более 1-2 секунд.
5. Верните адаптер в розетку. Система должна продолжить работу, а аккумулятор — начать заряжаться.
Тест 2: Корректное выключение при разряде.
1. Для безопасного теста временно измените скрипт ups_monitor.py: уменьшите время в time.sleep(30) перед выключением до 5 секунд.
2. Отключите сетевой адаптер.
3. Имитируйте сигнал низкого заряда: Отключите провод от STDBY модуля TP4056 и на секунду замкните соответствующий GPIO-пин (GPIO17) на землю (GND, Pin 9). Можно использовать перемычку.
4. Наблюдайте за процессом. В консоли должно появиться предупреждение wall, а через 5 секунд система начнёт процедуру выключения.
5. После выключения верните провод на место и подключите сетевое питание. Raspberry Pi должен автоматически загрузиться (если в настройках это разрешено).
Интеграция с умным домом (Home Assistant)
Собранный ИБП можно сделать «умным». Например, добавить датчик напряжения на базе ADS1115 и передавать точный уровень заряда в Home Assistant. Это позволит: * Видеть заряд аккумулятора на панели управления. * Строить графики потребления. * Запускать автоматизации: «Если заряд ИБП упал ниже 30%, отправить push-уведомление». * Связать с системой Home Assistant Energy для полной картины энергопотребления.
Для такой интеграции отлично подойдет Node-RED, который позволяет визуально собрать сложную логику. Если вы ещё не пробовали, посмотрите статью Node-RED + Home Assistant: Визуальная автоматизация умного дома без единой строчки кода.
Заключение и дальнейшее развитие
Мы собрали и настроили полноценный DIY ИБП для Raspberry Pi. Эта система защитит ваши проекты от внезапных отключений электричества и позволит им работать автономно. Главные преимущества решения — его прозрачность, контролируемость и возможность модернизации.
Куда можно развить проект: * Увеличить ёмкость: Использовать несколько аккумуляторов 18650, соединённых параллельно (обязательно через балансировочную плату!). * Добавить мониторинг: Установить ADS1115 для точного измерения напряжения и тока, выводить данные в красивый дашборд. * Резервирование: Использовать такую же схему для других критичных узлов умного дома, например, для шлюза Zigbee. * Оптимизация: Если ваш домашний сервер работает на DietPi, вы можете дополнительно снизить энергопотребление системы, продлив время автономной работы.
Помните, что основа надёжности — это регулярное резервное копирование. Как бы ни был хорош ИБП, от аппаратных сбоев он не спасёт. Настройте автоматический бэкап вашего умного дома, как описано в руководстве Home Assistant: надёжный бэкап и восстановление.
Творите, экспериментируйте, и пусть ваш умный дом будет стабильным даже в бурю!
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
DIY умный звонок с камерой на ESP32-CAM и Home Assistant
Умный аквариум своими руками: автодолив, контроль температуры и освещение по расписанию
GPS-трекер на ESP32 для велосипеда или автомобиля: DIY-проект для умного дома
Умный счётчик электроэнергии своими руками: мониторинг потребления в реальном времени
Мониторинг качества воздуха: CO2, PM2.5 и VOC своими руками на ESP32
Умная кормушка для кота на ESP32: кормим питомца по расписанию