Включение выхода на определенное время.

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016

Добрый день, уважаемые формучане. Приобрел ATMega2560, разбираюсь. Вот встал в тупик: есть меню горизонтальное, навигация кнопками по нему, в нем есть пункт работы насоса в автомате (работает в заданное время) либо в ручном режиме. Так вот, в автомате еще более менее ясно как сделать (включить выход когда столько-то времени на часах, выключить когда столько то времени). А вот в ручном режиме? Я нажимаю кнопку на соответствующем пункте меню, у меня поднимается флаг работы насоса, но не получается сделать чтобы он проработал минуту и отключился, и до дальнейшего нажатия не включался? Delay() тут не подходит, т.к. параллельно должны выполняться и другие задачи

Пытался сделать по примеру, который нашел, но не работает. Подскажите, как разобраться

boolean FLAG_NAS = 0;              // состояние выхода полива

boolean NAS_AVT = 1;               // полив в автомате

boolean NAS_ON = 0;                // насос запущен 
boolean NAS_OFF = 0;               // насос остановлен
  
#define nextPin 6                      // по меню вправо
#define prevPin 7                      // по меню влево
#define upPin 9                        // увеличение значения отображаемого параметра
#define downPin 10                     // уменьшение значения отображаемого параметра
#define nasPin 11                      // Индикатор насос
#define oknoPin 12                     // активация 1-го реле
#define zoknoPin 13                    // активация 2-го реле

#define TIME_ON_NAS 1000 // Время, в течении которого на выходе 1
#define TIME_OFF_NAS 10000  // Время в течении которого на выходе 0

unsigned long new_millis_nas = millis();   // переменная для хранения времени открытия окна

boolean buttonnextWasUp = true;
boolean buttonprevWasUp = true;
boolean buttonupWasUp = true;
boolean buttondownWasUp = true;

void setup()
{   //*****
     pinMode(nextPin, INPUT);
  pinMode(prevPin, INPUT);
  pinMode(upPin, INPUT);
  pinMode(downPin, INPUT);

  //установка пинов как выходы
  pinMode(nasPin, OUTPUT);
  pinMode(zoknoPin, OUTPUT);
   //******
  digitalWrite(nasPin, HIGH);

}

void loop()
{
boolean buttonnextIsUp = digitalRead(nextPin);  
  boolean buttonprevIsUp = digitalRead(prevPin);   
  boolean buttonupIsUp = digitalRead(upPin);        
  boolean buttondownIsUp = digitalRead(downPin);    

if (buttonupWasUp && !buttonupIsUp)                 
  {
    delay(50);                                        
    buttonupIsUp = digitalRead(upPin);                
    if (!buttonupIsUp && m == 5)                      // если кнопка уже на нажата и мы на 6 странице меню
    {
      FLAG_NAS = 1;                                // то устанавливаем флаг ручного полива
      NAS_AVT = 0;                                 // и отключаем флаг автоматического полива
      NAS_ON = 1;                                  // флаг работы насоса

      delay (100);
      lcd.setCursor(5, 1);
      lcd.print("   ");
    }
  }

//***************************************запуск полива вручную*****************************************************
if (NAS_ON)
  { if (millis()>new_millis_nas)
    {
     NAS_ON = !NAS_ON;  
      digitalWrite(nasPin, LOW);
      if(NAS_ON)
      {
       new_millis_nas=millis()+TIME_ON_NAS;
       }
     }
  else { 
    new_millis_nas=millis() + TIME_OFF_NAS;
       }
}


 

nik182
Offline
Зарегистрирован: 04.05.2015

Очень смущает строка 19. Мне кажется,что new_millis_nas = millis() должно быть на 57, а = millis() вообще лишнее.

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016
Да, я все таки смог разобраться, вроде бы вот так гораздо лучше


if (NAS_ON && !rel_nas)                           //если в ручном запустили 
  { new_millis_nas = millis();                      //засекаем время
      rel_nas = 1;                                  //ставим флаг, чтобы время засекалось один раз
       digitalWrite(nasPin, LOW);                   //включаем выход реле
  }
     
  if(rel_nas && millis()-new_millis_nas>=5000)      //проверяем, прошло ли заданное время работы клапана
    { NAS_ON=0;                                     //убираем флаг
      rel_nas =0;                                   //чтобы больше не возвращаться сюда
      digitalWrite(nasPin,HIGH);                    // и выключаем клапан
    }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Посмотри это. http://arduino.ru/forum/programmirovanie/klass-protsessy-i-programma-blink-bottom  Может что-то подойдет

 Хотите вы или нет, но вам по любому надо параллелить процессы. Опрос кнопок меню и отчет времени работы клапана.