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