///////////////////////////////////////////////////////////////////////
//
// 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);
};
};
}
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
+30 |
1988
80
|
+54 |
3241
102
|
+10 |
2938
71
|
Хоть 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
https://aliexpress.com/item/item/Special-promotions-LCD-1602-module-Blue-screen-IIC-I2C-for-arduino-LCD1602-Adapter-plate/1967124495.html
Вероятно микросхема выйдет из строя под воздействием разрядного тока конденсаторов фильтра, который будет значительно больше трех ампер. Реле уж точно не отработает превышение тока. Да и есть сомнения что сама микросхема успеет…
А такая ситуация вполне возможна.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.