Крайне неудачный открытый проект зарядка для электромобиля нисан лиф и др тип 1 j1772

daniilguz
Offline
Зарегистрирован: 13.01.2020

Всем любителям дешевизны посвящается

В данной теме пытаюсь собрать зарядку для электромобиля со свободным ПО и регулируемым током из доступных деталей. Буду благодарен за помощь в разработке.

на основе материалов изложеных по следующей ссылке:

https://www.instructables.com/id/Arduino-EV-J1772-Charging-Station/

Защита Узо отдельным блоком, реле отдельным модулем, светодиод  отдельным модулем,включать заряд  реле 30 А или пускатель можете выбрать самостоятельно.

Еще нужно добавить несколько терморезисторов для измерения температуры пистолета самого блока и вилки где он подключается в розетку (пока в разработке.)

Перечень материалов:

Коробка пластиковая 200*100*70

Ардуино уно

набор радиокомпонентов на 5 долларов.

двухполярная dc-dc повышайка для ОУ

модуль дисплея, модуль реле, модуль светодиод , уно прото шилд.

Красивая кнопка герметичная лифтовая, можно с подсветкой :)

Действия

На прото шилде собираем схему измерения тока и схему подачи шим на базе ОУ.

фото схему и фото добавлю чуть позже.

оцилографом проверяем корректность работы шим.

Up to 51A Amps = Duty cycle x 0.6 Duty cycle = Amps / 0.6

10%  6A 
20%  12A 
30%  18A

код программы буду благодарен за помощь.

01#include <LiquidCrystal_I2C.h>
02LiquidCrystal_I2C lcd(0x27,20,4);  // адрес дисплея бывает 0x3F
03int prevbutt =0;                   // переменная для кнопки
04int regim=6;                       // переменная режим зарядки
05int sostoyanie=1;                  //(состояние подключения от 1 до 5)
06int higeside=0;                    //переменная пик вольтажа
07int lowside=0;                     //минимум вольтажа
08int tiks1,tiks2,tiks3,tiks4,tiks5; //переменные уменьшающие количество ошибок
09int tikdisp=0;                     //переменная обновления дисплея
10int sensorValue;                    // переменная в которую читаем показания вольтажа
11const int analogInPin = A1;         //на каком порту мерять напряжение
12float count = 0;                    //будет счетчик киловатт
13const int buttonPin = 14;    // на каком порту кнопка
14const int grePin =  11;      // на каком порту зеленый светодиод
15const int redPin =  13;      // на каком порту красный светодиод
16const int bluPin =  12;      // на каком порту голубой светодиод
17const int pwmout =  10;      // на каком порту шим выход на ОУ
18int buttonState = 0;         // переменная для кнопки
19int outputValue = 0;        // исходящее значение  PWM шим на ОУ
20void setup() {
21//    Serial.begin(9600);         // раскоментировать для отстройки напряжений с аналогового порта
22  lcd.init();                      // инициализация дисплея
23  lcd.backlight();                 // включить подсветку
24  pinMode(grePin, OUTPUT);         //назначение выходов
25  pinMode(bluPin, OUTPUT);         //назначение выходов
26  pinMode(redPin, OUTPUT);         //назначение выходов
27  pinMode(14, INPUT_PULLUP);       //назначение выходов
28  
29  TCCR1A = TCCR1A & 0xe0 | 1;      ///установка режима шим на 10 выход 978 герц
30  TCCR1B = TCCR1B & 0xe0 | 0x0b;   ///установка режима шим на 10 выход 978 герц
31   
32}
33 
34void loop() {
35 
36  buttonState = digitalRead(buttonPin);   // читаем состояние кнопки
37 if (buttonState == HIGH) {               // если нажата
38    if (prevbutt==0){                     // если предидущее отпущено
39      prevbutt=1; delay (50);             // антидребезг
40     
41 if (sostoyanie ==1){regim++;regim++;tikdisp=500; if (regim>=18){regim=6;} lcd.clear();}  // при нажатии меняем режим зарядки только при статусе неподключено
42  
43  }} else {prevbutt=0;}                  // кнопка отпущена        
44   
45  if (regim==6) { analogWrite(10, 24);}//  выбор заполнения шим при выборе тока заряда 0,6*процент заполнения но минимум 10%
46  if (regim==8) { analogWrite(10, 31);}//  выбор заполнения шим при выборе тока заряда
47  if (regim==10){ analogWrite(10, 39);}//  выбор заполнения шим при выборе тока заряда
48  if (regim==12){ analogWrite(10, 46);}//  выбор заполнения шим при выборе тока заряда
49  if (regim==14){ analogWrite(10, 53);}//  выбор заполнения шим при выборе тока заряда
50  if (regim==16){ analogWrite(10, 61);}//  выбор заполнения шим при выборе тока заряда
51 
52   
53   tikdisp++; if(tikdisp>500){
54/////////////////////////выводим на дисплей
55lcd.setCursor(1,0); lcd.print("UA OPEN CHARGE");
56if (sostoyanie ==1){lcd.setCursor(0,1); lcd.print("UAOC Not Connected    ");}
57if (sostoyanie ==2){lcd.setCursor(0,1); lcd.print("UAOC Connected        ");}
58if (sostoyanie ==3){lcd.setCursor(0,1); lcd.print("UAOC Charging         ");}
59if (sostoyanie ==4){lcd.setCursor(0,1); lcd.print("UAOC Ventilation Req. ");}
60if (sostoyanie ==5){lcd.setCursor(0,1); lcd.print("UAOC diod test failed ");}
61lcd.setCursor(0,2); lcd.print("charg current:"); lcd.setCursor(14,2); lcd.print(regim);lcd.setCursor(17,2); lcd.print("A");
62lcd.setCursor(0,3); lcd.print("count:");lcd.setCursor(7,3); lcd.print(count,1);lcd.setCursor(12,3); lcd.print("kWh");
63//////////// моргаем светодиодом
64digitalWrite(grePin, LOW);digitalWrite(bluPin, LOW);digitalWrite(redPin, LOW);
65if (sostoyanie ==1){  digitalWrite(grePin, HIGH);}
66if (sostoyanie ==2){  digitalWrite(grePin, HIGH);digitalWrite(redPin, HIGH);}
67if (sostoyanie ==3){  digitalWrite(bluPin, HIGH);}
68if (sostoyanie ==4){  digitalWrite(redPin, HIGH);}
69if (sostoyanie ==5){  digitalWrite(redPin, HIGH);digitalWrite(bluPin, HIGH);}
70tikdisp=0;}  
71    
72    
73  sensorValue = analogRead(analogInPin);                  // читаем показания аналогового порта для выбора режима работы
74 //   Serial.print("sensor = ");  Serial.println (sensorValue); // раскоментировать для отстройки напряжений
75  if (sensorValue>500){higeside=sensorValue;}            // если показания больше 500 это пик
76  if (sensorValue<500){lowside=sensorValue; }            // если показания меньше 500 это низ
77 
78  /////////////////выбор состояния подключения в зависимости от состояния на аналоговом порту защита от быстрой перемены режимов
79   
80  if (higeside<900                              ) {tiks5++;if (tiks5>=50){tiks5=50; }} else { tiks5 --;if (tiks5<=0){tiks5=0;};}
81  if (higeside>900&& lowside>420                ) {tiks4++;if (tiks4>=50){tiks4=50; }} else { tiks4 --;if (tiks4<=0){tiks4=0;};}
82  if (higeside>900&& lowside>340 && lowside<420 ) {tiks3++;if (tiks3>=50){tiks3=50; }} else { tiks3 --;if (tiks3<=0){tiks3=0;};}
83  if (higeside>900&& lowside>250 && lowside<340 ) {tiks2++;if (tiks2>=50){tiks2=50; }} else { tiks2 --;if (tiks2<=0){tiks2=0;};}
84  if (higeside>900&& lowside<250                ) {tiks1++;if (tiks1>=50){tiks1=50; }} else { tiks1 --;if (tiks1<=0){tiks1=0;};}
85     
86     if (tiks5>=30){sostoyanie = 5;tikdisp=500;}     
87     if (tiks4>=30){sostoyanie = 4;tikdisp=500;}     
88     if (tiks1>=30){sostoyanie = 1;tikdisp=500;}
89     if (tiks2>=30){sostoyanie = 2;tikdisp=500;}
90     if (tiks3>=30){sostoyanie = 3;tikdisp=500;}
91           
92 
93}

 

daniilguz
Offline
Зарегистрирован: 13.01.2020

добавки к проекту схемы распайки модулей.

если вы покупаете модули то первые две схемы Вам не нужны. Только последняя для подачи шим на вывод авто.

модуль лэд

организация шим сигнала

b707
Offline
Зарегистрирован: 26.05.2017

daniilguz пишет:

код программы буду благодарен за помощь.

пока не понятно, какая помощь требуется

daniilguz
Offline
Зарегистрирован: 13.01.2020

Нет

daniilguz
Offline
Зарегистрирован: 13.01.2020

помогите пож. сделать несущую частоту ШИМ в пределах стандарта 980-1020 гц.

sadman41
Offline
Зарегистрирован: 19.10.2016
 
Uno, Nano, Mini
 
pins 3, 5, 6, 9, 10, 11: 490 Hz 
pins 5 and 6: 980 Hz
daniilguz
Offline
Зарегистрирован: 13.01.2020

Проверю спасибо, пока только меньше 980 получалось.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

daniilguz пишет:

помогите пож. сделать несущую частоту ШИМ в пределах стандарта 980-1020 гц.

Вот здесь есть пример как делать ШИМ произвольной частоты.

Igor_116
Offline
Зарегистрирован: 09.11.2017

эта ветка для оконченных  проектов.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Сгорела машина.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Да уж

b707
Offline
Зарегистрирован: 26.05.2017

"окончательный код" ? - кровь из глаз... Может вы хотели сказать  "черновик" ?

Вместо пяти -шести одинаковых условий используйте switch - case. ... А на месте быстрого накручивания переменных tiks3 и подобное...  может просто два раза прочитать порт с небольшой задержкой?

В строке 96 грубая ошибка, время так считать нельзя

daniilguz
Offline
Зарегистрирован: 13.01.2020

Пожалуй черновик.
Все поправлю.
Только в строка 96 не понял почему нельзя?

b707
Offline
Зарегистрирован: 26.05.2017

daniilguz пишет:
Только в строка 96 не понял почему нельзя?

читайте

http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis

DRON606
Offline
Зарегистрирован: 14.06.2021

daniilguz пишет:
Пожалуй черновик.
Все поправлю.
Только в строка 96 не понял почему нельзя?

Подскажите что в итоге с ваше зарядкой для leaf?

Shurchik
Shurchik аватар
Offline
Зарегистрирован: 29.09.2019

Тоже интересна тема. Что в итоге получилось? Можно повторять?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Shurchik пишет:
Что в итоге получилось?

Вангую, ТС, с его познаниями, сгорел в аццком пламени взорвавшихся литиевых батарей.  

b707
Offline
Зарегистрирован: 26.05.2017

Shurchik пишет:
Тоже интересна тема. Что в итоге получилось? Можно повторять?

не стоит, код полный....

Судя по коду, автору лет тринадцать...

Shurchik
Shurchik аватар
Offline
Зарегистрирован: 29.09.2019

ну по крайней мере старался разобраться. 

Хочется повторения но без выбора тока, с отображением потребленной энергии. Китайцы вовсю уже шлепают но ценник конский. Пистолет есть а вот остальное предстоит собрать. Смотрю варианты.....

b707
Offline
Зарегистрирован: 26.05.2017

Shurchik пишет:

Смотрю варианты.....


если вы программист - не надо "смотреть варианты", пишите сами. А если нет - ей богу, лучше переплатите китайцам, потому как невежественные автокулибины немного надоели тут...

daniilguz
Offline
Зарегистрирован: 13.01.2020

Машина сгорела.

daniilguz
Offline
Зарегистрирован: 13.01.2020

поправил код:

001#include <LiquidCrystal_I2C.h>
002#include   <EEPROM.h>
003 
004LiquidCrystal_I2C lcd(0x27,20,4);  // адрес дисплея бывает 0x3F
005  unsigned long currentTime;       //тайминг
006  unsigned long loopTime;          //тайминг
007int prevbutt =1;                   // переменная для кнопки
008int regim=EEPROM.read(1);;          // переменная режим зарядки
009int prevregim=1;
010int sostoyanie=5;                  //(состояние подключения от 1 до 5)
011int prevsost=5;                    //(состояние подключения от 1 до 5)
012int higeside=0;                    //переменная пик вольтажа
013int lowside=0;                     //минимум вольтажа
014int hs=0;                      //переменная пик вольтажа старый
015int ls=0;                     //переменная низ вольтажа старый
016int so=0;
017int timerh=0;
018int timerm=0;
019int timetik=0;
020byte timecheck=0;
021int tiks1,tiks2,tiks3,tiks4,tiks5; //переменные уменьшающие количество ошибок
022int tikdisp=0;                     //переменная обновления дисплея
023int sensorValue;                    // переменная в которую читаем показания вольтажа
024const int analogInPin = A1;         //на каком порту мерять напряжение
025float count = 0;                    //будет счетчик киловатт
026const int buttonPin = 14;    // на каком порту кнопка
027const int grePin =  11;      // на каком порту зеленый светодиод
028const int redPin =  13;      // на каком порту красный светодиод
029const int bluPin =  12;      // на каком порту голубой светодиод
030const int pwmout =  10;      // на каком порту шим выход на ОУ
031const int relePin=  3
032 
033;       // на каком порту шим выход на ОУ
034int buttonState = 0;         // переменная для кнопки
035int outputValue = 0;         // исходящее значение  PWM шим на ОУ
036int flagt;
037void setup() {
038    Serial.begin(9600);          // раскоментировать для отстройки напряжений с аналогового порта
039  lcd.init();                      // инициализация дисплея
040  lcd.backlight();                 // включить подсветку
041  pinMode(grePin, OUTPUT);         //назначение выходов
042  pinMode(bluPin, OUTPUT);         //назначение выходов
043  pinMode(redPin, OUTPUT);         //назначение выходов
044  pinMode(relePin, OUTPUT);        //назначение выходов
045  pinMode(14, INPUT_PULLUP);       //назначение выходов
046    pinMode(9, OUTPUT);
047  pinMode(10, OUTPUT);
048   
049  cli();
050  TCCR1A = bit(COM1A0) | bit(COM1A1) | bit(COM1B1);
051  TCCR1B = bit(WGM13) | 3;
052  ICR1 = 125;
053  OCR1A = OCR1B = 25;
054  sei();
055  if (regim!=6 &&regim!=8 &&regim!=10 &&regim!=12 &&regim!=14 &&regim!=16 &&regim!=24 ) {regim=6 ; }
056  OCR1A = OCR1B = regim*2;EEPROM.write(1, regim) ;
057}
058 
059void loop() {
060 
061 if (sostoyanie ==1 ){
062  buttonState = digitalRead(buttonPin);   // читаем состояние кнопки
063 if (buttonState == HIGH) {               // если нажата
064    if (prevbutt==0){                     // если предидущее отпущено
065      prevbutt=1; delay (50);              // антидребезг
066      flagt=0;
067      lcd.clear();
068      regim++;regim++;  if (regim>=26){regim=6; }
069      OCR1A = OCR1B = regim*2;EEPROM.write(1, regim) ; // при нажатии меняем режим зарядки только при статусе неподключено
070   }} else {prevbutt=0;}                  // кнопка отпущена        
071 }
072 
073  
074    
075  sensorValue = analogRead(analogInPin);                 // читаем показания аналогового порта для выбора режима работы
076  if (sensorValue>500){higeside=sensorValue;}            // если показания больше 500 это пик
077  if (sensorValue<500){lowside=sensorValue; }            // если показания меньше 500 это низ
078 
079  /////////////////выбор состояния подключения в зависимости от состояния на аналоговом порту защита от быстрой перемены режимов
080   
081  if (lowside>250                               ) {tiks5++;if (tiks5>=15){tiks5=15; }} else { tiks5 --;if (tiks5<=0){tiks5=0;};}
082  if (higeside<680&& lowside<250 &&higeside>580 ) {tiks4++;if (tiks4>=15){tiks4=15; }} else { tiks4 --;if (tiks4<=0){tiks4=0;};}
083  if (higeside<780&& lowside<250 &&higeside>680 ) {tiks3++;if (tiks3>=15){tiks3=15; }} else { tiks3 --;if (tiks3<=0){tiks3=0;};}
084  if (higeside<880&& lowside<250 &&higeside>780 ) {tiks2++;if (tiks2>=15){tiks2=15; }} else { tiks2 --;if (tiks2<=0){tiks2=0;};}
085  if (higeside>880&& lowside<250                ) {tiks1++;if (tiks1>=15){tiks1=15; }} else { tiks1 --;if (tiks1<=0){tiks1=0;};}
086     
087     if (tiks5>=10){sostoyanie = 5;if(prevsost!=5){prevsost=5;flagt=0;}}    
088     if (tiks4>=10){sostoyanie = 4;if(prevsost!=4){prevsost=4;flagt=0;}}     
089     if (tiks1>=10){sostoyanie = 1;if(prevsost!=1){prevsost=1;flagt=0;}}
090     if (tiks2>=10){sostoyanie = 2;if(prevsost!=2){prevsost=2;flagt=0;}}
091     if (tiks3>=10){sostoyanie = 3;if(prevsost!=3){prevsost=3;flagt=0;}}
092       
093   /////////////////////////////////////////////////////////быстрая часть
094 currentTime  = millis(); // считываем время, прошедшее с момента запуска программы
095if((currentTime-loopTime)  > flagt)
096 {     
097 
098/////////////////////////выводим на дисплей
099lcd.setCursor(1,0); lcd.print("UA OPEN CHARGE");
100if (sostoyanie ==1){lcd.setCursor(0,1); lcd.print(" Not Connected   ");timerm=0;timerh=0;}
101if (sostoyanie ==2){lcd.setCursor(0,1); lcd.print(" Connected       ");}
102if (sostoyanie ==3){lcd.setCursor(0,1); lcd.print(" Charging        ");}
103if (sostoyanie ==4){lcd.setCursor(0,1); lcd.print(" Vent. Req       ");}
104if (sostoyanie ==5){lcd.setCursor(0,1); lcd.print(" Diod test failed");}
105if (sostoyanie !=3){timecheck--;}else {timecheck++;} if (timecheck==6){timecheck=1;timerm++;} if (timecheck<0){timecheck=0;}
106if (timerm==60){timerh++;timerm=0;} if (timerm<0){timerm=0;}
107lcd.setCursor(0,2); lcd.print("charg current:"); lcd.setCursor(14,2); lcd.print(regim);lcd.setCursor(17,2); lcd.print("A");
108lcd.setCursor(0,3); lcd.print("timer:"); lcd.setCursor(8,3); lcd.print(timerh);lcd.setCursor(10,3); lcd.print("h ");lcd.setCursor(12,3);lcd.print(timerm); lcd.print(" m");
109 
110// раскоментировать для теста напряжения
111//lcd.setCursor(16,3);lcd.print(higeside,0);
112 
113//////////// моргаем светодиодом
114digitalWrite(grePin, LOW);digitalWrite(bluPin, LOW);digitalWrite(redPin, LOW);
115if (sostoyanie ==1){  digitalWrite(grePin, HIGH);}
116if (sostoyanie ==2){  digitalWrite(grePin, HIGH);digitalWrite(redPin, HIGH);}
117if (sostoyanie ==3){  digitalWrite(bluPin, HIGH);}
118if (sostoyanie ==4){  digitalWrite(redPin, HIGH);}
119if (sostoyanie ==5){  digitalWrite(redPin, HIGH);}
120if (sostoyanie ==3){  digitalWrite(relePin, HIGH);}else {digitalWrite(relePin, LOW);}
121 
122 
123//  
124   loopTime= currentTime;
125   flagt=10000;            //такт проход
126    
127//отправка в сериал напряжений для настройки
128//следующие 9 строк можно закоментировать
129 
130//Serial.print  ("LS    = ");  Serial.println (lowside);
131//Serial.print  ("HS    = ");  Serial.println (higeside);
132//Serial.print  ("regim = "); 
133//if (sostoyanie ==1){Serial.println(" Not Connected   ");}
134//if (sostoyanie ==2){Serial.println(" Connected       ");}
135//if (sostoyanie ==3){Serial.println(" Charging        ");}
136//if (sostoyanie ==4){Serial.println(" Vent. Req       ");}
137//if (sostoyanie ==5){Serial.println(" Diod test failed");}
138//Serial.println(" ");// раскоментировать для отстройки напряжений
139 
140}
141}

 

b707
Offline
Зарегистрирован: 26.05.2017

daniilguz пишет:

поправил код:

код все такой же кривой, как и раньше

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, простой вопрос: что эта тема делает в "проектах"?

daniilguz
Offline
Зарегистрирован: 13.01.2020

Сгорела машина

daniilguz
Offline
Зарегистрирован: 13.01.2020

Есть варианты удалить все свои темы с форума?

daniilguz
Offline
Зарегистрирован: 13.01.2020

Есть варианты удалить все свои темы с форума?

daniilguz
Offline
Зарегистрирован: 13.01.2020

Прошу не повторять моих ошибок, машина сгорела. Закройте ветку пока другие люди не повредили свое имущество. Никому не рекомендую повторять.
Прошу удалить тему или закрыть пожалуйста.

b707
Offline
Зарегистрирован: 26.05.2017

daniilguz пишет:
Сгорела машина

Абсолютно не удивлен. О том, что с твоими навыками не стоит лезть в автоэлектрику - тебя предупреждали еще в начале темы.

Зря потер свою сообщения, где ты доказывал. что "код и такой сойдет, лишь бы дешево....". С ними картинка была бы полнее.

 

Модераторы, предлагю оставить эту тему как назидание другим безголовым автокулибиным. Закройте редактирование, скройте код, но не удаляйте сообщения.

daniilguz
Offline
Зарегистрирован: 13.01.2020

Да согласен.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

daniilguz пишет:
Сгорела машина

фоточки будут?

это не оно?