Работа с таймером

Sergey.Akinshin
Offline
Зарегистрирован: 29.01.2017

Здравствуйте.

не пойму как сделать включение вентилятора на определенное время после выключения света в туалете, а именно как привязаться к millis()

Освоил такой таймер он срабатывает один раз в в какойто период времени (в данном случае раз в 2 секунды)

  if (millis() - timerDHT  > 2000 )         // раз в 2 секунды считываем показания датчика DHT11
    {
      Temperatura1 = dht.readTemperature(); // Получаем данный о температуре
      Vlajnost1 = dht.readHumidity();       // Получаем данный о влажности
      timerDHT = millis();                  // Сбрасываем таймер для нового отсчета
    }

код управления вентилятором и светом в туалете (при выключеном свете ВСЕ время работает вентилятор)

// Управление реле света в туалете
  if (digitalRead(SensBOTTON2Pin) == LOW)   // если сенсорный выключатель включен
    {
      digitalWrite(ReleLIGHT2Pin, HIGH);    // включаем реле управляющее светом
    }
  else                                      // если сенсорный выключатель выключен
    {
      digitalWrite(ReleLIGHT2Pin, LOW);     // выключаем реле управляющее светом
    }

// Управление реле вентилятора в туалете
  if (digitalRead(ReleLIGHT2Pin) == LOW)    // если выключаем реле управляющее светом
    {
      digitalWrite(ReleFUN2Pin, HIGH);      // включаем реле управляющее вентилятором
    }
  else
    {
      digitalWrite(ReleFUN2Pin, LOW);       // выключаем реле управляющее вентилятором
    }

может на if...else это сделать нереально? и надо использовать другие операторы управления.

может както отслеживать изменение состояния сенсорной кнопки? пробовал такое условие:

if (digitalRead(ReleLIGHT2Pin) == !digitalRead(ReleLIGHT2Pin) && digitalRead(ReleLIGHT2Pin) == LOW)
    {
      digitalWrite(ReleFUN2Pin, HIGH);      // включаем реле управляющее вентилятором
      timerFUN2 = millis();                             // запускаем таймер во время выключения реле света
    }

if (if (digitalRead(ReleLIGHT2Pin) == LOW && millis() - timerFUN2 > 30000)
    { 
       digitalWrite(ReleFUN2Pin, LOW); // выключаем реле управляющее вентилятором после 30 секунд работы
    }

но тоже не хочет правильно реагировать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergey.Akinshin пишет:

может на if...else это сделать нереально? и надо использовать другие операторы управления.

Какие бы Вы предложили?

Sergey.Akinshin
Offline
Зарегистрирован: 29.01.2017

Решил свою задачу так:

назначил переменную текушего состояния реле света перед условием

в самом конце цикла назначил переменную текушего состояния реле света

в первом условии сравниваю, что они не  должны быть равны и состояние реле управления света - выключено

внутри код включаю реле вентилятора

и сбрасываю таймер для начала осчтета.

во втором условии слежу за временем если оно превысит заданное

выключаю реле управленияя вентилятором

 

// Управление реле вентилятора в туалете
  boolean ReleLIGHT2 = digitalRead(ReleLIGHT2Pin);  // Считываем текущее состояние реле управления светом
  if (Previous_ReleLIGHT2 != ReleLIGHT2 && digitalRead(ReleLIGHT2Pin) == LOW)    // если происходит изменение состояния реле управляющее светом и оно выключено
    {
      digitalWrite(ReleFUN2Pin, HIGH);      // включаем реле управляющее вентилятором
      timerFUN2 = millis();                 // сбрасываем таймер
    }
  if (millis() - timerFUN2  > 5000)         // как только таймер отсчитал 5 секунд
    {
      digitalWrite(ReleFUN2Pin, LOW);       // выключаем реле управляющее вентилятором
    }
// Запоминаем состояния
Previous_ReleLIGHT2 = digitalRead(ReleLIGHT2Pin); // Запоминаем в каком состоянии было реле управления светом в предыдущем цикле loop