Вопрос по включению внешнего устройства один раз в цикле

romans90
Offline
Зарегистрирован: 08.03.2016

Добрый день.

Вопрос такой - в цикле я проверяю состояние с 3х сенсоров, все стандартно (if ... else).

В цикле програма крутится постоянно и выход, который я включаю (это реле, подает напряжение на клапан) постоянно включен, т.е. клапан под напряжением. Мне надо что бы в цикле выход включился ОДИН РАЗ на 5 сек, а потом выключился (скажем через deley) , но оставался в том же цикле, которому соответствует состояние датчиков.

Т.е. если Датчики имеют состояние АА, то выходные сигнал А = 1 и сигнал Б = 0 включится на 5 сек. а потом выключатся

если Датчики имеют состояние ББ, то выходные сигнал А = 0 и сигнал Б = 1 включится на 5 сек. а потом выключатся.

С сигналами А и Б ничего не должно произходить пока сенсоры не поменяют свое состояни в соответвии с if...

Посоветуйте направление куда копать и как оптимальнее сделать.

Спасибо.

JasKo
Offline
Зарегистрирован: 21.11.2015

Ну надо написать както так.

if ( состояние датчиков чемуто равно и выход выключен) {запомнить текущее время и включить выход}

if (выход включен и прошло N сек от запомненого времени включения) {выключит выход}

Ка видишь ничего сложного.

 

romans90
Offline
Зарегистрирован: 08.03.2016

Спасибо. попробую. Я не програмист и этом занимаюсь месяца 3.... так что для меня все не просто :)

А можно использовать в If (для проверки) выход, который включаю?

У меня определено (это управление):

int Klapan_Open = 8;  // Управление клапанами "0" - открытие клапана
int Klapan_Close = 9;  // Управление клапанами "0" - закрытие клапана
int Boiler_ON = 13; // "0" Когда Бойлер включен - детектор включения 220V
 
void setup()
{
digitalWrite(Klapan_Open, HIGH); // '1' Выключения реле Питание на клапана не подается в момент включения модуля
digitalWrite(Klapan_Close, HIGH); // '1' Выключения реле Питание на клапана не подается в момент включения модуля
 
Далее еще кусок кода... 
 
теперь самое главное:
 
// Включение / отключение Солнечного обогрева ---------------------------
if (SOLAR_T - 1 < BOILER_T || digitalRead(Boiler_ON)== LOW) // Если температура сонца меньше чем в Бойлере или Бойлер Включен, закрываем клапан
{
  lcd.setCursor(16,1); // Если Бойлер включен, или Т солнеч. нагрев. ниже Т Бойлера, запираем клапан
  lcd.print("OFF");  
  digitalWrite(Klapan_Close, LOW); // "0" Включаем Реле закрытия клапана
  digitalWrite(Klapan_Open, HIGH); // "1" Выключаем Реле откытия клапана
 
  delay(5000);
}
 
Тут наверно надо сделать еще один if с тем де условием, но проверить Klapan_Close, если '0', то выполнить следующее...
 
  digitalWrite(Klapan_Close, HIGH); // "0" Выключаем Реле закрытия клапана
  digitalWrite(Klapan_Open, HIGH); // "1" Выключаем Реле откытия клапана
 
Но для этого в первом if наверно тоже надо проверить состояние Klapan_Close, инче из первого цикла не выйти?