Wishlist

С давних времен использую бесперебойник AccordTek ББП-20 для питания GPON-модема.
Такие коробочки очень часто можно заметить на стенах во всяких магазинах, офисах, складах, паркингах... да везде. Они очень распространены. Применяются для охранной и пожарной сигнализации, и тп.
Внутрь залазит аккумулятор на 7Ач. Инвертора в нем нет, т.е. предназначен для устройств с питанием 12V DС, а не 220V AC. И в отличие от бесперебойников с инвертором, для питания устройств 12V DС, в данном случае мы не теряем энергию на преобразование 12V→220V→12V.

В квартире работает без нареканий. Электричество отключилось на несколько часов, а модем и не заметил ничего. Пробовал бесперебойник с инвертором (с такой же батареей) - держится не больше часа (но возможно тут дело конкретно в моём бесперебойнике).

А вот для использования в деревне, возникли нюансы, которые потребовали некоторой доработки.

В деревне у меня был в распоряжении свободный аккумулятор на 15Ач. Поэтому, я купил модель ББП-50 БК. Фактически, отличается от предыдущего тем, что в этом нет корпуса (в который не влез бы мой аккумулятор), может выдать больший ток, рассчитан на аккумулятор до 17/18 Ач (что бы это не значило), и имеет защиту от глубокого заряда батареи (судя по информации с сайта).

Один из нюансов - не знаю, может быть у меня более ранняя версия, и у меня нет защиты от глубокого разряда, но, в любом случае, я её не заметил. Напряжение легко опускается до 5V и ниже, и ничего не отключается. Если в квартире, для глубокого разряда, вероятность на столько длительного отключения электроэнергии мала, то в деревне ситуация иная.
Тут может отключиться только моя линия, пока кто-то из ближайших соседей в аварийную не сообщит. А ни их, ни меня может и не быть длительное время. И если, например, напряжение питания на ADSL-модеме упадет занчительно ниже 12V, то он может зависнуть, и после восстановления напряжения обратно не отвиснет.
Либо просто выбить УЗО у меня в доме во время грозы. И нагрузка будет высаживать аккумулятор, пока я не приеду.

Второй нюанс... У меня кроме ADSL-модема к данному бесперебойнику подключен RaspberryPi 3B, который выступает в роли ZigBee координатора, и мини-серевера.
Со стандартным USB-блоком питания, нет никакого контроля успешности завершения операционной системы. Если не завершилась и питание отключить - могут возникнуть ошибки файловой системы, либо SD-карта совсем может выйти из строя. До того как я установил бесперебойник, из-за внезапного отключения электричества, у меня выши из строя уже пару SD-карт.
Даже с бесперебойником, в случае низкого заряда батареи, хотелось бы, что бы Raspberry корректно завершала работу, а затем отключалось напряжение на неё. Благо, у неё для реализации этого есть соответствующий функционал - пин, на который можно послать сингал отключения, а с другого - получить статус состояния.
В общем, изначальная задача выглядела так:
При помощи Arduino измерять напряжение от бесперебойника, и управлять отключением устройств.
Если напряжения ниже X - отправлять на Raspberry сигнал отключения, дожидаться завершения OS, отключать реле питания.
Если напряжения ниже Y - отключать реле питания ADSL-модема.

Был собран вот такой прототип:

Недостаток данного прототипа заключался в том, что в случае рестарта Arduino - оба реле на какое-то время отключаются, отключая при этом модем и Raspberry.
Решение - использовать бистабильное реле.
Купил одну штуку Panasonic TQ2-L2-5V, проверил как работает. А затем заказал пачку на Aliexpress, и взялся за проектирование печатной платы в EasyEda.
Плюс такого реле - потребляет ток только в момент переключения.
Минус такого реле - имеет ограничение по напряжению коммутации, и току в 2A. Поэтому, на всякий случай, для Rasspbery - работает в связке с моностабильным реле.

Печать плат заказал у elecrow.com, и уже через месяц у меня был 10-ок тестовых плат, за копейки:

Так как плата несколько отличается от прототипа (добавилось всяких элементов), и никакого прототипирования я не делал, пока проектировал в EasyEda, то было немного опасения "а не накосячил ли я где". Но, почти не накосячил. Единственное, недостаёт резистора 4.7кОм между RPI_SHUTDOWN23 и GND. Но его легко подпаять снизу. Без него - при рестарте Arduino, Raspberry будет получать сигнал на отключение. С ним - все ОК, можно во время работы достать Arduino, перепрошить, рестартовать - на работу нагрузки не повлияет.


Итак, какие возможности в итоге имеем:
  • Отключение устройств в зависимости от напряжения батареи.
  • Корректное выключение Raspbberry Pi.
  • Включение и выключение (корректное) Raspberry Pi кнопкой.
  • Контроль перезагрузки Raspberry Pi.
    Приложение на Raspberry нотифицирует Arduino через UART о том, что началась перезагрузка. Arduino ждет какое-то время завершения, и если время истекло - делает hard-reboot.
  • HTTP-хук в случае пропадания электричества (переход на батарею). Нотифицирует меня в Telegram.
  • В случае пропадания электричества - периодическая запись напряжения в базу PostgreSQL. Потом можно в графане посмотреть динамику.

Что стоит иметь в виду?
Кабель питания Raspberry Pi должен быть толстым! Иначе имеем в логе "Under voltage detected", зависания, проблему с SD-картой.

Чего хотелось бы доработать?
  • Корпус
  • Сделать так, что бы даже сама Arduino отключалась при низком заряде. А потом обратно влючалась. Вряд ли это реально нужно, но сделать интересно.
  • Сам бесперебойник хотелось бы сделать самому - с правильной зарядкой, возможно с повышающим DC-DC преобразоватлем, возможно с отключаемым инвертором, прочими доработками. Но это просто ради интереса... реальной необходимости пока нет.
Исходники лежат на GitHub.