#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define DHTPIN 2
#define RELAY_PIN 8
#define POT_PIN A0
#define SERVO_PIN 9
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;
float setPoint;
float currentTemp;
float hysteresis = 2.0;
bool relayStatus = false; // To track relay and servo state
void setup() {
lcd.begin(16, 2);
lcd.backlight();
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
myServo.attach(SERVO_PIN);
Serial.begin(9600);
}
void loop() {
// Read temperature from DHT22 sensor
currentTemp = dht.readTemperature();
// Read potentiometer value and map it to temperature range
setPoint = map(analogRead(POT_PIN), 0, 1023, 0, 50);
// Apply hysteresis logic
if (currentTemp > setPoint + (hysteresis / 2) && !relayStatus) {
digitalWrite(RELAY_PIN, HIGH); // Turn relay ON
myServo.write(0); // Move servo to 180°
relayStatus = true; // Update status to ON
}
else if (currentTemp < setPoint - (hysteresis / 2) && relayStatus) {
digitalWrite(RELAY_PIN, LOW); // Turn relay OFF
myServo.write(180); // Move servo to 0°
relayStatus = false; // Update status to OFF
}
// Display setPoint and currentTemp on LCD
lcd.setCursor(0, 0);
lcd.print("Set: ");
lcd.print(setPoint);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Cur: ");
lcd.print(currentTemp);
lcd.print(" C "); // Extra spaces to clear old text if any
// Output values to Serial Monitor for debugging
Serial.print("SetPoint: ");
Serial.print(setPoint);
Serial.print(" C, ");
Serial.print("Current: ");
Serial.print(currentTemp);
Serial.print(" C, ");
Serial.print("Relay Status: ");
Serial.println(relayStatus ? "ON" : "OFF");
delay(2000); // Delay to allow time for readings and display
}