цена за 3 шт.
У нас будет свой контроллер заряда/разряда. С экраном и графиками!
Датчик напряжения и тока. Измеряет напряжения до 26 вольт и токи до 3,2 амера. Отличительной особенностью является то, что он подсоединяется по шине IIC, что дает ряд преимуществ. Он лучше, чем аналоговые датчики, защищен от помех, он не занимает аналоговый вход контроллера, он определяет сразу три величины: ток, напряжение и мощность.
У меня есть зарядка для аккумуляторов — Imax B6 mini. Хороший, в принципе, аппарат, я им даже автомобильный аккумулятор заряжал. Но долго, конечно. А уж разряжает он совсем медленно: максимальный ток 400мА. Можно заряжать аккумуляторы и обычным лабораторным блоком питания, он умеет и СС и CV, но увы, он не подсчитает отданный в аккумулятор ток. Было время, я прилаживал USB доктора, чтобы подсчитать емкость, но это, конечно же, временная мера. Все равно он не строил графиков зарядки, он не мог отключать зарядное устройство при достижении нужного напряжения, он не мог отключать нагрузку при просадке напряжения во время тестового разряда.
Наконец, дошли руки сделать штуковину, которая будет все это делать. Заказал три датчика. Модули и датчики я всегда заказываю по 2-3 штуки, это удобно: один экземпляр для работы, один для тестирования и отладки, один запасной.
Вот что приехало:
Вскрываем. Внутри сам датчик, колодка для подключения нагрузки, штырьки для подключения датчика к контроллеру.
Сделано аккуратно, детальки лежат ровненько, флюс смыт, любо-дорого посмотреть.
На плате сама микросхема сенсора, один конденсатор, батарея резисторов и шунт 0,1Ом. Имеются две площадочки, на которые можно посадить соплю из припоя, чтобы изменить адрес устройства по шине IIC.
В большие отверстия впаиваем колодку.
Маленькие для подключения гребенки: SDA и SDL — шина I2C, плюс и земля — питание, два остальных дублируют силовой вход датчика.
Что же из себя представляет микросхема датчика: Обратимся к первоисточнику:
https://cdn-shop.adafruit.com/datasheets/ina219.pdf. Тут приведена схема с пояснением принципов работы:
Сигнал с шунта и с входного напряжения попеременно через переключатель подается на усилитель, затем на АЦП, после значения напряжения складываются в регистр напряжения, значения тока — в регистр тока. Произведение двух значений — в регистр мощности. Далее по интерфейсу IIC все это отдается в ответ на запрос.
С теорией все понятно, переходим к практике. Я соединил проводами этот датчик, Ардуино Про Мини, ЖК дисплей 1602 и релюшку. Все это сложил в распаячную коробку и запитал от микро-юсб гнезда. Наружу вывел две пары проводов: одна для источника тока, вторая для потребителя. Вот что у меня получилось:
Написал небольшой скетч. Вот он:
ina219.ino
///////////////////////////////////////////////////////////////////////
//
// Battery charge/discharge controller:
// - writes a log with voltage, current, power and capacity
// - switches off the load when max or min voltage achieved
// Based on INA219 sensor connected to IIC bus
//
// components:
// 1) ardiono Pro Mini/Nano/Uno
// 2) relay
// 3) 1602 LCD display
// 4) INA 219 sensor
// 5) OpenLog module to store a log file - optional
//
// © tykhon, 2018
//
///////////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_INA219.h>
const int relay_pin = 2; // pin to connect relay
// const float minimal_voltage = 3.2; // minimal voltage to switch off the load
const float minimal_voltage = -1.0; // minimal voltage to switch off the load
const int window_sec = 5; // update LCD and log interval
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);
};
};
}
Для работы используется библиотека от Adafruit, ее можно найти вот тут:
https://learn.adafruit.com/adafruit-ina219-current-sensor-breakout/downloads
Работает прямо из коробки: скачиваем, распаковываем с папку с библиотеками Ардуины, запускаем пример из папки с библиотекой, работает сразу и без танцев с бубном.
Скетч выдает в порт значения напряжения, тока, мощности и емкости батареи. Примерно вот так:
39:00 U= 4,08 I= 404,66 P= 1624,40 mAh= 254,40
39:05 U= 4,08 I= 397,22 P= 1592,40 mAh= 254,95
39:10 U= 4,08 I= 404,82 P= 1644,40 mAh= 255,51
Далее мне захотелось проверить точность прибора. Подключаем источник опорного напряжения.
2,5 вольт:
5,0 вольт:
7,5 вольт:
10 вольт:
Ну просто замечательно! Идеальная точность! Конечно, можно было бы посмотреть что там в третьем знаке после запятой, но мне совершенно достаточно двух.
Ток с аналогичной точностью мне сверить не с чем, но т.к. ток измеряется тем же АЦП, только подключенным к шунту, то можно предположить, что точность его измерения тоже хорошая, ведь шунт наверняка обладает линейной характеристикой в разумном диапазоне температур.
Подключаем аккумулятор как источник тока и лампочку как нагрузку. Вот лампочка горит:
А вот напряжение перешло выставленный минимальный порог и реле отключило лампу:
Работает!
Теперь сверим показания Imax и прибора на датчике INA219:
Совпадение очень хорошее!
Если вместо адаптера com-usb к ардуино подключить модуль OpenLog, то все, что выводилось в компорт, будет складываться в текстовый файл на флешку. Потом этот текстовый файл можно загрузить в Exel и построить график заряда-разряда. Иногда это бывает очень полезно, когда аккумулятор полуживой, то график его зарядки перестает быть ровненькой горкой. Как правило, сначала напряжение взлетает, потом падает, потом снова нарастает, но уже спокойнее. Аккумулятор может начать греться. Так что график — вещь полезная.
Вот график зарядки аккумулятора от Imax:
А вот от самоделки:
Что хочется сказать в заключении:
Датчик очень неплох, нравится и удобный интерфейс и точность. Хорошо бы ток был побольше, ампер 10 бы. Но это можно сделать и самому, заменив шунт и программно умножая показания на коэффициент.
Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Хоть 100А, но точность измерения малых токов окажется неприемлемой.
8ма вполне себе точность
Это если оставить 320мВ, но на шунте будут дикие потери мощности (10 Вт)
но я ничего не понял
но если его повысить скорее всего внешней обьвязкой то возможно и точность изменится
наверно он это имел в виду
Вот после него, скорее всего, стоит уже усилитель с постоянным усилением с 40 мВ до, например, 1.2 В или какая там опора используется для АЦП :)
Подсказка — резисторы делителя придётся брать супервысокопрецизионные, чтобы данная система работала корректно
Достаточно чтобы они в обоих плечах совпадали в каких-то пределах, скажем, в 0.5%, то есть чтобы коэффициент деления был одинаковым :)
Схема симуляции (VCC = 50 вольт):
Вот график и напряжения между Vs1 и Vs2 при разном значении одного из резисторов в одном делителе — R5. По оси X — сопротивление нагрузки от 10 Ом до 10 кОм, по Y — напряжение между Vs1 и Vs2 в милливольтах:
Появляется просто смещение, которое легко вычесть.
2. Резисторы не имеют абсолютно одинаковый ТКС
В результате, значение измеряемого тока будет сильно плавать.
При разнице сопротивлений всего 0,5% (в Вашей симуляции) сдвиг получается 70мВ, а это аж 0,7А, что абсолютно неприемлемо при дискрете измерения тока 0,0008А
Остальное несущественно. ТКС у одинаковых резисторов будет практически одинаков. Дискрету сдвиг только слегка увеличит за счет ненулевой нижней точки, тем более, что резисторы можно подобрать с разбросом менее 0.5% :)
Но спасибо, действительно было непонятно, добавил в шапку уточнение по цене.
Итого — 601 руб.
На Али то же самое с платной доставкой — 514 руб.
Ещё вопросы?
Али уже настолько плотно вошла в обиход, что это как отксерить, погуглить, и купить на Али.
В итоге посылка не пришла, написал на сайте что не пришла, мне написали, что выслали повторно и этим все и закончилось.
Далее заказал эти же часы на Али и с него все пришло.
Цена ошибки: около 900 руб.
Было это года полтора назад.
Ясно что больше заказывать там ничего не буду, хотя люди пишут, что у них проблем нет.
С Али никогда проблем не было как с неполученной посылкой, так и с некачественным товаром. Правда иногда дело доходило до службы поддержки, но все споры разрешались в мою пользу.
Из этих 208 заказов я получил все 208, с десяток не дошли и приходилось обращаться в службу поддержки, после чего его без проблем переотправляли. Часть недоставленных товаров я все же получил спустя время, отписывался по поводу доплаты чтобы было честно, но на такие сообщения уже не отвечали.
Почему не написали еще раз в техподдержку? Почему не написали в пейпал, который в 90% обращений возвращает деньги покупателю?
а сама микруха 90 стоит
так что самому изготавливать нет смысла
Они только подходят, при проверке БП после ремонта или при первом включении БП, из коробки (для страховочной лампочки 220V).
В-принципе, у вас не особо высокоточное изделие, падение чувствительности не должно особо сказаться.
И… вот еще что — лучше было-бы повысить точность/дискретность результатов. Во-первых, «лесенка» на графиках, это моветон. )) Во-вторых, это полезно — для графиков напряжения. Процесс заряда идет медленно и полезно знать, что что-то происходит. У меня для этого В7-38, очень удобно. Делается просто — постоянно оцифровывать и усреднять с удалением «не-обычных» значений (фильтрация шума). Так можно выиграть еще 1-2 разряда на индикаторе.
но я бы на его месте делал измерение хотя бы 5 раз в секунду и усреднял скользящим окном :)
Вывод мВт•ч тоже надо добавить, даже на 1602 хватит места: верхняя строка для мгновенных показателей, нижняя для накопленных (например;)
Замечательный конструктив использован для 1602, в оффлайне как-то не попадался на глаза…
wifi/btкнопку для установки времени опроса, возможность питания от проверяемого аккума, автоотключение дисплея…В то же время, 50÷100 первичных отсчётов можно^ просто в оперативке сохранить.
^ или нельзя;)
Ну и 3 ампера на шунте 0.1 ома — это падение напряжения 0.3 вольта, как-то многовато :)
Ну и слегка подправить программку
Для таких токов лучше уже использовать токовые датчики на эффекте Холла :)
в программе настроить режим PGA=+2 и на стандартном шунте 30А будет выделяться всего 30х0,075=2,25Вт на токе 30А и 2,5Вт на максимальном для этого режима токе 32А
Во-первых, не три, а четыре и восемь десятых ампера, а во-вторых, кто Вам мешает включить две-три-четыре-пять лампочек параллельно, чтобы довести ток до требуемого значения?
Можно, поставив другой шунт.
А как быть с общим потреблением? Если упростить задачу: нужно мониторить потребление на сата, в реальном времени, что посоветуете?
Есть соответствующая в Windows и в Linux.
Можете, но только относительно свободного минуса одной из батарей. То есть один датчик будет мониторить напряжение первой батареи, а второй датчик — сумму напряжении первой и второй батарей.
Как я понял, у Вас есть две АКБ, соединенные последовательно, и Вам нужно контролировать напряжение на обеих АКБ. Контроль напряжения с общим минусом кажется вполне нормальным, и как при этом коммутируется нагрузка — значения не имеет :)
Но, может быть, я чего-то недопонимаю :)
Но и у имакса при разряде есть один недостаток:
www.youtube.com/watch?v=QVsGGDFiBHA
в плане их точности %
а тоесть зелёные белые чёрные на этих платах
у другого зелёные тоже 1%
может это некий вариант показателя термостабильности
Как бы на этих модулях сделать контроллер напряжения 4S литиевого аккумулятора?
Элементарная схема с общей землей для каждого из ч-х модулей и вычитанием напряжений понятна,
а как каждую банку отдельно измерять?
и экранчики на 4 строки с ними думаю будет более информативнее
в задумке сделать на блоки питания такие
тогда можно выкинуть китайский сдвоеный вольтамперметр у которого напряжение начинает врать если отклоняться от откалиброваного значения
Видел список, но там же не указаны конкретные железки. :)
Это очевидно, но понятно не для всех. А это уменьшение ЦА и как следствие снижение продажи конкретного, обозреваемого девайса.
Имхо дописывать не буду, но считается хорошим тоном во всех отношениях, если автор топка при создании чего-либо, модернизации, разработке и иже, в конце подводит итог: сколько времени потратил, что купил и почему, каков был бюджет, для чего это делал. Получил ли желаемое или оно того не стоит и прочее.
Типа/пример: коробочку купил в леруа, потому что дешево, но подойдет любая размером «таким-то», датчики юзал такие-то, но вот ссылки на аналогичные и т. д. Это расширит ЦА, во всех смыслах. Вам «кармы» больше даст и иже. Тут могу много букв написать, но не буду. Просто скажу так/пример: я читаю блоги Кирича по ЛБП потому что он все расписывает детально, дает ссылки и иже. То есть мне не нужно обращаться к гуглу, задавать ему много вопросов и т. д.
2) Либо можно поискать так: www.google.ru/search?newwindow=1&biw=1920&bih=1089&tbm=isch&sa=1&ei=IpbUW5jpNoWurgTksq7YCg&q=1602+lcd+конвертор+i2c&oq=1602+lcd+конвертор+i2c&gs_l=img.12...0.0.0.54958.0.0.0.0.0.0.0.0..0.0....0...1c..64.img..0.0.0....0.l4YUGe4PI6Y
ru.aliexpress.com/item/Special-promotions-LCD-1602-module-Blue-screen-IIC-I2C-for-arduino-LCD1602-Adapter-plate/1967124495.html
Вероятно микросхема выйдет из строя под воздействием разрядного тока конденсаторов фильтра, который будет значительно больше трех ампер. Реле уж точно не отработает превышение тока. Да и есть сомнения что сама микросхема успеет…
А такая ситуация вполне возможна.