Автоматический запуск бензинового генератора на arduino uno
- Войдите на сайт для отправки комментариев
Пт, 31/07/2015 - 21:39
Добрый день.
Хочу поделиться, своим первым проектом на 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;
}
}
Мдааа... собрал автомобиль... если кому интересно вот химическая формула бензина C8H17
Хорошо бы фото исполнительных механизмов и блок схему алгоритма работы. А так действительно получается "канаццкий бензин". :)
Пока нет времени, этим заниматься скоро выложу.
Еще неплохо добавить в алгоритм 2-3 аварийних входа: масло, температура, бензин и пр.
Пока нет времени, этим заниматься скоро выложу.
Если не сложно автору, опишите чем переключаете с электро сети на генератор ( пакетник, реле и пр) , так понимаю, после электросчетчика все цепляется и как планируете защищать сеть от перегруза и КЗ ??
Пока нет времени, этим заниматься скоро выложу.
не забыл.!
переключение с помощью реверсивных пускателей, защита автомат +УЗО
модернизированный проект "Автозапуск бензинового генератора для частного дома на 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; } }Ну вот вкратце все, что хотел сказать, если есть какие-нибудь идеи или вопросы буду рад услышать.
Спасибо за ответ. Непонятен алгоритм работы воздушной заслонки и время работы на прогрев двигателя. Или генератор находится в теплом помещении. У меня в холодном помещении и для переключения под нагрузку требуется около 5ти минут ,иначе глохнет.
Спасибо за ответ. Непонятен алгоритм работы воздушной заслонки и время работы на прогрев двигателя. Или генератор находится в теплом помещении. У меня в холодном помещении и для переключения под нагрузку требуется около 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минуты , это организовано в разделе "ВКЛЮЧАЕМ ПУСКАТЕЛИ"
вот в программе:
Мне кажется что 5 минут слишко много, но это может зависить от температуры воздуха, у меня самая низкая была -8С.
2.5 секунды мало. Нужно минимум 20-30 секунд. Я впервые столкнулся с програмированием, так что извиняюсь за глупые вопросы. Но с твоей подсказкой разберусь. Благодарю за ответ.
Здравствуйте Андрей, По поводу SMS. Можно использовать мобильный телефон. По команде контроллера он будет отзваниваться, а уже по желанию можно брать трубку или не брать и слушать например зуммер который будет звенеть по по разному в разных режимах работы системы. Таким образом мониторить. Использую это в теме "Автоматический запуск двигателя автомобиля". А входов на UNO еще много аналоговых их можно использовать как цифровые.
Добрый день.
Идея по поводу телефона хорошая , но входов то хватает а выходов нет.
Прочитал и засомневался хотя сам использовал аналоговые порты в своем проекте как цифровые выводы. Сейчас перечитал спецификации на этом сайте, аналоговые порты можно смело использовать как цифровые выходы. Реально простой и надежный способ оповещения по GSM. Старых телефонов с кнопочками к которым можно подпояться у всех валяется, жалко выбросить. А нужен то всего телефон и обтрон на развязку ну и БП для телефона постоянно в сеть. На своем опыте если телефон проработал по своему прямому назначению пять лет то думаю лет десять еще запрсто пропашет
http://geektimes.ru/post/268864/
Прочитал и засомневался хотя сам использовал аналоговые порты в своем проекте как цифровые выводы. Сейчас перечитал спецификации на этом сайте, аналоговые порты можно смело использовать как цифровые выходы. Реально простой и надежный способ оповещения по GSM. Старых телефонов с кнопочками к которым можно подпояться у всех валяется, жалко выбросить. А нужен то всего телефон и обтрон на развязку ну и БП для телефона постоянно в сеть. На своем опыте если телефон проработал по своему прямому назначению пять лет то думаю лет десять еще запрсто пропашет
Огромное спасибо. Буду изучать , я до этого недодумался.
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; }Реле зажигания всё время щёлкает когда есть эл. из города?
А схему на данное устройство где можно посмотреть?
Доброго всем. Есть проверенный законченный проект? Хочу тоже заняться и не хотелось бы форсмажора в конце.