#include <DHT.h>
#define DHTPIN 2 // Pin where DHT22 is connected
#define DHTTYPE DHT22 // DHT22 sensor type
#define HEATER_PIN 3 // Pin for heater (LED simulation)
#define BUZZER_PIN 4 // Pin for buzzer
DHT dht(DHTPIN, DHTTYPE);
// Define state machine states
enum State {
IDLE,
HEATING,
STABILIZING,
TARGET_REACHED,
OVERHEAT
};
State currentState = IDLE; // Initial state
float targetTemp = 23.0; // Target temperature in Celsius
float hysteresis = 0.5; // Hysteresis to prevent rapid switching
float overheatTemp = 40.0; // Overheat threshold temperature
void setup() {
Serial.begin(9600); // Start serial communication
dht.begin(); // Initialize DHT22 sensor
pinMode(HEATER_PIN, OUTPUT); // Set heater pin (LED) as output
pinMode(BUZZER_PIN, OUTPUT); // Set buzzer pin as output
}
void loop() {
float temp = dht.readTemperature(); // Read temperature from DHT22
if (isnan(temp)) {
Serial.println("Failed to read temperature");
return;
}
updateState(temp); // Update state based on temperature
logStatus(temp); // Log status and temperature to Serial
delay(4000); // Delay between temperature checks
}
void updateState(float temp) {
switch (currentState) {
case IDLE:
if (temp < targetTemp - hysteresis) {
currentState = HEATING;
}
break;
case HEATING:
if (temp >= targetTemp - hysteresis) {
currentState = STABILIZING;
}
break;
case STABILIZING:
if (temp >= targetTemp) {
currentState = TARGET_REACHED;
}
break;
case TARGET_REACHED:
if (temp > overheatTemp) {
currentState = OVERHEAT;
} else if (temp < targetTemp - hysteresis) {
currentState = HEATING;
}
break;
case OVERHEAT:
if (temp < targetTemp) {
currentState = HEATING;
}
break;
}
// Control heater (LED) and buzzer based on state
if (currentState == HEATING || currentState == STABILIZING) {
digitalWrite(HEATER_PIN, HIGH); // Turn heater ON (LED simulation)
digitalWrite(BUZZER_PIN, LOW); // Turn buzzer OFF
} else {
digitalWrite(HEATER_PIN, LOW); // Turn heater OFF
if (currentState == OVERHEAT) {
digitalWrite(BUZZER_PIN, HIGH); // Turn buzzer ON for overheat
} else {
digitalWrite(BUZZER_PIN, LOW); // Turn buzzer OFF
}
}
}
void logStatus(float temp) {
Serial.print("[Temp: ");
Serial.print(temp);
Serial.print("°C] State: ");
switch (currentState) {
case IDLE: Serial.print("IDLE"); break;
case HEATING: Serial.print("HEATING"); break;
case STABILIZING: Serial.print("STABILIZING"); break;
case TARGET_REACHED: Serial.print("TARGET_REACHED"); break;
case OVERHEAT: Serial.print("OVERHEAT"); break;
}
Serial.print(" | Heater: ");
Serial.println(digitalRead(HEATER_PIN) ? "ON" : "OFF");
}