Включение выхода на определенное время.
- Войдите на сайт для отправки комментариев
Добрый день, уважаемые формучане. Приобрел 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; } }
Очень смущает строка 19. Мне кажется,что new_millis_nas = millis() должно быть на 57, а = millis() вообще лишнее.
Посмотри это. http://arduino.ru/forum/programmirovanie/klass-protsessy-i-programma-blink-bottom Может что-то подойдет
Хотите вы или нет, но вам по любому надо параллелить процессы. Опрос кнопок меню и отчет времени работы клапана.