Помогите разобраться с условиями срабатывания реле
- Войдите на сайт для отправки комментариев
Сб, 23/01/2016 - 14:21
Добрый день! Нужна помощь с условиями срабатывания реле от влажности и времеени суток. Скетч осущевствляет снятие показания с 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);
}
}
строка 133 , по вашему условию оно выключится при влажности 50 и более, и времени после 22 включительно, думайте!
Valera19701 куда думать - то? Сперва условие выпонялось до того как влажность стала менне 40 и включилось реле.
может надо меньше 22 часов поставить, а?
А как тогда лучше задать условие чтобы в интервале с 8 утра до 22 вечера выполнялось условие включения при меньше 40 и не более 50?
задать глобальную переменную 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; }Спасибо за помощь! Как раз пытался написать условие через оператор switch после того как ткнули носом!))))))
а еще лучше так, а то может не выключиться после 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; }задать глобальную переменную 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; }Выключается, проверил. Спасибо!)