Добрый день. Хочу поделиться, своим первым проектом на arduino . Задача была в том , чтобы при отключении электроэнергии ( в частном доме) автоматически заводился бензиновый генератор и питания дома переключалось на генератор, а при включении электроэнергии всё переключалось обратно. В двух словах о работе устройства: Как я уже говорил задача стояла в том, чтобы при отключения электроэнергии в частном доме автоматически запускался генератор, и питание дома переключалось на него, а при включении электроэнергии все переключалось обратно. Так вот, устройство проверяет наличие напряжения в сети, датчик сделан из обычного реле с катушкой управления 220В, если напряжение пропадает, то проверяется запущен генератор или нет, если не запущен, тогда смотрим на уровень топлива, если он больше 1/10 бака, тогда производим запуск генератора, а если топливо меньше чем 1/10,то включаем ошибку и генератор не запускаем. При нормальном уровне топлива у генератора есть 4 попытки запуска, это если с первого раза запуск не удался. После успешного запуска включаются пускатели и питание дома переключается на генератор, как только появится напряжение в сети, то система переключит пускатели обратно и заглушит генератор. Все команды с arduino на исполнительные механизмы подаются через оптрон и реле. У меня генератор с механическим подсосом, поэтому пришлось учить его закрывать и открывать подсос в процессе запуска, это реализовал с помощью электромагнитов от центрального замка автомобиля. Датчик уровня топлива использовал от ВАЗ 21014 значительно переделав его . Питание этого устройства осуществляется от блока бесперебойного питания (ББП) 12В 3А с аккумулятором 7AЧ далее с 12В понижаю до 9В это для питания самого arduino и до 5В для питания блоков реле. Также в системе имеется силовой аккумулятор 12В 18АЧ,но он питает только стартер и электромагниты для включения и выключения подсоса. Алгоритм работы: Ещё были мысли дополнительно учитывать температуру воздуха, а так же научить разговаривать генератор и сообщать мне с помощью смс о режиме работы, но свободных пинов у 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; } } Ну вот вкратце все, что хотел сказать, если есть какие-нибудь идеи или вопросы буду рад услышать.
Отличная работа! Для меня лично - актуально. В ближайшие дни поделюсь своим проектом в этом направлении. Прошу загрузить фото большего разрешения. Заранее благодарен.
Код (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; } }
немного отредактировал ваш проект и приспособил к моему генератору. индикацию с генератора беру и с 220 реле и с 12 V реле, что бы точно не включить стартер во время работы. ну и звука побольше. так же после работы генератора и его внезапной остановки не включался пускатель.
Подскажите решение псевдомногозадачности с прогревом. так как модулировал разные ситуации и получается так что когда двигатель прогревается и если появляется напряжение в сети с города он не учитывает показания с пина и продолжает греть 3 минуты и только после понимает что зря)
Избавляться от delay, и тогда всё будет работать без задержек, не надо будет выжидать 3 минуты для проверки статуса пина.
Промышленное устройство автозапуска генератора для таких случаев хотя и отключает питание нагрузки от него, но продолжает прогревать генератор в общей сложности 10 минут. Глушить не прогретый двигатель есть не правильно. Это я еще помню точно. Почему - уже забыл
Неправильно глушить турбированный двигатель с неостывшей турбиной. Это 100%. А по поводу непрогретого - неправильно нагрузку на генератор непрогретой электростанции давать. Поэтому и греют.
Доброго времени суток. Мне очень понравилась ваша задумка. Имею желание изготовить автоматику для управления бензиновой электростанцией по причине частых отключений электроэнергии. Для упрощения процедуры сборки прошу помощи в составлении принципиальной электрической схемы.
Добрый день,я вам вышлю и сколько будет стоить ремонт и как долго его будут делать?Ваша мастерская от LD фирмы?
Может лучше было бы поставить оптопару, которая потребляет в разы меньше? ЗЫ. Что-то мне подсказывает, что и в схеме есть косяки.... Опубликуйте ее!