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

Тема в разделе "Силовая электроника", создана пользователем Andre1010, 8 янв 2016.

  1. Andre1010

    Andre1010 Нерд

    Добрый день.

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

    Задача была в том , чтобы при отключении электроэнергии ( в частном доме) автоматически заводился бензиновый генератор и питания дома переключалось на генератор, а при включении электроэнергии всё переключалось обратно.
    В двух словах о работе устройства:
    [​IMG]

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

    [​IMG]

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

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

    [​IMG]

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

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

    [​IMG]

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

    скетч:
    Код (C++):

         // проект автозапуск бензинового генератора на 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;
     
    }

    }
    Ну вот вкратце все, что хотел сказать, если есть какие-нибудь идеи или вопросы буду рад услышать.
     
    vvr и Desert Ops нравится это.
  2. Desert Ops

    Desert Ops Нерд

    Отличная работа! Для меня лично - актуально. В ближайшие дни поделюсь своим проектом в этом направлении. Прошу загрузить фото большего разрешения. Заранее благодарен.
     
  3. mirny_Miron

    mirny_Miron Нуб

    Код (C++):
    //автозапуск дизельного генератора

    const int analogPin = 3;     // номер порта к которому подключен переключатель "ручной" и "автозауск"

    const int ledPin_4 = 3;     // номер порта к которому подключен зеленый диод

    const int ledPin_13 = 13;     // номер порта к которому подключен авария диод

    const int ton = 6;     // номер порта к которому подключена пищалка

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

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

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

    const int run_on = 7;                   // флажок Run в положение включить

    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_13, OUTPUT);      // устанавливает режим работы - выход

      pinMode(ton, OUTPUT);           // устанавливает режим работы - выход

      pinMode(run_on, OUTPUT);         //назначаем run_on - выход
      pinMode(city, INPUT);         // назначаем  входом  напряжение из города  в схеме              

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

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

      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>500)  rav = 4 ;

    Serial.println(val);
      if (rav == 1) digitalWrite(ledPin_4, HIGH);   // включает зеленый светодиод

      if (rav==4 || a >= 3 )
      digitalWrite(ledPin_13, HIGH);   // включает красный светодиод авария
      delay(1000);                  // ожидаем
      digitalWrite(ledPin_4, LOW);   // выключает зеленый светодиод
      digitalWrite(ledPin_13, LOW);   // выключает красный светодиод
    Serial.println(rav);             // выводим полученное значение

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

    {
      if (a==0)
      {
       
       tone(ton, 4500);         //подаюм команду  тон
        delay(200);
        tone(ton, 3300);         //подаюм команду  тон
        delay(200);
        tone(ton, 3000);         //подаюм команду  тон
        delay(200);
        tone(ton, 2700);         //подаюм команду  тон
        delay(500); //пауза 2 сек
        noTone(6);       //подаюм команду - тон
      }
        tone(ton, 4500);         //подаюм команду  тон
        delay(50);
        tone(ton, 4000);         //подаюм команду  тон
        delay(50);
        tone(ton, 4500);         //подаюм команду  тон
        delay(50);
        tone(ton, 4000);         //подаюм команду  тон
        delay(50);
        tone(ton, 4500);         //подаюм команду  тон
        delay(50);
        tone(ton, 4000);         //подаюм команду  тон
        delay(50);
        tone(ton, 4500);         //подаюм команду  тон
        delay(50);
        tone(ton, 4000);         //подаюм команду  тон
        delay(50);
        tone(ton, 4500);         //подаюм команду  тон
        delay(50);
        tone(ton, 4000);         //подаюм команду  тон
        delay(50);
        tone(ton, 4500);         //подаюм команду  тон
        delay(50);
        tone(ton, 4000);         //подаюм команду  тон
        delay(50);
        noTone(6);
         digitalWrite(run_on, HIGH);         //подаюм команду + на включение RUN
         delay(700);                           //пауза 0,7 сек
         digitalWrite(run_on, LOW);       //подаюм команду - на остановку включения RUN
         delay(1000);
        digitalWrite(starter_relay, HIGH);         //подаюм команду + на реле стартера
        delay(1800);                           //пауза 1,8сек
        digitalWrite(starter_relay, LOW);         //подаюм команду - на реле стартера
        delay(2500);
        a++;
    }
    if (t == LOW && m == LOW  && rav == 4 && pop == 0 || t == LOW && m == LOW && a >= 3 && 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(3000);                           //пауза 2 сек
        digitalWrite(ton, LOW);       //подаюм команду - тон
        pop++;
    }
    if (t == HIGH && m == LOW && g == 0 )
    {
        tone(ton, 3000);         //подаюм команду  тон
        delay(500);
        tone(ton, 5000);         //подаюм команду  тон
        delay(500);
        noTone(6);
       delay(180000);         //прогреваем 3 минуты
    digitalWrite(magnetic, HIGH);       //включаем пускатель
    delay(1000);  //пауза 1 сек
    digitalWrite(magnetic, LOW);
    tone(ton, 2000);         //подаюм команду  тон
        delay(200);
        tone(ton, 2500);         //подаюм команду  тон
        delay(200);
        tone(ton, 3000);         //подаюм команду  тон
        delay(200);
        tone(ton, 3500);         //подаюм команду  тон
        delay(500); //пауза 2 сек
        noTone(6);       //подаюм команду - тон
    g++;
    }

    if (t == LOW && m == LOW && a >=0 )
    {
      g=0;
    }

    if (t == HIGH && m == HIGH || rav == 4 && 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;
    pop = 0;

    }

    }
     
     
    Последнее редактирование: 8 июл 2016
  4. mirny_Miron

    mirny_Miron Нуб

    немного отредактировал ваш проект и приспособил к моему генератору. индикацию с генератора беру и с 220 реле и с 12 V реле, что бы точно не включить стартер во время работы. ну и звука побольше. так же после работы генератора и его внезапной остановки не включался пускатель.
     
  5. mirny_Miron

    mirny_Miron Нуб

    Подскажите решение псевдомногозадачности с прогревом. так как модулировал разные ситуации и получается так что когда двигатель прогревается и если появляется напряжение в сети с города он не учитывает показания с пина и продолжает греть 3 минуты и только после понимает что зря)
     
  6. DIYMan

    DIYMan Гик

    Избавляться от delay, и тогда всё будет работать без задержек, не надо будет выжидать 3 минуты для проверки статуса пина.
     
  7. ИгорьК

    ИгорьК Победитель модулей

    Промышленное устройство автозапуска генератора для таких случаев хотя и отключает питание нагрузки от него, но продолжает прогревать генератор в общей сложности 10 минут. Глушить не прогретый двигатель есть не правильно. Это я еще помню точно. Почему - уже забыл :)
     
  8. alp69

    alp69 Гик

    Неправильно глушить турбированный двигатель с неостывшей турбиной. Это 100%. А по поводу непрогретого - неправильно нагрузку на генератор непрогретой электростанции давать. Поэтому и греют.
     
  9. Айрат

    Айрат Нуб

    Доброго времени суток.
    Мне очень понравилась ваша задумка. Имею желание изготовить автоматику для управления бензиновой электростанцией по причине частых отключений электроэнергии.
    Для упрощения процедуры сборки прошу помощи в составлении принципиальной электрической схемы.