#include <DHT.h>
#include <EEPROM.h>
#include <GyverButton.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <microDS18B20.h>
#include "Symbol.h"
#define PLUSBTN 2
#define MINUSBTN 3
#define DHTPIN 4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
bool blinkFlag = 0, changeTempFlag = 0;
int relay = 12, buzzer = 13, setTempFlag = 0;
float lowTemp = 37.5, highTemp = 37.7, minLowTemp = 30.0, maxHighTemp = 40.0, dsTemperature = 0.0, dhtHumidity = 0.0, dhtTemperature = 0.0;
unsigned long timerReqTemp, backlightTimer, textBlinkTimer, saveTimer = 0;
DHT dht(DHTPIN, DHTTYPE);
MicroDS18B20<5> tempDat;
LiquidCrystal_I2C disp(0x27, 16, 2);
GButton plusButton(PLUSBTN);
GButton minusButton(MINUSBTN);
void SetMinTemp();
void SetMaxTemp();
void setup()
{
pinMode(relay, OUTPUT);
pinMode(buzzer, OUTPUT);
disp.init();
dht.begin();
disp.createChar(1, b_celsiy);
disp.createChar(2, b_tempLow);
disp.createChar(3, b_tempHigh);
disp.createChar(4, b_dsSymbol);
disp.createChar(5, b_dhtSymbol);
plusButton.setStepTimeout(250);
minusButton.setStepTimeout(250);
lowTemp = EEPROM.get(5,lowTemp);
highTemp = EEPROM.get(15,highTemp);
if (isnan(lowTemp) || isnan(highTemp)) {
lowTemp = 37.0;
highTemp = 38.0;
}
disp.setCursor(0, 1);
disp.print("T\2");
disp.print(lowTemp, 1);
disp.setCursor(8, 1);
disp.print("T\3");
disp.print(highTemp, 1);
//Serial.begin(9600);
}
void loop()
{
plusButton.tick();
minusButton.tick();
//###############Опитування датчиків DS18B20 і DHT22############################
if (millis() - timerReqTemp > 1000)
{
tempDat.requestTemp();
timerReqTemp = millis();
dsTemperature = tempDat.getTemp();
dhtHumidity = dht.readHumidity();
dhtTemperature = dht.readTemperature();
}
//###############Виведення температури (і вололгості з DHT22) датчиків DS18B20 і DHT22 на дисплей###############
if(changeTempFlag){
disp.setCursor(0, 0);
disp.print("T\4");
disp.print(dsTemperature, 1);
disp.print("C\1 ");
}
else if(!changeTempFlag)
{
disp.setCursor(0, 0);
disp.print("T\5");
disp.print(dhtTemperature, 1);
disp.print("C\1 ");
}
disp.setCursor(9, 0);
disp.print("H:");
disp.print(dhtHumidity, 1);
disp.print("%");
//###############Реалізація роботи термостата###############
if (dhtTemperature <= lowTemp)
{
digitalWrite(relay, HIGH);
}
else if (dhtTemperature >= highTemp)
{
digitalWrite(relay, LOW);
}
//###############Виставлення температури спрацьовування реле############
if (minusButton.isHold() && setTempFlag == 0)
{
saveTimer = millis();
setTempFlag = 1;
}
else if (plusButton.isHold() && setTempFlag == 0)
{
saveTimer = millis();
setTempFlag = 2;
}
if (setTempFlag == 1)
{
SetMinTemp();
}
else if (setTempFlag == 2)
{
SetMaxTemp();
}
//###############Вимкнення дисплею після 5 хв бездіяльності######################
if (plusButton.isPress() || minusButton.isPress())
{
disp.backlight();
backlightTimer = millis();
}
else if (millis() - backlightTimer > 60000)
{
disp.noBacklight();
backlightTimer = millis();
}
//###############Світлозвукове оповіщення про критичну температуру#######################################
if(dhtTemperature <= minLowTemp)
{
digitalWrite(buzzer, blinkFlag);
}
else if (dhtTemperature >= maxHighTemp)
{
digitalWrite(buzzer, HIGH);
}
else
{
digitalWrite(buzzer, LOW);
}
//###############Допоміжні приколи#######################################
if (millis() - textBlinkTimer > 800)
{
textBlinkTimer = millis();
blinkFlag = !blinkFlag;
}
if ((plusButton.isClick() || minusButton.isClick()) && setTempFlag == 0)
{
changeTempFlag = !changeTempFlag;
}
//###############Потом удалити########################################
// Serial.print(lowTemp);
// Serial.print(" ");
// Serial.print(minusButton.isHolded());
// Serial.print(" ");
// Serial.print(setTempFlag);
// Serial.print(" ");
// Serial.print(blinkFlagStep);
// Serial.print(" ");
// Serial.println(highTemp);
}
//###############Функція виставлення нижнього порогу температури########################################
void SetMinTemp()
{
if (minusButton.isClick() || minusButton.isStep())
{
lowTemp -= 0.1;
saveTimer = millis();
}
else if ((plusButton.isClick() || plusButton.isStep() )&& lowTemp < (highTemp - 0.1))
{
lowTemp += 0.1;
saveTimer = millis();
}
if (blinkFlag)
{
disp.setCursor(0, 1);
disp.print("T\2");
disp.print(lowTemp, 1);
}
else if (!blinkFlag)
{
disp.setCursor(0, 1);
disp.print(" ");
disp.print(lowTemp, 1);
}
if ((millis() - saveTimer) > 5000)
{
EEPROM.put(5,lowTemp);
setTempFlag = 0;
disp.setCursor(0, 1);
disp.print("T\2");
}
}
//###############Функція виставлення верхнього порогу температури########################################
void SetMaxTemp()
{
if ((minusButton.isClick() || minusButton.isStep()) && highTemp > (lowTemp + 0.1))
{
highTemp -= 0.1;
saveTimer = millis();
}
else if (plusButton.isClick() || plusButton.isStep())
{
highTemp += 0.1;
saveTimer = millis();
}
if (blinkFlag)
{
disp.setCursor(8, 1);
disp.print("T\3");
disp.print(highTemp, 1);
}
else if (!blinkFlag)
{
disp.setCursor(8, 1);
disp.print(" ");
disp.print(highTemp, 1);
}
if ((millis() - saveTimer) > 5000)
{
setTempFlag = 0;
EEPROM.put(15,highTemp);
disp.setCursor(8, 1);
disp.print("T\3");
}
}