Показывать остаток заряда предполагается в режиме реального времени, (когда устройство включено), поэтому нужно поискать Arduino подобную платформу с минимальным энергопотреблением, и возможностью работы при пониженном напряжении питания.
В Китае можно накопать реплику платы от Sparkfun Arduino Pro Mini работающую на сниженной частоте 8 МГц вместо привычных 16 МГц.
Как и оригинальные платы UNO и Nano данная платформа работает на микроконтроллере ATMega328P, однако тактовая частота снижена 2 раза, и на плате нет USB-UART преобразователя, что значительно сокращает энергопотребление. Для прошивки платы USB-UART преобразователь придется докупить отдельно.
Я на Али нашел преобразователь в виде шнурка с вилкой,
Порядок следования контактов полностью совпадает - то есть можно просто впаять гнездо, и тогда мы получим тоже удобство работы что и с любой другой платой Arduino.
Прошиваем пустым скетчем - энергопотребление при напряжении питания 3.3V составляет всего 5.2мА.
Если плату не предполагается питать от источника питания с напряжением выше 5V - можно выпаять светодиод и стабилизатор питания.
Энергопотребление снизиться до 3.4mA
Заливаем в плату скетч блинк, и мигая встроенным светодиодом уменьшаем напряжение питания.
Итоговый результат:
- диапазон напряжений питания U = 2.8V....5.0V
- потребляемый ток I = 3.0....8.0mA
Данная плата идеальный кандидат для создания индикатора напряжения на Li-ion аккумуляторе. Для измерений будем использовать встроенный в микроконтроллер внутренний источник опорного напряжения 1.1V.
Также потребуется делитель напряжения, который будет превращать максимальное измеряемое напряжение в 1.1V. Общее сопротивление резисторов делителя не должно превышать 10кОм, но мне было лень бежать в магазин - поэтому слепил из того что было под рукой.
У недорогих резисторов достаточно большая погрешность номинального сопротивления поэтому по факту делитель получился....
АЦП в ATMega328P 12 битный.
1024/5.25 = 194
Нас интересуют диапазоны напряжений:
- 3.3В => 3.3 * 194 = 640
- 3.5В => 3.5 * 195 = 679
- 3.7В => 3.7 * 195 = 718
- 3.9В => 3.9 * 195 = 756
Собираем прототип:
Для проверки загружаем незатейливый скетч, а вместо аккумулятора подключаем Arduino к лабораторному блоку питания.
Все результаты видно на фотографиях
При снижении напряжения чуть меньше расчетных пограничных значений, светодиоды начинают подмаргивать (шум) - поэтому добавим в программу гистерезис (~0.1V), ну и пусть красный светодиод при снижении напряжения питания значением менее 3.4V мигает один раз в секунду, намекая на то, что аккумулятор нуждается в срочной зарядке.
Все отладочные константы занесем в скетч, предварительные вычисления будем производить в секции Setup. После сборки схемы подаем на Arduino любое вменяемое для работы напряжение, производим при этом измерение падение напряжения на делителе. Эти 2 значения вносим в скетч, все остальное пусть Arduino считает сама, один раз при выполнение секции Setup.
Преимущества сборки индикатор заряда из "конструктора для домохозяек":
- схема универсальна для любых источников питания напряжением до 5V (18650, 3 элемента 1.5V AA(AAA) или для комплекта из 4-х 1.2V аккумуляторов) достаточно поменять значения переменных измеряемого напряжения- менять элементы схемы не придется!
- индикацию уровня напряжения можно вывести на RGB светодиод, дисплей, передать по радиоканалу или на другой микроконтроллер!
- возможности снижение энергопотребления данной схемы завесит только от знания платформы Arduino (сон, pwm, активация по кнопке, зажигать только один светодиод)!
- легко прикрутить пьзо-пищалку, которая будет выть при снижении напряжения или электронный ключ который будет отключать нагрузку!
Осталось встроить эту плату в готовую конструкцию - например в самодельную блютус колонку:
Теперь мы всегда знаем когда пришло время подзарядить батарею:
Статья про эту колонку доступна по этой ссылке:
Суровая Bluetooth колонка из Российского абонентского громкоговорителя НЕЙВА
В проекте использовались Arduino Pro Mini 3.3V 8 МГЦ
Полный список статей канала доступен по этой ссылке:
Список всех статей канала ESP32 и Arduino
Всем удачи!