Подключение альтернативного аккумулятора к Сяокату

Форум / Электротранспорт / Электросамокаты / Xiaomi Mijia Electric Scooter / Подключение альтернативного аккумулятора к Сяокату
#аккумулятор
#модернизация
+
Форум / Электротранспорт / Электросамокаты / Xiaomi Mijia Electric Scooter / Подключение альтернативного аккумулятора к Сяокату
Открыть шапку темы
Akim476
Новичок
Rating: 5
Akim476
08 june 2019, 14:25
Posted: 08 june 2019, 14:25
Ответ пользователю
Markus193 : 08 june 2019, 14:23
на это сообщение (развернуть)
Скриншот параметров дайте

Скриншот параметров дайте

Ой, ещё русский газ забыл. Самокат прошит без него


Markus193
Участник
Rating: 32
Markus193
08 june 2019, 14:28
Posted: 08 june 2019, 14:28
Ответ пользователю
Akim476 : 08 june 2019, 12:50
на это сообщение (развернуть)
Видимо не в этом проблема, перепрошил, попробовал прокатится, ошибка всё ещё появляется 

Видимо не в этом проблема, перепрошил, попробовал прокатится, ошибка всё ещё появляется 

Как вариант родные ячейки умирают

Akim476
Новичок
Rating: 5
Akim476
08 june 2019, 14:29
Posted: 08 june 2019, 14:29
Ответ пользователю
Markus193 : 08 june 2019, 14:28
на это сообщение (развернуть)
Как вариант родные ячейки умирают

Как вариант родные ячейки умирают

У меня есть другая батарея, могу попробовать её подключить

Akim476
Новичок
Rating: 5
Akim476
08 june 2019, 14:42
Posted: 08 june 2019, 14:42
Ответ пользователю
Markus193 : 08 june 2019, 14:28
на это сообщение (развернуть)
Как вариант родные ячейки умирают

Как вариант родные ячейки умирают

Подключение другой батареи результата не дало

Akim476
Новичок
Rating: 5
Akim476
08 june 2019, 18:12
Posted: 08 june 2019, 18:12
Ответ пользователю
Markus193 : 08 june 2019, 14:28
на это сообщение (развернуть)
Как вариант родные ячейки умирают

Как вариант родные ячейки умирают

Попробовал немного проехаться, теперь самокат не включается ВООБЩЕ :с

Markus193
Участник
Rating: 32
Markus193
08 june 2019, 21:52
Posted: 08 june 2019, 21:52
Ответ пользователю
Akim476 : 08 june 2019, 18:12
на это сообщение (развернуть)
Попробовал немного проехаться, теперь самокат не включается ВООБЩЕ :с

Попробовал немного проехаться, теперь самокат не включается ВООБЩЕ :с

Смотрите родную бмс,кстати проверьте контакты на батарее,возможен отвал.возможно банальное совпадение.а может провод от бмс отошёл на контроллере и так бывает. Не забудьте проверить напряжение по ячейкам.

Akim476
Новичок
Rating: 5
Akim476
09 june 2019, 22:50
Posted: 09 june 2019, 22:50
Ответ пользователю
Markus193 : 08 june 2019, 21:52
на это сообщение (развернуть)
Смотрите родную бмс,кстати проверьте контакты на батарее,возможен отвал.возможно банальное совпадение.а...

Смотрите родную бмс,кстати проверьте контакты на батарее,возможен отвал.возможно банальное совпадение.а может провод от бмс отошёл на контроллере и так бывает. Не забудьте проверить напряжение по ячейкам.

Проверил, показывает 10 вольт. Походу это было просто совпадение и отвалились контакты. Решил возвращать всё обратно и делать 10s5p. Так как мой сяокат на полном приводе он и раньше хорошо ехал, я понял что мне и этого хватало

pan1
Участник
Rating: 17
pan1
09 june 2019, 23:22
Posted: 09 june 2019, 23:22
[quote="Nivad"]

Согласно пункта 3. Отключение нагрузки должно осуществляться согласно даташита если напряжение на ЛЮБОЙ из ячеек опуститься ниже 3в. Если у вас отключается по общему минимальному напряжению, то это очень плохо и при дегарадации одной из ячеек она очень быстро умрет. 

То что вы описывали очень похоже на попытку "восстановления" ячейки путем заряда/разряда. Такой метод не применяется ни li-ion ячейках.  Утверждаете  что разница между ячейками была один вольт?! Если предположить что у вас минимальное напряжение было 3в - (что  согласно даташита соответствует пустой батареи) тогда на другой 4в (что примерно равно 80% емкости) . в таком случае  первая банка деградировала до 20% и ее нужно в утитль. Если предположить что минимальное напряжение ниже 3в, то проблема в китайской БМС которая позволила разрядить ячейку ниже этого уровня.  

В любом случае- вы описали процесс цикла заряд/раздяд ячейки, который не имеет никакого отношения к балансировке.  Процесс у вас ручной и разовый далее балансировкой будет заниматься БМС. 

еще раз рекомендую найти и изучить характеристику напряжение/емкость.  В конце разряда напряжение падает очень быстро.  

между 3.0в и 3.2в согласно графика меньше процента, но это не важно тк если хоть одна из ячеек будет отличаться по емкости на 1%, как бы вы ее не балансировали в конце будет разница в напряжении. 

[/quote]

Отсутствовал какое-то  время, теперь отвечу: 

Ну вообще всё не так поняли, будто  я не по-русски написал!

п.3 - отключается как у всех, по напряжению  под НАГРУЗКОЙ! на любой ячейке.

Никакого  заряда-разряда я не делал!!, только ПОДЗАРЯД, однократный, т.е выравнивание, оно же балансировка. Далее разряд во время поездки.

Про разницу до 1 В (примерно). Если на 1 ячейке заряд около 1-2 % (~ 3,2В на ХХ), то при нагрузке 10-15А происходит мгновенный провал до ~ 2,5 В. На осталных ячейках заряд 10-15 % (3,4-3,5В ХХ), и 10-15 А держит почти без просадки, вот приложение и фиксирует разницу 1 В (и я это вижу и про это и писал). И Сяо (через 1-2сек) отрубается. Всё просто и понятно. Актуальная емкость ячейки 85-90%  от номинала.

А в утиль можете сдавать что угодно, свои супер бмски, например, меня всё устраивает.

Я сделал то, что сделал, и получил тот результат, который предполагал. Практика критерий истины.

Kle0
Новичок
Kle0
30 june 2019, 14:58
Posted: 30 june 2019, 14:58

Добрый день, господа!

Предстоит вернуть к жизни самокат, оборвали провод габарита, и походу получили кз. Так же на одной банке, обломан контакт. 36в батарея, после бмс 20в и падает. Самокат не стартует с батареей, точнее 5км, и индикация ошибки - 2 длинных и короткий.

подключение, либо отключение 3х контактного провода, не меняет что либо.


Как профессионалы, возможно сразу знаете в чем причина )

Так же, может есть инструкция, по сбору "обманки", ту же ардуино или что ещё.

(Типа такую ардуино, зашивает, вот так подключаем)

(В Украине, просто так купить готовую обманку, достаточно накладно у нас.)

Rin_Tanir
Новичок
Rin_Tanir
25 august 2019, 23:40
Posted: 25 august 2019, 23:40
Ответ пользователю
SurgeSPB : 29 december 2018, 12:11
на это сообщение (развернуть)
Гербер под печатную https://github.com/etransport/m365-bms-emu/tree/master/attiny85/grblСписок компонентов...

Гербер под печатную https://github.com/etransport/m365-bms-emu/tree/master/attiny85/grbl
Список компонентов https://github.com/etransport/m365-bms-emu/blob/master/attiny85/bom-simplified.txt

И пара рендеров

Здравствуйте! Подскажите пожалуйста распиновку ? куда что идёт как я понимаю там где 2 вывода то на плату управления? а 4 провода как подключать к батареи тогда ?


Rin_Tanir
Новичок
Rin_Tanir
25 august 2019, 23:46
Posted: 25 august 2019, 23:46
Ответ пользователю
Xela : 18 november 2018, 19:19
на это сообщение (развернуть)
Я не очень понял все что нужно было поправить. Сделал как смог. Если кто разбирается поправьте меня. Сборка на...

Я не очень понял все что нужно было поправить. Сделал как смог. Если кто разбирается поправьте меня. Сборка на 10s4p

Код:

/*****************************
  
Эмулятор BMS (обманка) для Xiaomi Scooter M365
с измерением напряжения и тока батареи, с измерением температуры по двум датчикам, с вычислением уровня заряда.
Обсуждение:
https://electro.club/forum/podklyuchenie_alternativnogo_akkumulyatora_k_syaokatu

!!!скетч для платы на базе ATMega32U4.
!!!для ATMega328 (у которой нет USB):  1. необходимо удалить из скетча все  что касается Serial, после чего  заменить Serial1 на Serial.  2. напряжение опорного источника 2.56 заменить на 1.1 (для встроенного) или на 5 (для ИОН "по-умолчанию" = +Uпит)
******************************/
//Назначение аналоговых входов const int adc_Vpin = A5;  // назначаем вход АЦП для напряжения шины батареи (через делитель r1/r2) //const int adc_Apin = A3;  // для датчика тока const int adc_V5pin = A1;  // для напряжения +5В (шина питания контроллера) const int adc_T1pin = A0;  // для для датчика температуры 1 (с подтягиванием термистора к шине +5В через Резистор Rth) const int adc_T2pin = A2;  // для для датчика температуры 2
float ref = 2.1; //напряжение используемого опорного источника, В. Встроенный для ATMega32U4 = 2.56 или для ATMega328 = 1.1

float voltage; //действующее напряжение float voltageAvg; //сглаженное напряжение int charge; unsigned int crc; //контрольная сумма
int k = 1;  //начальный коэффициент сглаживания (ускоряет выход на действущее значение при старте) int ku = 10; //постоянный коэффициент сглаживания значений напряжения
//делитель напряжения для АЦП (в канале измерения напряжения батареи): unsigned int r1 = 10000; //верхний кОм (Rbat1) unsigned int r2 = 510; //нижний,кОм (Rbat2) //  Делитель 10мОм / 470-510 кОм при REF=2.56 или 13 МОм / 270 кОм при REF=1.1В  - оптимально для измерения батареи 12S
//Температура int B = 3950; // параметр B термистора (из описания или опытным путем) long R25 = 10000; //сопротивление термодатчика при 25°С, Ом long Rth = 68000; //сопротивление верхнего резистора делителя, Ом  (Rth1, Rth2) //подтягивающий резистор 68 кОм при REF=2.56 или 270 кОм при REF=1.1В
long avg_temp1_adc; long avg_temp2_adc; long avg_u5_adc; //среднее напряжение на шине питания микроконтроллера (через делитель на 2)

//Батарейка unsigned int capacity = 12000; //емкость батареи unsigned int s = 10; //элементов в батарее последовательно
//напряжение (В) на батарее при уровне заряда  (напряжение на 1 элементе * 100 * кол-во элементов последовательно) unsigned int v0 = 2.50 * 100 * s;   // 0% unsigned int v5 = 2.85 * 100 * s;   // 5% unsigned int v10 = 3.10 * 100 * s;  // 10% unsigned int v20 = 3.33 * 100 * s;  // 20% unsigned int v30 = 3.48 * 100 * s;  // 30% unsigned int v90 = 4.02 * 100 * s;  // 90% unsigned int v100 = 4.15 * 100 * s; // 100%
//Для тока signed int current = 0; signed int currentSens = 100;  //чувствительность аналогового датчика тока (мВ/А), для ASC712-20A это 100 мВ/А // signed int currentZiro = 480; //середина АЦП для 0 тока (выше положительный ток, ниже отрицательный ток). Теперь через avg_u5_adc / 2
//Для компенсации значений напряжения под нагрузкой (по току) float resistance = 0.2; //внутреннее сопротивление батареи и проводов, Ом
//буферы для статичных данных byte buf_1B[]= {85,170,6,37,1,27,1,0,1,0,182,255}; byte buf_20[]= {85,170,8,37,1,32,33,36,0,0,0,0,108,255}; byte buf_3B[]= {85,170,4,37,1,59,98,0,56,255};

void setup() {   analogReference(INTERNAL); //используем внутренний опорник (будет 2.56V для Mega32U4 или 1.1V для Mega328)
  Serial.begin(9600);   Serial1.begin(115200); }

signed int tempmath(long avg_temp_adc) {  //функция вычисления температуры   float Rt = avg_temp_adc * Rth / (2.0 * avg_u5_adc - avg_temp_adc); //вычисление сопротивления термистора   float temp = 1.0 / ( log(Rt/R25) / B + 1.0/298 ) - 273; // температура по мнению Стейнхарта и Харта   if (temp < -20) {       return -20; //чтобы не испугать самокат   } else {     return round (temp); //округляем до целого и отдаем градусы Цельсия   } }
void loop() {   //измеряем температуру по двум датчикам и напряжение на шине питания микроконтроллера (для компенсации измерения)   avg_temp1_adc = avg_temp1_adc - (avg_temp1_adc - analogRead(adc_T1pin)) / 3;  //сглаженное значение АЦП для температуры 1   avg_temp2_adc = avg_temp2_adc - (avg_temp2_adc - analogRead(adc_T2pin)) / 3;  //сглаженное значение АЦП для температуры 2   avg_u5_adc = avg_u5_adc - (avg_u5_adc - analogRead(adc_V5pin)) / 3;   //сглаженное значение АЦП для напряжения шины +5В      byte temp1 = tempmath(avg_temp1_adc) + 20; //температура 1   byte temp2 = tempmath(avg_temp2_adc) + 20; //температура 2         //измеренное напряжение батареи   voltage = ( analogRead(adc_Vpin) * ref / 1023.0 ) * ((r1 + r2) / r2) * 100 ; //с учетом входного делителя и множителя 100      //измеренный ток батареи   //current = (( analogRead(adc_Apin) - avg_u5_adc / 2 ) * ref / 1023 ) * 200000 / currentSens ; //с учетом входного делителя (/2) и множителя 100   current = 0   //компенсируем потери напряжения на проводах и внутреннем сопротивлении батареи под нагрузкой   voltage = voltage + resistance * current ;
  //сглаживаем напряжение батареи   voltageAvg = voltageAvg - ( voltageAvg - voltage ) / k;   if (k < ku) k++;  //постепенно увеличиваем время сглаживания до заданного, чтобы быстрее получить правильное значение на старте       //уровень заряда % с линеаризацией   if (voltageAvg <= v0) charge = 0;   if (v0 < voltageAvg && voltageAvg <= v5) charge = 0 + ( 5 - 0 ) * (voltageAvg - v0) / (v5 - v0) ;   if (v5 < voltageAvg && voltageAvg <= v10) charge = 5 + ( 10 - 5 ) * (voltageAvg - v5) / (v10 - v5);   if (v10 < voltageAvg && voltageAvg <= v20) charge = 10 + ( 20 - 10 ) * (voltageAvg - v10) / (v20 - v10);   if (v20 < voltageAvg && voltageAvg <= v30) charge = 20 + ( 30 - 20 ) * (voltageAvg - v20) / (v30 - v20);   if (v30 < voltageAvg && voltageAvg <= v90) charge = 30 + ( 90 - 30 ) * (voltageAvg - v30) / (v90 - v30);   if (v90 < voltageAvg && voltageAvg <= v100) charge = 90 + ( 100 - 90 ) * (voltageAvg - v90) / (v100 - v90);   if (voltageAvg > v100) charge = 100;      unsigned int voltageBat = voltageAvg; //забираем два байта от сглаженного напряжения      unsigned int capacityRem = capacity / 100 * charge;  //вычисляем остаток емкости батареи, мАч   
   //буфер для 31   crc = 0xFFFF - 12 - 0x25 - 0x01 - 0x31 -    lowByte(capacityRem) - highByte(capacityRem) -    lowByte(charge) - highByte(charge) -   lowByte(current) - highByte(current) -   lowByte(voltageBat) - highByte(voltageBat) -    temp1 - temp2;      byte buf_31[]= {0x55,0xAA,12,0x25,0x01,0x31,   lowByte(capacityRem), highByte(capacityRem),   lowByte(charge),highByte(charge),   lowByte(current),highByte(current),   lowByte(voltageBat),highByte(voltageBat),   temp1,temp2,   lowByte(crc),highByte(crc)};    //буфер для 30     crc = 0xFFFF - 14 - 0x25 - 0x01 - 0x30 - 0x01 -    lowByte(capacityRem) - highByte(capacityRem) -    lowByte(charge) - highByte(charge) -   lowByte(current) - highByte(current) -   lowByte(voltageBat) - highByte(voltageBat) -    temp1 - temp2;      byte buf_30[]= {0x55,0xAA,14,0x25,0x01,0x30,0x01,0x00,   lowByte(capacityRem), highByte(capacityRem),   lowByte(charge),highByte(charge),   lowByte(current),highByte(current),   lowByte(voltageBat),highByte(voltageBat),   temp1,temp2,   lowByte(crc),highByte(crc)};    //буфер для 10(12). серийник и емкость для приложения   crc = 0xFFFF - 20 - 0x25 - 0x01 - 0x10 -  'E' - 'L' - 'E' - 'C' - 'T' - 'R' - 'O' - '.' - 'C' - 'L' - 'U' - 'B' - ' ' - ' '  -   0x15 - 0x01 - lowByte(capacity) - highByte(capacity);   byte buf_1012[]= {0x55,0xAA,20,0x25,0x01,0x10,   ' ',' ','E','L','E','C','T','R','O','.','C','L','U','B',   0x15,0x01,   lowByte(capacity),highByte(capacity),   lowByte(crc),highByte(crc)};      //буфер для 10(10) серийник для контроллера   crc = 0xFFFF - 18 - 0x25 - 0x01 - 0x10 -  'E' - 'L' - 'E' - 'C' - 'T' - 'R' - 'O' - '.' - 'C' - 'L' - 'U' - 'B' - ' ' - ' '  -   0x15 - 0x01;   byte buf_1010[]= {0x55,0xAA,18,0x25,0x01,0x10,  ' ',' ','E','L','E','C','T','R','O','.','C','L','U','B',   0x15,0x01,   lowByte(crc),highByte(crc)};      unsigned int cell = voltageBat * 10 / s; //примерное напряжение на одном элементе *1000      //буфер для 40. напряжение на ячейках   crc = 0xFFFF - 32 - 0x25 - 0x01 - 0x40 - 15 * (lowByte(cell) + highByte(cell));   byte buf_40[]= {0x55,0xAA,32,0x25,0x01,0x40,   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(crc),highByte(crc)};      //сливаем в UART контроллеру   Serial1.write(buf_1010,24); //серийник для контроллера   delay(5);   Serial1.write(buf_1012,26); //серийник   delay(5);   Serial1.write(buf_30,20); //статус батареи для контроллера   delay(5);   Serial1.write(buf_31,18); //напряжение и заряд для приложения   delay(5);   Serial1.write(buf_1B,12); //циклы заряда   delay(5);   Serial1.write(buf_20,14); //дата выпуска   delay(5);   Serial1.write(buf_40,38); //ячейки   delay(5);   Serial1.write(buf_3B,10); //пинг        //сливаем в USB   Serial.print("T1 = ");   Serial.print(temp1);   Serial.print(" T2 = ");   Serial.println(temp2);

  delay(80); }
 

Если полностью повторить ваш проект согласно этому сообщению заработает всё или же нужно какие то корректировки внести ? просто не нашёл сообщений кого либо кто по этой схеме отзыв оставил 

Подойдёт ли такая ардуинка ? https://ru.aliexpress.com/item/2040881593.html

Kpojiuk_95
Новичок
Kpojiuk_95
27 august 2019, 15:37
Posted: 27 august 2019, 15:37

@M365 spain Здравствуйте, один раз на улице увидел человека с подобной модификацией, но на простой m365. Очень заинтересовало, не подскажете, сколько будет стоить с материалами и работой?

Rin_Tanir
Новичок
Rin_Tanir
12 september 2019, 11:57
Posted: 12 september 2019, 11:57
Ответ пользователю
Xela : 18 november 2018, 19:19
на это сообщение (развернуть)
Я не очень понял все что нужно было поправить. Сделал как смог. Если кто разбирается поправьте меня. Сборка на...

Я не очень понял все что нужно было поправить. Сделал как смог. Если кто разбирается поправьте меня. Сборка на 10s4p

Код:

/*****************************
  
Эмулятор BMS (обманка) для Xiaomi Scooter M365
с измерением напряжения и тока батареи, с измерением температуры по двум датчикам, с вычислением уровня заряда.
Обсуждение:
https://electro.club/forum/podklyuchenie_alternativnogo_akkumulyatora_k_syaokatu

!!!скетч для платы на базе ATMega32U4.
!!!для ATMega328 (у которой нет USB):  1. необходимо удалить из скетча все  что касается Serial, после чего  заменить Serial1 на Serial.  2. напряжение опорного источника 2.56 заменить на 1.1 (для встроенного) или на 5 (для ИОН "по-умолчанию" = +Uпит)
******************************/
//Назначение аналоговых входов const int adc_Vpin = A5;  // назначаем вход АЦП для напряжения шины батареи (через делитель r1/r2) //const int adc_Apin = A3;  // для датчика тока const int adc_V5pin = A1;  // для напряжения +5В (шина питания контроллера) const int adc_T1pin = A0;  // для для датчика температуры 1 (с подтягиванием термистора к шине +5В через Резистор Rth) const int adc_T2pin = A2;  // для для датчика температуры 2
float ref = 2.1; //напряжение используемого опорного источника, В. Встроенный для ATMega32U4 = 2.56 или для ATMega328 = 1.1

float voltage; //действующее напряжение float voltageAvg; //сглаженное напряжение int charge; unsigned int crc; //контрольная сумма
int k = 1;  //начальный коэффициент сглаживания (ускоряет выход на действущее значение при старте) int ku = 10; //постоянный коэффициент сглаживания значений напряжения
//делитель напряжения для АЦП (в канале измерения напряжения батареи): unsigned int r1 = 10000; //верхний кОм (Rbat1) unsigned int r2 = 510; //нижний,кОм (Rbat2) //  Делитель 10мОм / 470-510 кОм при REF=2.56 или 13 МОм / 270 кОм при REF=1.1В  - оптимально для измерения батареи 12S
//Температура int B = 3950; // параметр B термистора (из описания или опытным путем) long R25 = 10000; //сопротивление термодатчика при 25°С, Ом long Rth = 68000; //сопротивление верхнего резистора делителя, Ом  (Rth1, Rth2) //подтягивающий резистор 68 кОм при REF=2.56 или 270 кОм при REF=1.1В
long avg_temp1_adc; long avg_temp2_adc; long avg_u5_adc; //среднее напряжение на шине питания микроконтроллера (через делитель на 2)

//Батарейка unsigned int capacity = 12000; //емкость батареи unsigned int s = 10; //элементов в батарее последовательно
//напряжение (В) на батарее при уровне заряда  (напряжение на 1 элементе * 100 * кол-во элементов последовательно) unsigned int v0 = 2.50 * 100 * s;   // 0% unsigned int v5 = 2.85 * 100 * s;   // 5% unsigned int v10 = 3.10 * 100 * s;  // 10% unsigned int v20 = 3.33 * 100 * s;  // 20% unsigned int v30 = 3.48 * 100 * s;  // 30% unsigned int v90 = 4.02 * 100 * s;  // 90% unsigned int v100 = 4.15 * 100 * s; // 100%
//Для тока signed int current = 0; signed int currentSens = 100;  //чувствительность аналогового датчика тока (мВ/А), для ASC712-20A это 100 мВ/А // signed int currentZiro = 480; //середина АЦП для 0 тока (выше положительный ток, ниже отрицательный ток). Теперь через avg_u5_adc / 2
//Для компенсации значений напряжения под нагрузкой (по току) float resistance = 0.2; //внутреннее сопротивление батареи и проводов, Ом
//буферы для статичных данных byte buf_1B[]= {85,170,6,37,1,27,1,0,1,0,182,255}; byte buf_20[]= {85,170,8,37,1,32,33,36,0,0,0,0,108,255}; byte buf_3B[]= {85,170,4,37,1,59,98,0,56,255};

void setup() {   analogReference(INTERNAL); //используем внутренний опорник (будет 2.56V для Mega32U4 или 1.1V для Mega328)
  Serial.begin(9600);   Serial1.begin(115200); }

signed int tempmath(long avg_temp_adc) {  //функция вычисления температуры   float Rt = avg_temp_adc * Rth / (2.0 * avg_u5_adc - avg_temp_adc); //вычисление сопротивления термистора   float temp = 1.0 / ( log(Rt/R25) / B + 1.0/298 ) - 273; // температура по мнению Стейнхарта и Харта   if (temp < -20) {       return -20; //чтобы не испугать самокат   } else {     return round (temp); //округляем до целого и отдаем градусы Цельсия   } }
void loop() {   //измеряем температуру по двум датчикам и напряжение на шине питания микроконтроллера (для компенсации измерения)   avg_temp1_adc = avg_temp1_adc - (avg_temp1_adc - analogRead(adc_T1pin)) / 3;  //сглаженное значение АЦП для температуры 1   avg_temp2_adc = avg_temp2_adc - (avg_temp2_adc - analogRead(adc_T2pin)) / 3;  //сглаженное значение АЦП для температуры 2   avg_u5_adc = avg_u5_adc - (avg_u5_adc - analogRead(adc_V5pin)) / 3;   //сглаженное значение АЦП для напряжения шины +5В      byte temp1 = tempmath(avg_temp1_adc) + 20; //температура 1   byte temp2 = tempmath(avg_temp2_adc) + 20; //температура 2         //измеренное напряжение батареи   voltage = ( analogRead(adc_Vpin) * ref / 1023.0 ) * ((r1 + r2) / r2) * 100 ; //с учетом входного делителя и множителя 100      //измеренный ток батареи   //current = (( analogRead(adc_Apin) - avg_u5_adc / 2 ) * ref / 1023 ) * 200000 / currentSens ; //с учетом входного делителя (/2) и множителя 100   current = 0   //компенсируем потери напряжения на проводах и внутреннем сопротивлении батареи под нагрузкой   voltage = voltage + resistance * current ;
  //сглаживаем напряжение батареи   voltageAvg = voltageAvg - ( voltageAvg - voltage ) / k;   if (k < ku) k++;  //постепенно увеличиваем время сглаживания до заданного, чтобы быстрее получить правильное значение на старте       //уровень заряда % с линеаризацией   if (voltageAvg <= v0) charge = 0;   if (v0 < voltageAvg && voltageAvg <= v5) charge = 0 + ( 5 - 0 ) * (voltageAvg - v0) / (v5 - v0) ;   if (v5 < voltageAvg && voltageAvg <= v10) charge = 5 + ( 10 - 5 ) * (voltageAvg - v5) / (v10 - v5);   if (v10 < voltageAvg && voltageAvg <= v20) charge = 10 + ( 20 - 10 ) * (voltageAvg - v10) / (v20 - v10);   if (v20 < voltageAvg && voltageAvg <= v30) charge = 20 + ( 30 - 20 ) * (voltageAvg - v20) / (v30 - v20);   if (v30 < voltageAvg && voltageAvg <= v90) charge = 30 + ( 90 - 30 ) * (voltageAvg - v30) / (v90 - v30);   if (v90 < voltageAvg && voltageAvg <= v100) charge = 90 + ( 100 - 90 ) * (voltageAvg - v90) / (v100 - v90);   if (voltageAvg > v100) charge = 100;      unsigned int voltageBat = voltageAvg; //забираем два байта от сглаженного напряжения      unsigned int capacityRem = capacity / 100 * charge;  //вычисляем остаток емкости батареи, мАч   
   //буфер для 31   crc = 0xFFFF - 12 - 0x25 - 0x01 - 0x31 -    lowByte(capacityRem) - highByte(capacityRem) -    lowByte(charge) - highByte(charge) -   lowByte(current) - highByte(current) -   lowByte(voltageBat) - highByte(voltageBat) -    temp1 - temp2;      byte buf_31[]= {0x55,0xAA,12,0x25,0x01,0x31,   lowByte(capacityRem), highByte(capacityRem),   lowByte(charge),highByte(charge),   lowByte(current),highByte(current),   lowByte(voltageBat),highByte(voltageBat),   temp1,temp2,   lowByte(crc),highByte(crc)};    //буфер для 30     crc = 0xFFFF - 14 - 0x25 - 0x01 - 0x30 - 0x01 -    lowByte(capacityRem) - highByte(capacityRem) -    lowByte(charge) - highByte(charge) -   lowByte(current) - highByte(current) -   lowByte(voltageBat) - highByte(voltageBat) -    temp1 - temp2;      byte buf_30[]= {0x55,0xAA,14,0x25,0x01,0x30,0x01,0x00,   lowByte(capacityRem), highByte(capacityRem),   lowByte(charge),highByte(charge),   lowByte(current),highByte(current),   lowByte(voltageBat),highByte(voltageBat),   temp1,temp2,   lowByte(crc),highByte(crc)};    //буфер для 10(12). серийник и емкость для приложения   crc = 0xFFFF - 20 - 0x25 - 0x01 - 0x10 -  'E' - 'L' - 'E' - 'C' - 'T' - 'R' - 'O' - '.' - 'C' - 'L' - 'U' - 'B' - ' ' - ' '  -   0x15 - 0x01 - lowByte(capacity) - highByte(capacity);   byte buf_1012[]= {0x55,0xAA,20,0x25,0x01,0x10,   ' ',' ','E','L','E','C','T','R','O','.','C','L','U','B',   0x15,0x01,   lowByte(capacity),highByte(capacity),   lowByte(crc),highByte(crc)};      //буфер для 10(10) серийник для контроллера   crc = 0xFFFF - 18 - 0x25 - 0x01 - 0x10 -  'E' - 'L' - 'E' - 'C' - 'T' - 'R' - 'O' - '.' - 'C' - 'L' - 'U' - 'B' - ' ' - ' '  -   0x15 - 0x01;   byte buf_1010[]= {0x55,0xAA,18,0x25,0x01,0x10,  ' ',' ','E','L','E','C','T','R','O','.','C','L','U','B',   0x15,0x01,   lowByte(crc),highByte(crc)};      unsigned int cell = voltageBat * 10 / s; //примерное напряжение на одном элементе *1000      //буфер для 40. напряжение на ячейках   crc = 0xFFFF - 32 - 0x25 - 0x01 - 0x40 - 15 * (lowByte(cell) + highByte(cell));   byte buf_40[]= {0x55,0xAA,32,0x25,0x01,0x40,   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(cell),highByte(cell),   lowByte(crc),highByte(crc)};      //сливаем в UART контроллеру   Serial1.write(buf_1010,24); //серийник для контроллера   delay(5);   Serial1.write(buf_1012,26); //серийник   delay(5);   Serial1.write(buf_30,20); //статус батареи для контроллера   delay(5);   Serial1.write(buf_31,18); //напряжение и заряд для приложения   delay(5);   Serial1.write(buf_1B,12); //циклы заряда   delay(5);   Serial1.write(buf_20,14); //дата выпуска   delay(5);   Serial1.write(buf_40,38); //ячейки   delay(5);   Serial1.write(buf_3B,10); //пинг        //сливаем в USB   Serial.print("T1 = ");   Serial.print(temp1);   Serial.print(" T2 = ");   Serial.println(temp2);

  delay(80); }
 

Здравствуйте, спасибо большое за схему и скетч, собрал по вашей схеме обманку  на базе Arduino nano , единственное по невнимательности сначала собрал делитель с использованием 10мом/510ком, но потом после того как пересобрал с использованием 13мом/270ком встало на свои места, но показания и реальные значения отличались и я подрегулировал отображаемое напряжение в скетче изменением значений сопротивлений в делителе. Температура тоже отображается в программе +-2 градуса примерно .

Rin_Tanir
Новичок
Rin_Tanir
25 september 2019, 6:11
Posted: 25 september 2019, 6:11

Здравствуйте, кто может подсказать , решил пересобрать обманку на Ардуино pro micro, делитесь 1мом и 510 ком, направление после делителя при 38 вольтах 4,5 вольта , в приложении Ардуино передает 51 вольт . Что не так делаю?

Sergevit
Форумчанин
МоскваRating: 397
Sergevit
25 september 2019, 8:22
Posted: 25 september 2019, 8:22
[quote="Rin_Tanir"]1мом[/quote]

Может попробовать 10 МОм?

Zoydberg
Участник
КиевRating: 32
Zoydberg
25 september 2019, 11:31
Posted: 25 september 2019, 11:31
[quote="Ed01"]вычисляет на основе переданного процента заряда. Передал 200% - показывает 60км)[/quote]

Добрый день.

Помогите пожалуйста, как поправить в прошивке % чтоб показывало верно пробег с допп АКБ.

Кто-то добавил 20%,35%,100%,.. было б классно.

Так как в конструкторе пока не рализированно, можно действительно только % изменить в прошивке БМС.