Помогите, не реагирует реле.

100ika
Offline
Зарегистрирован: 07.02.2017

Помогите разобраться. Не могу найти ошибку. Цель - контроль температуры в термошкафу. Если температура меньше 120 градусов включаем реле и нагреваем шкаф 5 сек, затем выключаем реле. Если больше 120 - реле остается выключенным. 

Проблема заключается в том, что реле не переключается в состояние вкл если температура меньше 120. 

Ниже скетч. 


#include <OneWire.h>
OneWire ds(8); // Объект OneWire
int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20
long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика
const int TEMP_UPDATE_TIME = 60000; // Определяем периодичность проверок
#define PIN_RELAY 7
#define RELAY_ON 1
#define RELAY_OFF 0
char relay_state = RELAY_OFF;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_RELAY, OUTPUT); //Объявляем пин реле как выход
  digitalWrite(PIN_RELAY, HIGH); //Выключаем реле - посылаем высокий сигнал
}
void loop() {

  byte data[2]; 
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)
  {
    lastUpdateTime = millis();
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    // Формируем значение
    temperature = (data[1] << 8) + data[0];
    temperature = temperature >> 4;
    if (temperature < 120) { // Если темп меньше 120 то
      digitalWrite(PIN_RELAY, LOW); //Вкл реле
      relay_state = RELAY_ON; // Присваиваем переменной состояния - реле включено
    } else { //Если больше 120 то 
      digitalWrite(PIN_RELAY, HIGH); //Выключаем реле 
      relay_state = RELAY_OFF;//Присваиваем переменной состояния - реле выключено
    }
    Serial.println(temperature); // Выводим полученное значение температуры
    // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться
    if (relay_state == RELAY_ON && lastUpdateTime + 5000) // Если реле Вкл и прошло 5 секунд то 
    {
      digitalWrite(PIN_RELAY, HIGH); // Выключаем реле 
      relay_state = RELAY_OFF; // Реле выключено
    }
  }

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нет, это 

42     if (relay_state == RELAY_ON && lastUpdateTime + 5000) // Если реле Вкл и прошло 5 секунд то

не так работает

Komandir
Offline
Зарегистрирован: 18.08.2018

36 37 38 не нужны

в 42 меняем lastUpdateTime + 5000 на (miillis()-lastUpdateTime >=5000)

100ika
Offline
Зарегистрирован: 07.02.2017

Спасибо. Теперь реле включается если условие выполняется, но не выключается через 5 сек. Остается во вкл положении. 

Komandir
Offline
Зарегистрирован: 18.08.2018

if из 42 надо вынести за пределы if из 22

100ika
Offline
Зарегистрирован: 07.02.2017

Спасибо огромное! Все получилось.