Крайне неудачный открытый проект зарядка для электромобиля нисан лиф и др тип 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

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

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // адрес дисплея бывает 0x3F
int prevbutt =0;                   // переменная для кнопки
int regim=6;                       // переменная режим зарядки
int sostoyanie=1;                  //(состояние подключения от 1 до 5)
int higeside=0;                    //переменная пик вольтажа
int lowside=0;                     //минимум вольтажа
int tiks1,tiks2,tiks3,tiks4,tiks5; //переменные уменьшающие количество ошибок
int tikdisp=0;                     //переменная обновления дисплея
int sensorValue;                    // переменная в которую читаем показания вольтажа
const int analogInPin = A1;         //на каком порту мерять напряжение
float count = 0;                    //будет счетчик киловатт
const int buttonPin = 14;    // на каком порту кнопка
const int grePin =  11;      // на каком порту зеленый светодиод
const int redPin =  13;      // на каком порту красный светодиод
const int bluPin =  12;      // на каком порту голубой светодиод
const int pwmout =  10;      // на каком порту шим выход на ОУ
int buttonState = 0;         // переменная для кнопки
int outputValue = 0;        // исходящее значение  PWM шим на ОУ
void setup() {
//    Serial.begin(9600);         // раскоментировать для отстройки напряжений с аналогового порта
  lcd.init();                      // инициализация дисплея
  lcd.backlight();                 // включить подсветку
  pinMode(grePin, OUTPUT);         //назначение выходов
  pinMode(bluPin, OUTPUT);         //назначение выходов
  pinMode(redPin, OUTPUT);         //назначение выходов
  pinMode(14, INPUT_PULLUP);       //назначение выходов
 
  TCCR1A = TCCR1A & 0xe0 | 1;      ///установка режима шим на 10 выход 978 герц
  TCCR1B = TCCR1B & 0xe0 | 0x0b;   ///установка режима шим на 10 выход 978 герц
  
}

void loop() {

  buttonState = digitalRead(buttonPin);   // читаем состояние кнопки
 if (buttonState == HIGH) {               // если нажата
    if (prevbutt==0){                     // если предидущее отпущено
      prevbutt=1; delay (50);             // антидребезг
    
 if (sostoyanie ==1){regim++;regim++;tikdisp=500; if (regim>=18){regim=6;} lcd.clear();}  // при нажатии меняем режим зарядки только при статусе неподключено
 
  }} else {prevbutt=0;}                  // кнопка отпущена         
  
  if (regim==6) { analogWrite(10, 24);}//  выбор заполнения шим при выборе тока заряда 0,6*процент заполнения но минимум 10%
  if (regim==8) { analogWrite(10, 31);}//  выбор заполнения шим при выборе тока заряда
  if (regim==10){ analogWrite(10, 39);}//  выбор заполнения шим при выборе тока заряда
  if (regim==12){ analogWrite(10, 46);}//  выбор заполнения шим при выборе тока заряда
  if (regim==14){ analogWrite(10, 53);}//  выбор заполнения шим при выборе тока заряда
  if (regim==16){ analogWrite(10, 61);}//  выбор заполнения шим при выборе тока заряда

  
   tikdisp++; if(tikdisp>500){
/////////////////////////выводим на дисплей
lcd.setCursor(1,0); lcd.print("UA OPEN CHARGE");
if (sostoyanie ==1){lcd.setCursor(0,1); lcd.print("UAOC Not Connected    ");}
if (sostoyanie ==2){lcd.setCursor(0,1); lcd.print("UAOC Connected        ");}
if (sostoyanie ==3){lcd.setCursor(0,1); lcd.print("UAOC Charging         ");}
if (sostoyanie ==4){lcd.setCursor(0,1); lcd.print("UAOC Ventilation Req. ");}
if (sostoyanie ==5){lcd.setCursor(0,1); lcd.print("UAOC diod test failed ");}
lcd.setCursor(0,2); lcd.print("charg current:"); lcd.setCursor(14,2); lcd.print(regim);lcd.setCursor(17,2); lcd.print("A");
lcd.setCursor(0,3); lcd.print("count:");lcd.setCursor(7,3); lcd.print(count,1);lcd.setCursor(12,3); lcd.print("kWh");
//////////// моргаем светодиодом
digitalWrite(grePin, LOW);digitalWrite(bluPin, LOW);digitalWrite(redPin, LOW);
if (sostoyanie ==1){  digitalWrite(grePin, HIGH);}
if (sostoyanie ==2){  digitalWrite(grePin, HIGH);digitalWrite(redPin, HIGH);}
if (sostoyanie ==3){  digitalWrite(bluPin, HIGH);}
if (sostoyanie ==4){  digitalWrite(redPin, HIGH);}
if (sostoyanie ==5){  digitalWrite(redPin, HIGH);digitalWrite(bluPin, HIGH);}
tikdisp=0;}   
   
   
  sensorValue = analogRead(analogInPin);                  // читаем показания аналогового порта для выбора режима работы
 //   Serial.print("sensor = ");  Serial.println (sensorValue); // раскоментировать для отстройки напряжений
  if (sensorValue>500){higeside=sensorValue;}            // если показания больше 500 это пик 
  if (sensorValue<500){lowside=sensorValue; }            // если показания меньше 500 это низ 

  /////////////////выбор состояния подключения в зависимости от состояния на аналоговом порту защита от быстрой перемены режимов
  
  if (higeside<900                              ) {tiks5++;if (tiks5>=50){tiks5=50; }} else { tiks5 --;if (tiks5<=0){tiks5=0;};} 
  if (higeside>900&& lowside>420                ) {tiks4++;if (tiks4>=50){tiks4=50; }} else { tiks4 --;if (tiks4<=0){tiks4=0;};}
  if (higeside>900&& lowside>340 && lowside<420 ) {tiks3++;if (tiks3>=50){tiks3=50; }} else { tiks3 --;if (tiks3<=0){tiks3=0;};}
  if (higeside>900&& lowside>250 && lowside<340 ) {tiks2++;if (tiks2>=50){tiks2=50; }} else { tiks2 --;if (tiks2<=0){tiks2=0;};}
  if (higeside>900&& lowside<250                ) {tiks1++;if (tiks1>=50){tiks1=50; }} else { tiks1 --;if (tiks1<=0){tiks1=0;};}
    
     if (tiks5>=30){sostoyanie = 5;tikdisp=500;}      
     if (tiks4>=30){sostoyanie = 4;tikdisp=500;}      
     if (tiks1>=30){sostoyanie = 1;tikdisp=500;}
     if (tiks2>=30){sostoyanie = 2;tikdisp=500;}
     if (tiks3>=30){sostoyanie = 3;tikdisp=500;}
          

}

 

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

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

#include <LiquidCrystal_I2C.h>
#include   <EEPROM.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // адрес дисплея бывает 0x3F
  unsigned long currentTime;       //тайминг
  unsigned long loopTime;          //тайминг
int prevbutt =1;                   // переменная для кнопки
int regim=EEPROM.read(1);;          // переменная режим зарядки
int prevregim=1;
int sostoyanie=5;                  //(состояние подключения от 1 до 5)
int prevsost=5;                    //(состояние подключения от 1 до 5)
int higeside=0;                    //переменная пик вольтажа
int lowside=0;                     //минимум вольтажа
int hs=0;                      //переменная пик вольтажа старый
int ls=0;                     //переменная низ вольтажа старый
int so=0;
int timerh=0;
int timerm=0;
int timetik=0;
byte timecheck=0;
int tiks1,tiks2,tiks3,tiks4,tiks5; //переменные уменьшающие количество ошибок
int tikdisp=0;                     //переменная обновления дисплея
int sensorValue;                    // переменная в которую читаем показания вольтажа
const int analogInPin = A1;         //на каком порту мерять напряжение
float count = 0;                    //будет счетчик киловатт
const int buttonPin = 14;    // на каком порту кнопка
const int grePin =  11;      // на каком порту зеленый светодиод
const int redPin =  13;      // на каком порту красный светодиод
const int bluPin =  12;      // на каком порту голубой светодиод
const int pwmout =  10;      // на каком порту шим выход на ОУ
const int relePin=  3

;       // на каком порту шим выход на ОУ
int buttonState = 0;         // переменная для кнопки
int outputValue = 0;         // исходящее значение  PWM шим на ОУ
int flagt;
void setup() {
    Serial.begin(9600);          // раскоментировать для отстройки напряжений с аналогового порта
  lcd.init();                      // инициализация дисплея
  lcd.backlight();                 // включить подсветку
  pinMode(grePin, OUTPUT);         //назначение выходов
  pinMode(bluPin, OUTPUT);         //назначение выходов
  pinMode(redPin, OUTPUT);         //назначение выходов
  pinMode(relePin, OUTPUT);        //назначение выходов
  pinMode(14, INPUT_PULLUP);       //назначение выходов
    pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  
  cli();
  TCCR1A = bit(COM1A0) | bit(COM1A1) | bit(COM1B1);
  TCCR1B = bit(WGM13) | 3;
  ICR1 = 125;
  OCR1A = OCR1B = 25;
  sei();
  if (regim!=6 &&regim!=8 &&regim!=10 &&regim!=12 &&regim!=14 &&regim!=16 &&regim!=24 ) {regim=6 ; }
  OCR1A = OCR1B = regim*2;EEPROM.write(1, regim) ; 
}

void loop() {

 if (sostoyanie ==1 ){
  buttonState = digitalRead(buttonPin);   // читаем состояние кнопки
 if (buttonState == HIGH) {               // если нажата
    if (prevbutt==0){                     // если предидущее отпущено
      prevbutt=1; delay (50);              // антидребезг
      flagt=0;
      lcd.clear();
      regim++;regim++;  if (regim>=26){regim=6; }
      OCR1A = OCR1B = regim*2;EEPROM.write(1, regim) ; // при нажатии меняем режим зарядки только при статусе неподключено
   }} else {prevbutt=0;}                  // кнопка отпущена         
 } 

 
   
  sensorValue = analogRead(analogInPin);                 // читаем показания аналогового порта для выбора режима работы
  if (sensorValue>500){higeside=sensorValue;}            // если показания больше 500 это пик 
  if (sensorValue<500){lowside=sensorValue; }            // если показания меньше 500 это низ 

  /////////////////выбор состояния подключения в зависимости от состояния на аналоговом порту защита от быстрой перемены режимов
  
  if (lowside>250                               ) {tiks5++;if (tiks5>=15){tiks5=15; }} else { tiks5 --;if (tiks5<=0){tiks5=0;};} 
  if (higeside<680&& lowside<250 &&higeside>580 ) {tiks4++;if (tiks4>=15){tiks4=15; }} else { tiks4 --;if (tiks4<=0){tiks4=0;};}
  if (higeside<780&& lowside<250 &&higeside>680 ) {tiks3++;if (tiks3>=15){tiks3=15; }} else { tiks3 --;if (tiks3<=0){tiks3=0;};}
  if (higeside<880&& lowside<250 &&higeside>780 ) {tiks2++;if (tiks2>=15){tiks2=15; }} else { tiks2 --;if (tiks2<=0){tiks2=0;};}
  if (higeside>880&& lowside<250                ) {tiks1++;if (tiks1>=15){tiks1=15; }} else { tiks1 --;if (tiks1<=0){tiks1=0;};}
    
     if (tiks5>=10){sostoyanie = 5;if(prevsost!=5){prevsost=5;flagt=0;}}     
     if (tiks4>=10){sostoyanie = 4;if(prevsost!=4){prevsost=4;flagt=0;}}      
     if (tiks1>=10){sostoyanie = 1;if(prevsost!=1){prevsost=1;flagt=0;}}
     if (tiks2>=10){sostoyanie = 2;if(prevsost!=2){prevsost=2;flagt=0;}}
     if (tiks3>=10){sostoyanie = 3;if(prevsost!=3){prevsost=3;flagt=0;}}
      
   /////////////////////////////////////////////////////////быстрая часть
 currentTime  = millis(); // считываем время, прошедшее с момента запуска программы
if((currentTime-loopTime)  > flagt)
 {      

/////////////////////////выводим на дисплей
lcd.setCursor(1,0); lcd.print("UA OPEN CHARGE");
if (sostoyanie ==1){lcd.setCursor(0,1); lcd.print(" Not Connected   ");timerm=0;timerh=0;}
if (sostoyanie ==2){lcd.setCursor(0,1); lcd.print(" Connected       ");}
if (sostoyanie ==3){lcd.setCursor(0,1); lcd.print(" Charging        ");}
if (sostoyanie ==4){lcd.setCursor(0,1); lcd.print(" Vent. Req       ");}
if (sostoyanie ==5){lcd.setCursor(0,1); lcd.print(" Diod test failed");}
if (sostoyanie !=3){timecheck--;}else {timecheck++;} if (timecheck==6){timecheck=1;timerm++;} if (timecheck<0){timecheck=0;}
if (timerm==60){timerh++;timerm=0;} if (timerm<0){timerm=0;}
lcd.setCursor(0,2); lcd.print("charg current:"); lcd.setCursor(14,2); lcd.print(regim);lcd.setCursor(17,2); lcd.print("A");
lcd.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");

// раскоментировать для теста напряжения
//lcd.setCursor(16,3);lcd.print(higeside,0);

//////////// моргаем светодиодом
digitalWrite(grePin, LOW);digitalWrite(bluPin, LOW);digitalWrite(redPin, LOW);
if (sostoyanie ==1){  digitalWrite(grePin, HIGH);}
if (sostoyanie ==2){  digitalWrite(grePin, HIGH);digitalWrite(redPin, HIGH);}
if (sostoyanie ==3){  digitalWrite(bluPin, HIGH);}
if (sostoyanie ==4){  digitalWrite(redPin, HIGH);}
if (sostoyanie ==5){  digitalWrite(redPin, HIGH);}
if (sostoyanie ==3){  digitalWrite(relePin, HIGH);}else {digitalWrite(relePin, LOW);}


//   
   loopTime= currentTime;
   flagt=10000;            //такт проход 
   
//отправка в сериал напряжений для настройки 
//следующие 9 строк можно закоментировать

//Serial.print  ("LS    = ");  Serial.println (lowside);
//Serial.print  ("HS    = ");  Serial.println (higeside);
//Serial.print  ("regim = ");  
//if (sostoyanie ==1){Serial.println(" Not Connected   ");}
//if (sostoyanie ==2){Serial.println(" Connected       ");}
//if (sostoyanie ==3){Serial.println(" Charging        ");}
//if (sostoyanie ==4){Serial.println(" Vent. Req       ");}
//if (sostoyanie ==5){Serial.println(" Diod test failed");}
//Serial.println(" ");// раскоментировать для отстройки напряжений

}
}

 

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 пишет:
Сгорела машина

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

это не оно?