не корректно работает Автозапуск Бензогенератора

Евгений1990
Offline
Зарегистрирован: 23.07.2020

Добрый вечер друзья! Я тут впервые! с программированием тоже не очень но нужно было сделать автозапуск на дачю! написал скетч! Но работает он не корректно! отслеживаю напряжение в сети и генератора через оптопары 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;

}

}

  

b707
Offline
Зарегистрирован: 26.05.2017

это безнадежно. Чтобы реагировало быстро - все строки с delay() , tone() и beep() надо выкинуть, а тут их половина программы.

Вы бы прежде чем за генератор браться - пару простеньких проектов собрали сначала

Евгений1990
Offline
Зарегистрирован: 23.07.2020

Например? в электронике я разбераюсь я не очень волоку программирование! Вот и порасил помощи мне не нужно чтоб сразу реагировал я это понял что delay это плохо но я буду перепысывать скорее всего код но сначала мне хотелось отработать снятия сигнала со входов чтоб знающие люди посмотрели мой код и сказали что можно сделать лучше! вот ставил периуд считывания 100мс плохо работает на мониторе порта меняется значение 0 то 1 а ставишь хотябы 2 сек вроде стабильно!

 

b707
Offline
Зарегистрирован: 26.05.2017

Какой период снятия сигнала, о чем вы? Вы понимаете, что своими Бипами вы застопорили всю программу? Смотрите - вот у вас начинается основной цикл в программе, вы читаете значения dt и val. И далее, в зависимости от прочитанных значений, ваша программа останавливается либо в строке 122 на 5 секунд, либо в строке 149 - на 9 секунд!

Окакой оперативности тут можно говорить после этого? Какой смысл ставить снятие сигнала 100 мс, если все равно чаще чем раз 5 секунд программа его не читает?

SLKH
Offline
Зарегистрирован: 17.08.2015

что интересно: операторы типа "delay(700)" вы по всему тексту аккуратно прокомментировали ("//пауза 0,7 сек"), а в строках типа "if(status_city !=1&&status_he_voltage!=1&&dt==HIGH&&he<5&&val==HIGH) " любезно предложили нам разбираться с отслеживанием ваших статусов, пинов и сигналов на них.

в итоге что то вышло но так - вообще-то подобные программы желательно начинать с рисования блок-схемы, она здесь напрашивается. (см. https://ru.wikipedia.org/wiki/Блок-схема)

Евгений1990
Offline
Зарегистрирован: 23.07.2020

Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать! выходит что он начинает запуск мотора и ту я подаю на вход имитирую что мотор завелся и дал напряжения на вход МК! но программа ждет 3 секунды снова включает реле запуска мотора и так пару раз потом вроде понимает что и выполняет дальше! C deley тут да катастрофа я уже осознал это

b707
Offline
Зарегистрирован: 26.05.2017

Евгений1990 пишет:

Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать!

для начала вам уже посоветовали - прокомментируйте уже написанную программу. Только комментировать нужно правильно. Не пересказывайте код, это никому не нужно, вместо этого обьясняйте, что этот код делает.

пример бесполезного комментария:

delay(700);  // задержка 700мс

а вот - полезный

delay(700);  // задержка на время запуска стартера

 

Клапауций 12345
Offline
Зарегистрирован: 17.05.2020
b707
Offline
Зарегистрирован: 26.05.2017

Евгений1990 пишет:

C deley тут да катастрофа я уже осознал это

причем некоторые из delay просто бесполезные, как мне кажется. Зачем , например, нужны задержки в строках 122 и 151? Или beep() по 4 и 8 секунд рядом с ними? - вы сначала добейтесь. чтобы основная часть программы заработала, а потом будете звуковое оформление добавлять

Евгений1990
Offline
Зарегистрирован: 23.07.2020

я добавлял тут звук чтоб понять на какую строку перешло выполнение! Я учел ваш совет по поводу звука

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Евгений1990 пишет:

я же только начинаю осваивать! 

не с того ты осваивать начинаешь. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Евгений1990 пишет:

Так вот я же с вами и не спорю просто может кто подкинет пример как можно немного добавить коректности я же только начинаю осваивать!

Евгений, мне кажется, Ваши проблемы намного глубже.

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

Заставьте себя писать грамотно и приучите себя так делать всегда, на любом языке: русском, Си или Паскале. Иначе в программировании Вам делать нечего.

Евгений1990
Offline
Зарегистрирован: 23.07.2020

Тема закрыта,
программа выше уже неакт
уальна всем спасибо!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я поздно пришел, но мне интересно - что ты делаешь с  сэкономленными запятыми? Может есть покупатель какой? Я - в деле, если что!

Евгений1990
Offline
Зарегистрирован: 23.07.2020

Да продал