#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2 // DHT22 sensor connected to pin 2
#define DHTTYPE DHT22 // DHT22 sensor
#define RELAY_COOLER1 3
#define RELAY_COOLER2 6
#define RELAY_HEATER 4
#define RELAY_BOILER 5
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD I2C address 0x27, 20 chars, 4 lines
const float TARGET_TEMP = 30.0; // Target temperature
const float TARGET_HUMIDITY = 65.0; // Target humidity
unsigned long previousHeaterMillis = 0;
unsigned long previousBoilerMillis = 0;
unsigned long previousCoolerMillis = 0;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init(); // Use lcd.init() instead of lcd.begin()
lcd.backlight();
pinMode(RELAY_COOLER1, OUTPUT);
pinMode(RELAY_COOLER2, OUTPUT);
pinMode(RELAY_HEATER, OUTPUT);
pinMode(RELAY_BOILER, OUTPUT);
digitalWrite(RELAY_COOLER1, LOW);
digitalWrite(RELAY_COOLER2, LOW);
digitalWrite(RELAY_HEATER, LOW);
digitalWrite(RELAY_BOILER, LOW);
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 0);
lcd.print("Failed to read from");
lcd.setCursor(0, 1);
lcd.print("DHT sensor!");
return;
}
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print(" %");
unsigned long currentMillis = millis();
// Temperature control
float tempRatio = (t / TARGET_TEMP) * 100;
if (tempRatio < 85) {
digitalWrite(RELAY_HEATER, HIGH);
} else if (tempRatio < 90) {
if (currentMillis - previousHeaterMillis >= 18000) { // 10s ON, 8s OFF
previousHeaterMillis = currentMillis;
digitalWrite(RELAY_HEATER, HIGH);
delay(8000); // Heater stays on for 10 seconds
digitalWrite(RELAY_HEATER, LOW);
delay(10000); // Heater stays off for 8 seconds
}
} else if (tempRatio < 94) {
if (currentMillis - previousHeaterMillis >= 10000) { // 5s ON, 5s OFF
previousHeaterMillis = currentMillis;
digitalWrite(RELAY_HEATER, HIGH);
delay(5000); // Heater stays on for 5 seconds
digitalWrite(RELAY_HEATER, LOW);
delay(6000); // Heater stays off for 5 seconds
}
} else if (tempRatio < 98) {
if (currentMillis - previousHeaterMillis >= 9000) { // 3s ON, 6s OFF
previousHeaterMillis = currentMillis;
digitalWrite(RELAY_HEATER, HIGH);
delay(3000); // Heater stays on for 3 seconds
digitalWrite(RELAY_HEATER, LOW);
delay(6000); // Heater stays off for 6 seconds
}
} else {
if (currentMillis - previousHeaterMillis >= 10000) { // 2s ON, 8s OFF
previousHeaterMillis = currentMillis;
digitalWrite(RELAY_HEATER, HIGH);
delay(2000); // Heater stays on for 2 seconds
digitalWrite(RELAY_HEATER, LOW);
delay(8000); // Heater stays off for 8 seconds
}
}
// Humidity control
float humidityRatio = (h / TARGET_HUMIDITY) * 65;
if (humidityRatio < 55) {
digitalWrite(RELAY_BOILER, HIGH);
} else if (humidityRatio < 58) {
if (currentMillis - previousBoilerMillis >= 18000) { // 10s ON, 8s OFF
previousBoilerMillis = currentMillis;
digitalWrite(RELAY_BOILER, HIGH);
delay(8000); // Boiler stays on for 10 seconds
digitalWrite(RELAY_BOILER, LOW);
delay(10000); // Boiler stays off for 8 seconds
}
} else if (humidityRatio < 62) {
if (currentMillis - previousBoilerMillis >= 10000) { // 5s ON, 5s OFF
previousBoilerMillis = currentMillis;
digitalWrite(RELAY_BOILER, HIGH);
delay(5000); // Boiler stays on for 5 seconds
digitalWrite(RELAY_BOILER, LOW);
delay(8000); // Boiler stays off for 5 seconds
}
} else if (humidityRatio < 64) {
if (currentMillis - previousBoilerMillis >= 9000) { // 3s ON, 6s OFF
previousBoilerMillis = currentMillis;
digitalWrite(RELAY_BOILER, HIGH);
delay(3000); // Boiler stays on for 3 seconds
digitalWrite(RELAY_BOILER, LOW);
delay(7000); // Boiler stays off for 6 seconds
}
} else {
if (currentMillis - previousBoilerMillis >= 10000) { // 2s ON, 8s OFF
previousBoilerMillis = currentMillis;
digitalWrite(RELAY_BOILER, HIGH);
delay(2000); // Boiler stays on for 2 seconds
digitalWrite(RELAY_BOILER, LOW);
delay(10000); // Boiler stays off for 8 seconds
}
}
// Cooling system control (30 minutes cycle for each cooler)
unsigned long coolerCycle = (currentMillis / (30 * 60 * 1000)) % 2; // Determine which cooler is active
if (coolerCycle == 0) {
digitalWrite(RELAY_COOLER1, HIGH);
digitalWrite(RELAY_COOLER2, LOW);
} else {
digitalWrite(RELAY_COOLER1, LOW);
digitalWrite(RELAY_COOLER2, HIGH);
}
delay(1000); // Delay before next loop iteration
}