не корректно работает Автозапуск Бензогенератора
- Войдите на сайт для отправки комментариев
Добрый вечер друзья! Я тут впервые! с программированием тоже не очень но нужно было сделать автозапуск на дачю! написал скетч! Но работает он не корректно! отслеживаю напряжение в сети и генератора через оптопары 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 секунд рядом с ними? - вы сначала добейтесь. чтобы основная часть программы заработала, а потом будете звуковое оформление добавлять
я добавлял тут звук чтоб понять на какую строку перешло выполнение! Я учел ваш совет по поводу звука
я же только начинаю осваивать!
не с того ты осваивать начинаешь.
Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать!
Программирование не допускает столь пренебрежительного отношения к грамматике.
Заставьте себя писать грамотно и приучите себя так делать всегда, на любом языке: русском, Си или Паскале. Иначе в программировании Вам делать нечего.
Тема закрыта,
программа выше уже неакт
уальна всем спасибо!
Я поздно пришел, но мне интересно - что ты делаешь с сэкономленными запятыми? Может есть покупатель какой? Я - в деле, если что!
Да продал