Помогите разобраться с условиями срабатывания реле

aleksmok
Offline
Зарегистрирован: 23.01.2016

Добрый день! Нужна помощь с условиями срабатывания реле от влажности и времеени суток. Скетч осущевствляет снятие показания с 2х датчиков DHT22, датчика BMP180, часов реального времени DS3231 и вывод на дисплей 5110. А также управляет реле увлажнителя в комнате  при условии: влажность меньше 40% то включает реле пока влажность не дойдет до 50% и выключает его. Также установлен интервал времени срабатывания с 8 утра до 22 вечера.

Проблема в том что реле не отключается при достижении и привышении влажности 50%.

#include "stDHT.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <DS3231.h>

DHT sens(DHT22);
Adafruit_BMP085 bmp;
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
DS3231  rtc(SDA, SCL);

Time  now;
int rel = 11;
const int button = 10; //кнопка переключения вывода показания термометра на 5110
int buttonState = 0; //кнопка переключения показания термометра

void setup() 
{
  Serial.begin(9600);
  pinMode(8, INPUT);////инициализация датчиков dht22
  digitalWrite(8, HIGH);//инициализация датчиков dht22
  pinMode(9, INPUT);//инициализация датчиков dht22
  digitalWrite(9, HIGH);//инициализация датчиков dht22
 
  rtc.begin();
  bmp.begin();
  Wire.begin();
  display.begin();
  
  pinMode(button, INPUT); //кнопка переключения показания термометра
  
  pinMode(rel, OUTPUT); // реле увлажнителя
}

void loop() 
{
   buttonState = digitalRead(button); //кнопка переключения показания термометра на дисплее
  
  int th = sens.readTemperature(8); // чтение датчика на пине 2 дом
  int hh = sens.readHumidity(8);    // чтение датчика на пине 2 дом
   
  int ts = sens.readTemperature(9); // чтение датчика на пине 3 улица
  int hs = sens.readHumidity(9);    // чтение датчика на пине 3 улица
   
  int b = bmp.readPressure()/133.3; // барометр

  now = rtc.getTime();
  

//вывод на дисплей времени
   display.setTextSize(2);
   display.setTextColor(BLACK);
   display.setCursor(0, 0);
   if ( now.hour < 10)
   {
     display.print(" "); 
     display.print(now.hour);
   }
   else
   {
     display.setCursor(0, 0);
     display.print(now.hour);
   }
   display.print(":");
   if ( now.min < 10)
   {
     display.print("0"); 
     display.print(now.min);
   }
   else
   {
   display.print(now.min);
   }
   display.print(" ");
   
  // вывод на дисплей давления
   display.setTextSize(1);
   display.setTextColor(BLACK);
   display.setCursor(0, 18);
   display.print("P=");
   display.setCursor(13, 18);
   display.print(b);
   display.print("mm");
    
   //вывод на дисплей температуры в комнате
   display.setTextSize(2);
   display.setTextColor(BLACK);
   display.setCursor(0,30);
 if ( buttonState == HIGH)
   {
    display.print(ts); // вывод с уличного датчика
     }
   else
   {
   display.print(th); // вывод с комнатного датчика
   }
   
   display.setTextSize(1);
   display.setTextColor(BLACK);
   display.print("o");
   display.setTextSize(2);
   display.setTextColor(BLACK);
   display.print("C");
   display.display();
   
   // вывод на дисплей влажности в комнате
   display.setTextSize(2);   
   display.setCursor(53,30);
   if ( buttonState == HIGH)
   {
    display.print(hs); // вывод с уличного датчика
    }
   else
   {
   display.print(hh); // вывод с комнатного датчика
   }
      display.setTextSize(1);
   display.setTextColor(BLACK);
   display.print("%"); 
  
   display.display();

   delay(2000);
   display.clearDisplay();  

  // условия срабатывания реле
  if (hh < 40 && now.hour >= 8)
  {
   digitalWrite(rel,HIGH);
  }
  if (hh >= 50 && now.hour >= 22)
  {
   digitalWrite(rel,LOW);
  }  
}
 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 133 , по вашему условию оно выключится при влажности 50 и более, и времени после 22 включительно, думайте!

aleksmok
Offline
Зарегистрирован: 23.01.2016

Valera19701 куда думать - то? Сперва условие выпонялось до того как влажность стала менне 40 и включилось реле.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

может надо меньше 22 часов поставить, а?

aleksmok
Offline
Зарегистрирован: 23.01.2016

А как тогда лучше задать условие чтобы в интервале с 8 утра до 22 вечера выполнялось условие включения при меньше 40 и не более 50?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

задать глобальную переменную boolean sw=0:

  if (hh <= 40 && now.hour >=8) {
    sw = 1;
  }
  else if (hh >= 50&& now.hour <=22) {
    sw = 0;
  }
  switch (sw) {
    case 0:
      digitalWrite(rel, LOW);
      break;
    case 1:
      digitalWrite(rel,HIGH);
      break;
  }

 

aleksmok
Offline
Зарегистрирован: 23.01.2016

Спасибо за помощь! Как раз пытался написать условие через оператор switch после того как ткнули носом!))))))

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а еще лучше так, а то может не выключиться после 22 часов

if (hh <= 40 && now.hour >=8 && now.hour <=22) {
  sw = 1;
}
else if (hh >= 50) {
  sw = 0;
}
switch (sw) {
  case 0:
    digitalWrite(rel, LOW);
    break;
  case 1:
    digitalWrite(rel,HIGH);
    break;
}

 

aleksmok
Offline
Зарегистрирован: 23.01.2016

Valera19701 пишет:

задать глобальную переменную boolean sw=0:

  if (hh <= 40 && now.hour >=8) {
    sw = 1;
  }
  else if (hh >= 50&& now.hour <=22) {
    sw = 0;
  }
  switch (sw) {
    case 0:
      digitalWrite(rel, LOW);
      break;
    case 1:
      digitalWrite(rel,HIGH);
      break;
  }

 

Выключается, проверил. Спасибо!)