Цифровой датчик INA219 для измерения потребляемого тока, напряжения и мощности, емкости аккумуляторов

После переделки шуруповерта на литий возникла идея сделать зарядное устройство по аналогу с фабричными образцами с измерением тока, напряжения и емкости аккумуляторов. Собственно для этого нужен источник питания, плата заряда аккумуляторов по принципу CC CV и модуль индикации параметров. Остановимся собственно на модуле индикации вышеуказанных параметров. Этот модуль даст возможность измерить реальную емкость заряжаемого аккумулятора(или аккумуляторной сборки).

Основой модуля индикации является датчик напряжения и тока типа INA219 приобретенный на Алиэкспресс. Эта платка рассчитана на измерение значений напряжения до 26 В и значений тока до 3,2 А. Все измеренные параметры по шине I2C передаются на Ардуино. Этот датчик определяет сразу несколько параметров: мощность и емкость в мАч, ток и напряжение.

Характеристики датчика INA219.
1) Пределы измеряемых напряжений: от 0 до 26 В;
2) Напряжение питания датчика: от 3.0 до 5.5 В;
3) Параметры по измеряемому току –максимум 3,2А ;
4) Точность измерений значений напряжения и тока до 1%.

Датчик INA219 не требует дополнительной обвязки, достаточно только подать питание на сам датчик, подключить силовой плюсовой и минусовой провода и соединить по интерфейсу I2C с Ардуино. Использовать модуль можно в схемах где необходимо контролировать данные в ходе зарядки и разряда аккумуляторов. Также можно применить датчик INA219 в приборах питания в качестве блока контроля напряжения и тока подключенных потребителей.

В основу прибора будут входить собственно сам датчик INA219, плата Arduino (можно применить любой вариант- Uno, Nano, Pro Mini), двухстрочный экран LCD1602 с платой интерфейса I2C, модуль реле на 5В.

Перечень инструментов и материалов.
-плата Ардуино Nano-1шт;
-датчик INA219-1шт;
-двухстрочный дисплей LCD1602с платой интерфейса I2C-1шт;
-модуль реле на 5вольт-1шт;
-зарядное устройство от телефона для питания схемы-1шт;
-соединительные провода;
-паяльник;
-тестер;
пластмассовая распредкоробка -1шт;
-понижающая плата 5А -1шт.

Шаг первый. Сборка схемы блока индикациии на датчике INA219.

Собираем схему устройства с помощью проводов с разъемами. Входные и выходные силовые провода, через которые будет питаться нагрузка, берем сечением 1-1,5 кв,мм. Питание модулей схемы будет осуществляться от зарядное устройства от телефона через USB разъем платы Ардуино Nano, а далее от контактов +5 и Gnd. Связь датчика INA219 с Ардуино по интерфейсу I2C проходит по выводам CLK и SDA. Адрес датчика INA219 можно при необходимости изменить перепайкой контактов А1 и А0. Очень аккуратно и внимательно собирайте схему-датчик своими контактами V+, V- должен быть включен последовательно нагрузке, также INA219 не любит переполюсовок. Не соблюдая этих требований можно легко его вывести из строя!

В корпусе распредкоробки вырезаем окно для дисплея LCD1602, внизу делаем отверстие для USB разъема платы Ардуино.

Шаг второй. Программирование устройства.
Нужно установить библиотеку для датчика INA219. Она есть в среде IDE ардуино. Нажимаем «Скетч» далее «Подключить библиотеку» затем «Управлять библиотеками». В поисковой строке набираем «INA219». Находит Adafruit INA219 by Adafruit версия 1.0.3» устанавливаем.
Загружаем скетч.

 Показать / Скрыть текст#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_INA219.h>

const int relay_pin = 2; // pin подключения реле
// const float minimal_voltage = 2.8;
const float minimal_voltage = 2.8; // минимальное напряжение отключения нагрузки
const int window_sec = 3; //время обновления показаний экрана LCD

float voltage = 0;
float current = 0;
float power = 0;

float voltage_display = 0.0;
float current_display = 0.0;
float power_display = 0.0;

float voltage_sum = 0.0;
float current_sum = 0.0;
float power_sum = 0.0;

float capacity = 0.0;
float shuntvoltage = 0;
float busvoltage = 0;

int counter = 0;
int seconds = 0;
int minutes = 0;

boolean working = true;

unsigned long timelastinstance;
unsigned long now;

// LiquidCrystal_I2C lcd(0x27,16,2); //адрес дисплея
LiquidCrystal_I2C lcd(0x3F,16,2);
Adafruit_INA219 ina219;

void setup() {
Serial.begin (9600);
lcd.init();
lcd.clear();
lcd.setBacklight(HIGH);
pinMode(relay_pin, OUTPUT);
ina219.begin();
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
voltage = busvoltage + (shuntvoltage / 1000);
if (voltage > minimal_voltage) {digitalWrite(relay_pin, HIGH);}
else {working = false; lcd.setCursor(0, 1); lcd.print("OFF");};
}

void loop() {
if (working){
now = millis();
if ((now — timelastinstance) >= 1000) {
timelastinstance = now;
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current = ina219.getCurrent_mA();
power = ina219.getPower_mW();
voltage = busvoltage + (shuntvoltage / 1000);

voltage_sum += voltage;
current_sum += current;
power_sum += power;

counter += 1;
seconds += 1;
if (seconds >= 60) {
minutes+=1;
seconds = 0;
};

if (counter >= window_sec) {
voltage_display = voltage_sum/float(counter);
current_display = current_sum/float(counter);
power_display = power_sum/float(counter);
capacity += current_display*window_sec/3600.0;
voltage_sum = 0.0;
current_sum = 0.0;
power_sum = 0.0;
String seconds_display = String(seconds);
if (seconds < 10){seconds_display = '0'+seconds_display;};
String minutes_display = String(minutes);
if (minutes < 10){minutes_display = '0'+minutes_display;};

String dataString = minutes_display+":"+seconds_display+" U= "+String(voltage_display)+" I= "+String(current_display)+" P= "+String(power_display)+" mAh= "+String(capacity);
dataString.replace(".",",");
dataString.replace(" ","t");
Serial.println(dataString);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(voltage_display,2);
lcd.print("V");
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(8, 0);
lcd.print(current_display,0);
lcd.print("mA");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(power_display,0);
lcd.print("mW");
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(capacity,0);
lcd.print("mAh");

counter = 0;
if (voltage_display <= minimal_voltage) {
digitalWrite(relay_pin, LOW);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("OFF");
working = false;
};
};
delay(10);
};
};
}

Обычно прибор сразу начинает работать. В мониторе порта можно увидеть все данные измерений.
Фото монитор порта

Шаг третий. Проверка работоспособности устройства.
Без нагрузки прибор показывает текущие значения напряжения. Подключаем нагрузку и на дисплее видим значения напряжения, тока, потребленной мощности и емкости.Если надо проводить зарядку литиевых аккумуляторов то необходимо использовать плату CC CV. Она даст возможность регулировать как напряжение так и ток заряда. . Эту платку можно разместить вместе с другими. Тогда в этом случае получится полноценное устройство для зарядки таких аккумуляторов.

Чтобы определить емкость аккумулятора нужно подключить его в качестве источника перед INA219, а на выходной провод подключить нагрузку(например автолампу). В скетче устанавливается нижний предел отключения нагрузки 2,8 Вольт-значение надо подобрать по даташиту ваших аккумуляторов. При достижении напряжения 2,8 Вольта реле отключит нагрузку и на дисплее увидим реальную емкость аккумулятора в в миллиамперчасах. Чтобы опять включить прибор в работу надо сбросить питание 5 Вольт на Ардуино или установить кнопку сброса на контакт RST платы Ардуино и GND.

Данной самоделкой можно определить емкость как единичного аккумулятора так сборки из нескольких аккумуляторов (блока батарей для шуруповерта).

Подробнее можно посмотреть в видео

Читателям сайта всего наилучшего и в творчестве и в жизни !

Источник: usamodelkina.ru

Добавить комментарий