не корректно работает Автозапуск Бензогенератора
- Войдите на сайт для отправки комментариев
Добрый вечер друзья! Я тут впервые! с программированием тоже не очень но нужно было сделать автозапуск на дачю! написал скетч! Но работает он не корректно! отслеживаю напряжение в сети и генератора через оптопары 6N139 полупериуд, по первичьке диод и резистор классика! но были проблеммы с ослеживанием в итоге что то вышло но так же задержка перед считыванием если начала схемма запускать генератор и подать напряжение на вход контрля сети то секунд через 6 тока понимает что есть напряжение в сети тоже самое и с генераторным входом! Согласитесь давать запуск стартера генератора на заведенем генераторе это просто убийца стартера! есть еще дыры по логике она не какая но пока разобраться пока бы с этим за помощь спасибо зарание не судите строго
// проект автозапуск бензинового генератора на ARDURINO Nano ATmega168 // задаю константы const int city = 2; // напряжение сети 220 const int he_voltage = 3; // напряжение на генераторе const int magnetic_city = 4; // реле сети 220 const int magnetic_he = 7; // реле генератора const int disconnection = 8; // реле зажигания const int starter_relay = 9; // реле стартера const int disconnection_klap = 10; // реле клапана бензобака const int choke_on = 14; // подсос включить const int choke_of = 15; // подсос выключить const int ton = 5; // зумер const int rune = 6; // cтоп const int datchic_t = 11; // датчик температуры двигателя const int ledPin = 12; // подключен авария диод // задаю переменные int status_city = 0; // мониторинг напряжения в сети int status_he_voltage = 0; // мониторинг напряжения с гениратора int he = 0; // количество попыток запуска ген int dt = 0; // переменная для хранения считываемого значения с датчика температуры двигателя int zum = 0; // отображает тревогу int r = 0; // количество команд на реле генератора int val = 0; // переменная для хранения считываемого значения кнопки unsigned long ac_timer_city = 0; unsigned long ac_timer_he_voltage = 0; void setup() { pinMode(city, INPUT); // напряжение сети 220 pinMode(he_voltage, INPUT); // напряжение на генераторе pinMode(magnetic_city, OUTPUT); // реле сети 220 pinMode(magnetic_he, OUTPUT); // реле генератора pinMode(disconnection, OUTPUT); // реле зажигания pinMode(starter_relay, OUTPUT); // реле стартера pinMode(disconnection_klap, OUTPUT); // реле клапана бензобака pinMode(choke_on, OUTPUT); // подсос включить pinMode(choke_of, OUTPUT); // подсос выключить pinMode(ton, OUTPUT); // зумер pinMode(rune, INPUT); // ручной запуск генератора pinMode(datchic_t, INPUT); // датчик температуры двигателя pinMode(ledPin, OUTPUT); // подключен авария диод digitalWrite(rune,HIGH); // подтяжку + включили digitalWrite(datchic_t,HIGH); // подтяжку + включили Serial.begin(9600); beep(100); beep(100); beep(100); delay(1000); } void beep(unsigned char delayms) { analogWrite(ton,50); // значение должно находится между 0 и 255 delay(delayms); analogWrite(ton,0); // 0 - выключаем пьезо delay(delayms); } uint8_t acCheck() { if(!digitalRead(city)) { ac_timer_city = millis(); if(status_city != 1) { // ac_ON status_city = 1; return 1; } } if(status_city && millis() - ac_timer_city > 2000) { // ac_OFF status_city = 0; ac_timer_city = 0; return 1; } return 0; } uint8_t heCheck() { if(!digitalRead(he_voltage)) { ac_timer_he_voltage = millis(); if(status_he_voltage !=1) { // he_ON status_he_voltage = 1; return 1; } } if(status_he_voltage && millis() - ac_timer_he_voltage > 2000) { // he_OFF status_he_voltage = 0; ac_timer_he_voltage = 0; return 1; } return 0; } void loop() { acCheck(); heCheck(); dt = digitalRead(datchic_t); //контроль датчика температуры двигателя val = digitalRead(rune); //вывод показвний кнопки Serial.print("Количество запусков генератора"); Serial.println(he); Serial.print("Количество команд на реле генератора"); Serial.println(r); Serial.print("Напряжение в сети"); Serial.println(status_city); Serial.print("Напряжения с генератора"); Serial.println(status_he_voltage); if(status_city !=1&&status_he_voltage !=1&&dt==LOW&&he<5&&val==HIGH) { if(he==0) { beep(2000); delay(1000); } digitalWrite(disconnection,HIGH); //подаюм команду + на включение зажигания delay(700); //пауза 0,7 сек digitalWrite(disconnection_klap,HIGH); //подаюм команду + на включение клапана бензобака delay(700); //пауза 0,7 сек digitalWrite(choke_on,HIGH); //подаюм команду + на открытие подсоса delay(700); //пауза 0,7 сек digitalWrite(choke_on, LOW); //прекращаем команду - на открытие подсоса delay(700); //пауза 1 сек digitalWrite(starter_relay,HIGH); //подаюм команду + на реле стартера delay(1800); //пауза 1,8 сек digitalWrite(starter_relay, LOW); //подаюм команду - на реле стартера delay(3000); //пауза 3 сек digitalWrite(choke_of, HIGH); //подаюм команду + на закрытие подсоса delay(700); //пауза 0,7 сек digitalWrite(choke_of, LOW); //подаюм команду - на закрытие подсоса delay(700); he++; } if(status_city !=1&&status_he_voltage!=1&&dt==HIGH&&he<5&&val==HIGH) { if(he==0) { beep(2000); beep(2000); delay(1000); } digitalWrite(disconnection,HIGH); //подаюм команду + на включение зажигания delay(700); //пауза 0,7 сек digitalWrite(disconnection_klap,HIGH); //подаюм команду + на включение клапана бензобака delay(1000); //пауза 1 сек digitalWrite(choke_of, HIGH); //подаюм команду + на закрытие подсоса delay(700); //пауза 0,7 сек digitalWrite(choke_of, LOW); //подаюм команду - на закрытие подсоса delay(700); //пауза 1 сек digitalWrite(starter_relay,HIGH); //подаюм команду + на реле стартера delay(1800); //пауза 1,8 сек digitalWrite(starter_relay, LOW); //подаюм команду - на реле стартера delay(3000); //пауза 3 сек he++; } if(status_city !=1&&status_he_voltage!=1&&he>=5&&zum==0) { tone(ton, 1000); //подаю сигнал на зумер delay(500); tone(ton, 1500); //подаю сигнал на зумер delay(1000); tone(ton, 1000); //подаю сигнал на зумер delay(500); tone(ton, 1500); //подаю сигнал на зумер delay(1000); tone(ton, 1000); //подаю сигнал на зумер delay(500); tone(ton, 1500,1000); //подаю сигнал на зумер digitalWrite(ledPin, !digitalRead(ledPin)); // включаем/выключаем LED delay(1000); // задержка 1 сек. zum++; digitalWrite(disconnection,LOW); //подаюм команду - на выключение зажигания delay(700); //пауза 0,7 сек digitalWrite(disconnection_klap,LOW); //подаюм команду - на выключение клапана бензобака } { digitalWrite(ledPin,LOW); delay(500); } if(status_city !=1&&status_he_voltage==1&&r==0) { digitalWrite(disconnection,HIGH); //подаюм команду + на включение зажигания digitalWrite(disconnection_klap,HIGH); //подаюм команду + на включение клапана бензобака delay(60000); //пауза 60 сек digitalWrite(magnetic_city,HIGH); //подаем команду + на реле сети delay(2000); //пауза 2 сек digitalWrite(magnetic_he,HIGH); //подаем команду + на реле генератора r++; } if(status_city ==1&&status_he_voltage==1||val==LOW) { digitalWrite(magnetic_he,LOW); //подаем команду - на реле генератора delay(3000); //пауза 3 сек digitalWrite(magnetic_city,LOW); //подаем команду - на реле сети delay(2000); //пауза 2 сек digitalWrite(disconnection_klap,LOW); //подаюм команду - на выключение клапана бензобака delay(5000); //пауза 5 сек digitalWrite(disconnection,LOW); //подаюм команду - на выключение зажигания r=0; } if(status_city !=1&&status_he_voltage ==1||status_city ==1&&status_he_voltage!=1) { he=0; zum=0; } }
это безнадежно. Чтобы реагировало быстро - все строки с delay() , tone() и beep() надо выкинуть, а тут их половина программы.
Вы бы прежде чем за генератор браться - пару простеньких проектов собрали сначала
Например? в электронике я разбераюсь я не очень волоку программирование! Вот и порасил помощи мне не нужно чтоб сразу реагировал я это понял что delay это плохо но я буду перепысывать скорее всего код но сначала мне хотелось отработать снятия сигнала со входов чтоб знающие люди посмотрели мой код и сказали что можно сделать лучше! вот ставил периуд считывания 100мс плохо работает на мониторе порта меняется значение 0 то 1 а ставишь хотябы 2 сек вроде стабильно!
Какой период снятия сигнала, о чем вы? Вы понимаете, что своими Бипами вы застопорили всю программу? Смотрите - вот у вас начинается основной цикл в программе, вы читаете значения dt и val. И далее, в зависимости от прочитанных значений, ваша программа останавливается либо в строке 122 на 5 секунд, либо в строке 149 - на 9 секунд!
Окакой оперативности тут можно говорить после этого? Какой смысл ставить снятие сигнала 100 мс, если все равно чаще чем раз 5 секунд программа его не читает?
что интересно: операторы типа "delay(700)" вы по всему тексту аккуратно прокомментировали ("//пауза 0,7 сек"), а в строках типа "
if
(status_city !=1&&status_he_voltage!=1&&dt==HIGH&&he<5&&val==HIGH)
" любезно предложили нам разбираться с отслеживанием ваших статусов, пинов и сигналов на них.в итоге что то вышло но так - вообще-то подобные программы желательно начинать с рисования блок-схемы, она здесь напрашивается. (см. https://ru.wikipedia.org/wiki/Блок-схема)
Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать! выходит что он начинает запуск мотора и ту я подаю на вход имитирую что мотор завелся и дал напряжения на вход МК! но программа ждет 3 секунды снова включает реле запуска мотора и так пару раз потом вроде понимает что и выполняет дальше! C deley тут да катастрофа я уже осознал это
Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать!
для начала вам уже посоветовали - прокомментируйте уже написанную программу. Только комментировать нужно правильно. Не пересказывайте код, это никому не нужно, вместо этого обьясняйте, что этот код делает.
пример бесполезного комментария:
а вот - полезный
http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-...
C deley тут да катастрофа я уже осознал это
причем некоторые из delay просто бесполезные, как мне кажется. Зачем , например, нужны задержки в строках 122 и 151? Или beep() по 4 и 8 секунд рядом с ними? - вы сначала добейтесь. чтобы основная часть программы заработала, а потом будете звуковое оформление добавлять
я добавлял тут звук чтоб понять на какую строку перешло выполнение! Я учел ваш совет по поводу звука
я же только начинаю осваивать!
не с того ты осваивать начинаешь.
Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать!
Программирование не допускает столь пренебрежительного отношения к грамматике.
Заставьте себя писать грамотно и приучите себя так делать всегда, на любом языке: русском, Си или Паскале. Иначе в программировании Вам делать нечего.
Тема закрыта,
программа выше уже неакт
уальна всем спасибо!
Я поздно пришел, но мне интересно - что ты делаешь с сэкономленными запятыми? Может есть покупатель какой? Я - в деле, если что!
Да продал