Автоматический запуск бензинового генератора на arduino uno

Andre1010
Offline
Зарегистрирован: 07.06.2015

Добрый день.

Хочу поделиться,  своим  первым проектом на arduino .

Задача была в том , чтобы при отключении электроэнергии ( в частном доме)  автоматически заводился бензиновый генератор и  питания дома переключалось на генератор, а при включении электроэнергии всё переключалось обратно. 

вот скетч

 

// проект автозапуск бензинового генератора на ARDURINO UNO июнь 2015


//задаю константы


   const  int city = 2;  // напряжение из города

 const  int he_voltage = 1; //напряжение на генераторе

 const int starter_relay = 5;              //реле стартера

const int choke_on = 6;                   // подсос включить

const int choke_of = 7;                   // подсос выключить

const int magnetic = 8;                  // включает пускатель

const int  disconnection = 9;            //реле размыкания зажигания

const int magnetic_of = 10;                  // вЫключает пускатель


// задаю переменные

 int t = 0; //отображает работу генератора
 
 int m = 0; //отображает наличие напряжения в сети
 
 int a = 0; //количество попыток запуска ген
 




void setup() 

 
{
  pinMode(city, INPUT);         // назначаем  входом  напряжение из города  в схеме
                   
  pinMode(he_voltage, INPUT);         // назначаем the_voltage входом  напряжение с генератора

 
  pinMode(starter_relay, OUTPUT);         //назначаем  starter_relay выходом реле стартера

  pinMode(choke_on, OUTPUT);         //назначаем choke_on выходом подсос включает

  pinMode(choke_of, OUTPUT);         //назначаем choke_of выходом подсос вЫключает

  pinMode(magnetic, OUTPUT);         //назначаем magnetic выходом переключает пускатели на генератор

  pinMode(disconnection, OUTPUT);         //назначаем disconnection выходом включает и выключает  зажигание
  
  pinMode(magnetic_of, OUTPUT);         //назначаем magnetic выходом переключает пускатели на генератор

   

 

}

void loop()
{
   m =  digitalRead(city);
   t =  digitalRead(he_voltage);
   delay(2000);
   if (t == LOW && m == LOW && a < 3 )

{
  
  digitalWrite(choke_on, HIGH);         //подаюм команду + на открытие подсоса
    delay(500);                           //пауза 0,5 сек
    digitalWrite(choke_on, LOW);       //подаюм команду - на открытие подсоса
    delay(500);
    digitalWrite(starter_relay, HIGH);         //подаюм команду + на реле стартера
    delay(1500);                           //пауза 1,5 сек
    digitalWrite(starter_relay, LOW);         //подаюм команду - на реле стартера
    delay(900);
    digitalWrite(choke_of, HIGH);        //подаюм команду +  на закрытие  подсоса
    delay(500);                           //пауза 0,5 сек
    digitalWrite(choke_of, LOW);        //подаюм команду - на закрытие подсоса
    a++;
 }
 
 if (t == HIGH && m == LOW)
 {
 digitalWrite(magnetic, HIGH);
 delay(700);  //пауза 0,7 сек
 digitalWrite(magnetic, LOW);
 }
 if (t == HIGH && m == HIGH )
{
 digitalWrite(magnetic_of, HIGH);
 delay(700);  //пауза 0,7 сек
 digitalWrite(magnetic_of, LOW);
 digitalWrite(disconnection, HIGH);
 delay(4000);  //пауза 5 сек
 digitalWrite(disconnection, LOW);
 a = 0;
}
if (t == LOW && m == HIGH || t == HIGH && m == LOW )
 
{
   a = 0;
  
}

 }

 

 

 

 

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Мдааа... собрал автомобиль... если кому интересно вот химическая формула бензина C8H17

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Хорошо бы фото исполнительных механизмов и блок схему алгоритма работы. А так действительно получается "канаццкий бензин". :)

Andre1010
Offline
Зарегистрирован: 07.06.2015

Пока нет времени, этим заниматься скоро выложу.

tarakan-spb
Offline
Зарегистрирован: 19.11.2015

Еще неплохо добавить в алгоритм 2-3 аварийних входа: масло, температура, бензин и пр.

дядя Коля
Offline
Зарегистрирован: 02.01.2016

Andre1010 пишет:

Пока нет времени, этим заниматься скоро выложу.

 Забыл наверное?

kaluganin
kaluganin аватар
Offline
Зарегистрирован: 25.12.2015

Если не сложно автору, опишите чем переключаете с электро сети на генератор ( пакетник, реле и пр) , так понимаю, после электросчетчика все цепляется и как планируете защищать сеть от перегруза и КЗ ??

Andre1010
Offline
Зарегистрирован: 07.06.2015

дядя Коля пишет:

Andre1010 пишет:

Пока нет времени, этим заниматься скоро выложу.

 Забыл наверное?

не забыл.!

Andre1010
Offline
Зарегистрирован: 07.06.2015

переключение с помощью реверсивных пускателей, защита автомат +УЗО

Andre1010
Offline
Зарегистрирован: 07.06.2015

модернизированный  проект "Автозапуск бензинового генератора для частного дома на Arduino uno"

 

Вот на праздниках появилась минутка написать бодродней о своем проекте. Проект был доработан и успешно обкатан. 

В двух словах о работе устройства: 

 

 

 

 

 

 

 

Как я уже говорил задача стояла в том, чтобы при  отключения электроэнергии в частном доме автоматически запускался генератор, и питание дома переключалось на него, а при включении электроэнергии все переключалось обратно. 
Так вот, устройство проверяет наличие напряжения в сети, датчик  сделан из обычного реле с катушкой управления  220В, если напряжение пропадает, то проверяется запущен генератор или нет, если не запущен, тогда смотрим на уровень топлива, если он больше 1/10 бака, тогда производим запуск генератора, а если топливо меньше чем  1/10,то включаем ошибку и генератор не запускаем. При нормальном уровне топлива у генератора есть 4 попытки запуска, это если с первого раза запуск не удался.
После успешного запуска включаются пускатели

 

 

 

 

 

 

 

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

Все команды с arduino на исполнительные механизмы подаются через оптрон и реле. У меня генератор с механическим подсосом, поэтому пришлось учить его закрывать и открывать подсос  в процессе запуска, это реализовал с помощью электромагнитов от центрального замка автомобиля. Датчик уровня топлива использовал  от ВАЗ 21014  значительно переделав его .  Питание этого устройства осуществляется от блока бесперебойного питания (ББП) 12В 3А с аккумулятором 7AЧ

 

 

 

 

 

 

 

далее с 12В понижаю до 9В это для питания самого arduino и до 5В для питания блоков реле. Также в системе имеется силовой аккумулятор 12В 18АЧ,но он питает только стартер и электромагниты для включения и выключения подсоса. 

Алгоритм работы:

 

 

 

 

 

 

 

 

 

 

 

Ещё были мысли дополнительно учитывать температуру воздуха, а так же научить разговаривать генератор и сообщать мне с помощью смс о режиме работы, но свободных пинов у arduino uno больше нет, да и дорого получается ,а технического смысла мало. 

новый скетч:

     // проект автозапуск бензинового генератора на ARDURINO UNO декабрь 2015


    //задаю константы

const int analogPin = 3;     // номер порта к которому подключен датчик уровня топлива
const int ledPin_4 = 3;     // номер порта к которому подключен зеленый диод
 const int ledPin_11 = 11;     // номер порта к которому подключен желтый диод
 const int ledPin_12 = 12;     // номер порта к которому подключен красный диод
 const int ledPin_13 = 13;     // номер порта к которому подключен авария диод
 const int ton = 1;     // номер порта к которому подключена пищалка
  
  
 const int city = 2;  // напряжение из города

 const  int he_voltage = 4; //напряжение на генераторе

 const int starter_relay = 5;              //реле стартера

const int choke_on = 6;                   // подсос включить

const int choke_of = 7;                   // подсос выключить

const int magnetic = 8;                  // включает пускатель

const int  disconnection = 9;            //реле размыкания зажигания

const int magnetic_of = 10;                  // вЫключает пускатель


// задаю переменные

 int t = 0; //отображает работу генератора
 
 int m = 0; //отображает наличие напряжения в сети
 
 int a = 0; //количество попыток запуска ген
 int val = 0;                // переменная для хранения считываемого значения с 
int rav = 0;                  //переменная для хранения диапозона уровня топлива
int pop = 0; //отображает тревогу
int g = 0; //количество команд на пускатель
 





void setup() 

 
{
  pinMode(ledPin_4, OUTPUT);      // устанавливает режим работы - выход
  pinMode(ledPin_11, OUTPUT);      // устанавливает режим работы - выход
  pinMode(ledPin_12, OUTPUT);      // устанавливает режим работы - выход
  pinMode(ledPin_13, OUTPUT);      // устанавливает режим работы - выход
  pinMode(ton, OUTPUT);           // устанавливает режим работы - выход
   
  pinMode(city, INPUT);         // назначаем  входом  напряжение из города  в схеме
                   
  pinMode(he_voltage, INPUT);         // назначаем the_voltage входом  напряжение с генератора

 
  pinMode(starter_relay, OUTPUT);         //назначаем  starter_relay выходом реле стартера

  pinMode(choke_on, OUTPUT);         //назначаем choke_on выходом подсос включает

  pinMode(choke_of, OUTPUT);         //назначаем choke_of выходом подсос вЫключает

  pinMode(magnetic, OUTPUT);         //назначаем magnetic выходом переключает пускатели на генератор

  pinMode(disconnection, OUTPUT);         //назначаем disconnection выходом включает и выключает  зажигание
  
  pinMode(magnetic_of, OUTPUT);         //назначаем magnetic выходом переключает пускатели на генератор

  // Serial.begin(9600);              //  установка связи по serial

 

}

void loop()
{
 
   val = analogRead(analogPin);     // считываем значение
// Serial.println(rav);             // выводим полученное значение

 if (val<180)   rav = 1 ;
 if (val>120 && val < 350)    rav = 2 ;
 if (val>340 && val < 420)   rav = 3 ;
 if (val>500)  rav = 4 ;

// Serial.println(val);
  if (rav == 1) digitalWrite(ledPin_4, HIGH);   // включает светодиод5
  if (rav==2) digitalWrite(ledPin_11, HIGH);   // включает светодиод6 
 if (rav==3)  digitalWrite(ledPin_12, HIGH);   // включает светодиод7 
  if (rav==4 || a >= 4 )  digitalWrite(ledPin_13, HIGH);   // включает светодиод8 
delay(1000);                  // ожидаем 
     digitalWrite(ledPin_4, LOW);   // выключает светодиод6
     digitalWrite(ledPin_11, LOW);   // выключает светодиод6
     digitalWrite(ledPin_12, LOW);   // выключает светодиод6
       digitalWrite(ledPin_13, LOW);   // выключает светодиод6
// Serial.println(rav);             // выводим полученное значение

  // Serial.println(a);
   
   m =  digitalRead(city);
   t =  digitalRead(he_voltage);
   if (t == LOW && m == LOW && a < 4 && rav != 3)

{
  if (a==0)
  {
   digitalWrite(ton, HIGH);         //подаюм команду  тон
    delay(2000);                           //пауза 2 сек
    digitalWrite(ton, LOW);       //подаюм команду - тон
  }
  digitalWrite(choke_on, HIGH);         //подаюм команду + на открытие подсоса
    delay(700);                           //пауза 0,7 сек
    digitalWrite(choke_on, LOW);       //подаюм команду - на открытие подсоса
    delay(1000);
    digitalWrite(starter_relay, HIGH);         //подаюм команду + на реле стартера
    delay(1800);                           //пауза 1,8сек
    digitalWrite(starter_relay, LOW);         //подаюм команду - на реле стартера
    delay(2500);
    digitalWrite(choke_of, HIGH);        //подаюм команду +  на закрытие  подсоса
    delay(500);                           //пауза 0,5 сек
    digitalWrite(choke_of, LOW);        //подаюм команду - на закрытие подсоса
    a++;
   
 }
 if (t == LOW && m == LOW  && rav == 3 && pop == 0 || t == LOW && m == LOW && a >= 4 && pop == 0 )
 {
 digitalWrite(ton, HIGH);         //подаюм команду  тон
    delay(1500);                           //пауза 2 сек
    digitalWrite(ton, LOW);       //подаюм команду - тон
    delay(1000); 
    digitalWrite(ton, HIGH);         //подаюм команду  тон
    delay(1500);                           //пауза 2 сек
    digitalWrite(ton, LOW);       //подаюм команду - тон
    delay(1000); 
    digitalWrite(ton, HIGH);         //подаюм команду  тон
   delay(1500);                           //пауза 2 сек
    digitalWrite(ton, LOW);       //подаюм команду - тон
    delay(1000); 
    digitalWrite(ton, HIGH);         //подаюм команду  тон
   delay(1500);                           //пауза 2 сек
    digitalWrite(ton, LOW);       //подаюм команду - тон
    pop++;
 }
 if (t == HIGH && m == LOW && g == 0 )
 {
   delay(60000);
 digitalWrite(magnetic, HIGH);
 delay(1000);  //пауза 1 сек
 digitalWrite(magnetic, LOW);
 g++;
 }
 if (t == HIGH && m == HIGH || rav == 3 && t == HIGH )
{
 digitalWrite(magnetic_of, HIGH);
 delay(1000);  //пауза 1 сек
 digitalWrite(magnetic_of, LOW);
 digitalWrite(disconnection, HIGH);
 delay(4000);  //пауза 4 сек
 digitalWrite(disconnection, LOW);
  g = 0;
}
if (t == LOW && m == HIGH || t == HIGH && m == LOW )
 {
   a = 0;
  }
if (t == LOW && m == HIGH || t == HIGH && m == LOW )
 {
   pop = 0;
  }
 }

 

 

Ну вот  вкратце все, что хотел сказать, если есть какие-нибудь идеи или вопросы  буду рад услышать.
 


 

 

дядя Коля
Offline
Зарегистрирован: 02.01.2016

Спасибо  за ответ. Непонятен алгоритм работы воздушной заслонки и время работы на прогрев двигателя. Или генератор находится в теплом помещении. У меня в холодном помещении и для переключения под нагрузку требуется около 5ти минут ,иначе глохнет.

Andre1010
Offline
Зарегистрирован: 07.06.2015

дядя Коля пишет:

Спасибо  за ответ. Непонятен алгоритм работы воздушной заслонки и время работы на прогрев двигателя. Или генератор находится в теплом помещении. У меня в холодном помещении и для переключения под нагрузку требуется около 5ти минут ,иначе глохнет.

Генератор находиться в холодном помешении, в   разделе "ЗАПУСК ГЕНЕРАТОРА" перед вращением срартера закрываеться подсос а  после остановки стартера он открываеться через 2,5с . тоесть на подсосе генератор работает 2,5с.

здесь в программе это видно:

digitalWrite(choke_on, HIGH);         //подаюм команду + на открытие подсоса
    delay(700);                           //пауза 0,7 сек
    digitalWrite(choke_on, LOW);       //подаюм команду - на открытие подсоса
    delay(1000);
    digitalWrite(starter_relay, HIGH);         //подаюм команду + на реле стартера
    delay(1800);                           //пауза 1,8сек
    digitalWrite(starter_relay, LOW);         //подаюм команду - на реле стартера
    delay(2500);
    digitalWrite(choke_of, HIGH);        //подаюм команду +  на закрытие  подсоса
    delay(500);                           //пауза 0,5 сек
    digitalWrite(choke_of, LOW);        //подаюм команду - на закрытие подсоса

А что касаеться прогрева то моему хватает 1минуты , это организовано в разделе "ВКЛЮЧАЕМ ПУСКАТЕЛИ"

вот в программе:

  delay(60000);
 digitalWrite(magnetic, HIGH);
 delay(1000);  //пауза 1 сек
 digitalWrite(magnetic, LOW);

Мне кажется что 5 минут слишко много, но это может зависить от температуры воздуха, у меня самая низкая была -8С.

 

 

дядя Коля
Offline
Зарегистрирован: 02.01.2016

2.5 секунды мало. Нужно минимум 20-30 секунд. Я впервые столкнулся с програмированием, так что извиняюсь за глупые вопросы. Но с твоей подсказкой разберусь. Благодарю за ответ.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Здравствуйте Андрей, По поводу SMS. Можно использовать мобильный телефон. По команде контроллера он будет отзваниваться, а уже по желанию можно брать трубку или не брать и слушать например зуммер который будет звенеть по по разному в разных режимах работы системы. Таким образом мониторить. Использую это в теме "Автоматический запуск двигателя автомобиля". А входов на UNO еще много аналоговых их можно использовать как цифровые.  

Andre1010
Offline
Зарегистрирован: 07.06.2015

Добрый день.

 

Идея по поводу телефона хорошая , но входов то хватает а выходов нет.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Прочитал и засомневался хотя сам использовал аналоговые порты в своем проекте как цифровые выводы. Сейчас перечитал спецификации на этом сайте, аналоговые порты можно смело использовать как цифровые выходы. Реально простой и надежный способ оповещения по GSM. Старых телефонов с кнопочками к которым можно подпояться у всех валяется, жалко выбросить. А нужен то всего телефон и обтрон на развязку ну и БП для телефона постоянно в сеть. На своем опыте если телефон проработал по своему прямому назначению пять лет то думаю лет десять еще запрсто пропашет

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
Andre1010
Offline
Зарегистрирован: 07.06.2015

fyodor.m пишет:

Прочитал и засомневался хотя сам использовал аналоговые порты в своем проекте как цифровые выводы. Сейчас перечитал спецификации на этом сайте, аналоговые порты можно смело использовать как цифровые выходы. Реально простой и надежный способ оповещения по GSM. Старых телефонов с кнопочками к которым можно подпояться у всех валяется, жалко выбросить. А нужен то всего телефон и обтрон на развязку ну и БП для телефона постоянно в сеть. На своем опыте если телефон проработал по своему прямому назначению пять лет то думаю лет десять еще запрсто пропашет

 

 

Огромное спасибо. Буду изучать , я до этого недодумался.

Сергей Р
Offline
Зарегистрирован: 19.02.2016
 if (t == HIGH && m == HIGH || rav == 3 && t == HIGH )
{
 digitalWrite(magnetic_of, HIGH);
 delay(1000);  //пауза 1 сек
 digitalWrite(magnetic_of, LOW);
 digitalWrite(disconnection, HIGH);
 delay(4000);  //пауза 4 сек
 digitalWrite(disconnection, LOW);
  g = 0;
}

Реле зажигания всё время щёлкает когда есть эл. из города?