#include <Wire.h> // для работы с реле
#include <LiquidCrystal_I2C.h> // для работы с жк дисплеем
#include "DHTesp.h"
// #include <ESP32Servo.h>
// пин датчика с температурой
const int DHT_PIN = 15;
// пин датчика влажности почвы
const int WATER_LEVEL_PIN = 34;
// пин реле
const int SPRINKLER_CONTROL_PIN = 13;
// пин серво
const int SERVO_Pin = 35;
// пины сигнальных лампочек
const int TEMPERATURE_WARNING_LED = 25;
const int WATER_LEVEL_WARNING_LED = 26;
// крайние значения температуры
const float TEMPERATURE_LIMIT_UPPER = 35.0;
const float TEMPERATURE_LIMIT_LOWER = 15.0;
// крайние значения влажности
const float HUMIDITY_LIMIT_UPPER = 80.0;
const float HUMIDITY_LIMIT_LOWER = 40.0;
// крайние значения уровня воды
const int WATER_LEVEL_LIMIT_UPPER = 3135;
const int WATER_LEVEL_LIMIT_LOWER = 2165;
// подключение к дк дисплею
LiquidCrystal_I2C lcd(0x27,16,2);
DHTesp dhtSensor;
// Servo servo;
// базовая настройка и подключение всех пинов
void setup()
{
pinMode(SPRINKLER_CONTROL_PIN, OUTPUT);
pinMode(TEMPERATURE_WARNING_LED, OUTPUT);
pinMode(WATER_LEVEL_WARNING_LED, OUTPUT);
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);
// servo.attach(servoPin);
Wire.begin(23, 22);//подключение к шине и настройка кто Master а кто Slave
Serial.begin(9600);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
}
void loop()
{
//получение данных с датчиков
TempAndHumidity dht_data = dhtSensor.getTempAndHumidity();
int16_t water_level = analogRead(WATER_LEVEL_PIN);//уровень воды
//дальше работаем со строкой в которую записываем значения плохо или норма
String water_level_msg = water_level < WATER_LEVEL_LIMIT_LOWER ? "LOW" : "NORMAL";
String temeparature_level_msg = dht_data.temperature > TEMPERATURE_LIMIT_UPPER ? "HIGH" :"NORMAL";
temeparature_level_msg = dht_data.temperature < TEMPERATURE_LIMIT_UPPER ? "LOW" :"NORMAL";
String humidity_level_msg = dht_data.humidity < HUMIDITY_LIMIT_LOWER ? "LOW" : "NORMAL";
lcd.clear();
// обработка событий
// на пример тут начинаем с низкой влажности и высокой температуры
if(water_level_msg=="LOW" && temeparature_level_msg=="HIGH"){
// выводим предумперждения
lcd.setCursor(0, 0);
lcd.print("----- WARNING! -----");
lcd.setCursor(0, 1);
lcd.print("--- SPRINKLER ON ---");
// задаем режим работы пинов, что понизить температуру
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);//в качестве нагревателя используется красная лампочка
// дополнительная индикация при помощи лампочек
digitalWrite(WATER_LEVEL_WARNING_LED, HIGH);
digitalWrite(TEMPERATURE_WARNING_LED, HIGH);
}
else if(water_level_msg=="LOW"){
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);
digitalWrite(WATER_LEVEL_WARNING_LED, HIGH);
digitalWrite(TEMPERATURE_WARNING_LED, LOW);
lcd.setCursor(0, 0);
lcd.print("------ [INFO] ------");
lcd.setCursor(0, 1);
lcd.print("- LOW WATER LEVEL! -");
}
else if(temeparature_level_msg=="HIGH"){
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);
digitalWrite(WATER_LEVEL_WARNING_LED, LOW);
digitalWrite(TEMPERATURE_WARNING_LED, HIGH);
lcd.setCursor(0, 0);
lcd.print("------ [INFO] ------");
lcd.setCursor(0, 1);
lcd.print("- HIGH TEMPERATURE -");
// for (int pos = 0; pos <= 60; pos += 1) {
// servo.write(pos);
// delay(15);
// if(temeparature_level_msg == "NORMAL") break;
// }
}
else if(temeparature_level_msg=="LOW"){
digitalWrite(SPRINKLER_CONTROL_PIN, HIGH);
digitalWrite(WATER_LEVEL_WARNING_LED, LOW);
digitalWrite(TEMPERATURE_WARNING_LED, HIGH);
lcd.setCursor(0, 0);
lcd.print("------ [INFO] ------");
lcd.setCursor(0, 1);
lcd.print("- LOW TEMPERATURE -");
}
else{
lcd.setCursor(0, 0);
lcd.print("Temperature: ");
lcd.print(temeparature_level_msg);
lcd.setCursor(0, 1);
lcd.print("Humidity : ");
lcd.print(humidity_level_msg);
lcd.setCursor(0, 2);
lcd.print("Water Level: ");
lcd.print(water_level_msg);
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);
digitalWrite(WATER_LEVEL_WARNING_LED, LOW);
digitalWrite(TEMPERATURE_WARNING_LED, LOW);
}
delay(500);
}