Уровень заряда аккумулятора 18650 на arduino

Уровень заряда аккумулятора 18650

Для каждого устройства, которое работает от автономного источника питания, основным показателем времени «жизни» до следующей подзарядки является уровень заряда аккумулятора. Без этой информации не представляется возможным ни одно электронное устройство. Много кто любит сюрпризы, но неожиданное прекращение работы девайса вряд ли кому-то понравится. Вот и я не отношусь к числу мазохистов, которые получают удовольствие от неожиданно переставшего работать устройства. Поэтому в новом проекте, который должен будет работать по 3-4 месяца автономно, было решено добавить контроль уровня заряда аккумулятора. Уровень заряда будет измеряться в процентном соотношении и периодически отправляться по сети интернет или в смс. В этой статье будет рассмотрено только определение уровня заряда аккумулятора и вывод информации на дисплей, чтобы не загружать текст лишней информацией.

Аккумулятор 18650 и arduino

Для питания электронных устройств можно использовать множество различных источников питания, но в данной статье будет использоваться аккумулятор 18650. Максимальный заряд такого аккумулятора 4.25 вольта, а минимальное напряжение, при котором аккумулятор не пострадает и сможет без проблем зарядиться – 2.75 вольта. Батареи 18650 имеют довольно большую емкость, до 3000 мАч, что позволяет питать устройства большое количество времени. Но, тем не менее, такие источники питания не вечные и необходимо следить за уровнем заряда. Если заряд будет ниже, чем 2.75 вольта, то реанимировать аккумулятор будет сложно, а иногда и невозможно.

Измерение уровня заряда аккумулятора с помощью arduino

Чтобы максимально точно измерить уровень аккумулятора с помощью arduino, нужно воспользоваться опорным напряжением микроконтроллера и сравнивать его с напряжением источника питания. Но тут появляется небольшая сложность, напряжение опорного питания составляет 1.1 вольт, а максимальное напряжение 18650 — 4.25 вольта. Чтобы замерить напряжение аккумулятора необходимо использовать простой делитель напряжения, который легко собрать с помощью двух резисторов. В данном примере, я использовал резисторы сопротивлением 1 и 10 кОм, в итоге получилось понизить уровень напряжения примерно в 10 раз.
Для расчета напряжения, которое получится на выходе делителя, используется формула: U(out) = U(in)*(R2/(R1+R2)). Получается, что при напряжении 4 вольта, на выходе делителя напряжение будет равно 0.36 вольт. Такое напряжение уже можно без проблем сравнивать с опорным. Это основная логика работы, остальное уже дело техники. Ниже будет приведена схема подключения аккумулятора и делителя напряжения к ардуино. Хочу только обратить внимание, что для более точного расчета делителя необходимо замерить сопротивление каждого резистора, поскольку их реальное сопротивление может немного отличаться от маркировки. В моем случае резисторы с маркировкой 1 и 10 кОм, на деле имели сопротивление 0.99 и 9.88 кОм.
Подключение аккумулятора и делителя напряжения к arduino

Скетч arduino для определения уровня заряда аккумулятора

Чтобы установить опорное напряжение на аналоговых входах arduino на уровне 1.1В необходимо воспользоваться функцией analogReference и передать ей параметр INTERNAL. Работать с опорным напряжением 1.1В умеют микроконтроллеры ATmega168 и ATmega328, если будет использоваться ATmega8, то при вызове этой же функции, опорным напряжением будет 2.56В.
Для вывода уровня заряда аккумулятора будет использоваться 7-мегментный 4-х разрядный индикатор TM1637, как его использовать, можно почитать в более ранней статье: индикатор TM1637.
Ниже приведен код с подробными комментариями.

// подключение индикатора TM1637
#include <TM1637.h>
#define CLK 3
#define DIO 2 
TM1637 tm1637(CLK,DIO);

// пин для считывания напряжения
Int pin_read = A1;
// максимальный заряд аккумулятора
float max_v = 4.25; 
// минимальный заряд аккумулятора
float min_v = 2.75; 

void setup(){ 
  // установка опорного напряжения для аналоговых входов
  analogReference(INTERNAL);
  // вывод данных в монитор порта
  Serial.begin(9600);
  // инициализация индикатора
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
}
 
void loop(){ 
  float Vbat = (analogRead(pin_read) * 1.1) / 1023;
  float del = 0.091; // R2/(R1+R2)  0.99кОм / (9.88кОм + 0.99кОм)
  float Vin = Vbat / del;
  // уровень заряда в процентах
  int proc = ((Vin - min_v) / (max_v - min_v)) * 100;
  // вывод данных в монитор порта
  Serial.println(Vin);
  Serial.println(proc);
  // вывод уровня заряда на индикатор
  tm1637.display(proc);
  delay(1000); 
}
 

Что использовалось в проекте:

Послесловие

Использовать, приведенный в статье, код можно для любых аккумуляторов, не обязательно 18650. Достаточно только в коде скетча подправить переменные для максимального и минимального напряжения аккумулятора. А также можно использовать резисторы любого другого наминала, только не забыть подправить уравнение в коде: float del = 0.091; // R2/(R1+R2) 0.99кОм / (9.88кОм + 0.99кОм)

Рассказать друзьям:


Оценить:
(14 оценок, среднее: 3,79 из 5)

Уровень заряда аккумулятора 18650 на arduino: 6 комментариев

  1. схема постоянно будет сьедать батарею! Так делать нельзя, или хотя бы ставьте резисторы побольше.

  2. Int pin_read = A1; Подсвечивается седьмая строка
    Пишет ошибку: exit status 1

    ‘Int’ does not name a type; did you mean ‘int’?

  3. tm1637.set(BRIGHT_TYPICAL); теперь светит 21-ю строку
    В предыдущем замечании как видно int было написано с Большой буквы
    21 строка: ошибка — ‘class TM1637’ has no member named ‘set’; did you mean ‘setDp’?
    Кто писал эту фигню?

Добавить комментарий для Михаил Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code