Блок управления автоматикой. Не могу разобраться с таймером. Не реагирует на команды.

Нет ответов
gadzhiev_md
Offline
Зарегистрирован: 18.12.2016
// Блок управления домашней автоматикой на 12В для распашных ворот.
// Не могу разобраться с таймером. Не реагирует на команды с кнопки. Описал в первом режиме.
// Мой первый код. Прошу сильно не пинать")))" 
 
int regim=1; 
int flag=0; 
int relayM1 = 8; // Открытие первой створки 
int relayM2 = 9; // Открытие второй створки
int relayM1R = 10; // R - реверс (закрытие первой створки)
int relayM2R = 11; // R - реверс (закрытие второй створки)
int swPin = 7; // Кнопка упрвления (открыть, стоп, закрыть, стоп)
int runTimer = 1;
int runFor = 3; //Таймер в сек. (время задержки одного из двигателей)
int data = 0;
int LED = 12; // Сигнальная лампа(моргает пока работает хотя-бы один из двигателей)
int sens = 6; // Контакты для фотоэлементов внутри арки. При замыкании контактов двигатели останавливаются на некоторое время (2-5с) и идут в реверс (открыватся)
 
/* Из таймеров должены быть:
 1-  Время работы системы на открытие 
 2-  Время работы системы на закрытие
 3-  Задержка первой створки (двигателя)
 4-  Задержка второй створки (двигателя)
 */
 
 void setup()   
 { 
    pinMode(relayM1, OUTPUT);    
    pinMode(relayM2, OUTPUT);
    pinMode(relayM1R, OUTPUT);
    pinMode(relayM2R, OUTPUT);  
    pinMode(swPin, INPUT);
    pinMode(LED, OUTPUT);
    pinMode(sens, INPUT);
    digitalWrite(swPin, HIGH);//включаем внутренний pull-up резистор
 } 
 
 void loop() 
{  
     if(digitalRead(swPin) == HIGH &&  flag==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
       regim ++;   
       flag = 1; 
       if(regim>4)//ограничим количество режимов 
        { 
          regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично 
        } 
     } 
       
      if(digitalRead(swPin) == LOW && flag == 1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
        flag = 0;//обнуляем переменную "knopka" 
     }  
      
       
       
    if(regim == 1)//первый режим 
    {
/*----------Задержка на открытие для мотора M1 ---------------*/
 
      int val = digitalRead(swPin);
      if (val == 1)
          {
            digitalWrite(relayM1,LOW); 
            timer();
          }
      else {digitalWrite(relayM1,HIGH);}
      runTimer=0;
  // !!! Задержка происходит как надо, но пока включена задержка видимо из-за delay не реагирует на кнопку swPin. Т.е. ворота не остановить. 
  //  И при повторном запуске кода таймер уже не работает. Как буд-то уже отсчитал и запомнил как сделанное. 
/*-----------------------------------------------------------------------*/
    
      digitalWrite(relayM2,LOW);
      digitalWrite(relayM1R,HIGH); 
      digitalWrite(relayM2R,HIGH);  
      delay(50);
    }
 
    
    if(regim == 2)//Второй режим. Ворота остановились.
    { 
      digitalWrite(relayM1,HIGH);
      digitalWrite(relayM2,HIGH);
      digitalWrite(relayM1R,HIGH); 
      digitalWrite(relayM2R,HIGH);
      delay(50);
    }
      
    if(regim == 3)//Третий режим. Ворота закрываются.
    { 
/*---------------Задержка на закрытие для мотора М2--------------------*/
       int val = digitalRead(swPin);
      if (val == 1)
          {
            digitalWrite(relayM2R,LOW);
            timer();
          }
      else {digitalWrite(relayM2R,HIGH);}
      runTimer=0;
      digitalWrite(relayM1,HIGH);
      digitalWrite(relayM2,HIGH);
      digitalWrite(relayM1R,LOW);
      delay(50);
    } 
    
    if(regim == 4)//Третий режим. Ворота остановились. 
    { 
      digitalWrite(relayM1,HIGH);
      digitalWrite(relayM2,HIGH);
      digitalWrite(relayM1R,HIGH); 
      digitalWrite(relayM2R,HIGH);
      delay(50);  
    } 
}
 
void timer() 
{
  for(int timer=runFor;timer>0;--timer)
    {delay(1000);}
}