#include <DHT.h>
// ====== Sensor Setup ======
#define DHTPIN 4 // GPIO pin connected to DHT sensor
#define DHTTYPE DHT22 // Change to DHT11 if using that model
DHT dht(DHTPIN, DHTTYPE);
// ====== State Machine ======
enum State {
Idle,
Heating,
Stabilizing,
TargetReached,
Overheat
};
State currentState = Idle;
// ====== Configurable Parameters ======
float targetTemp = 30.0; // Target temperature in °C
float overheatTemp = 40.0; // Overheat threshold in °C
float tolerance = 1.0; // Allowed variation
void setup() {
Serial.begin(115200);
dht.begin();
Serial.println("Temperature State Tracker Started");
}
void loop() {
float temp = dht.readTemperature(); // Read temperature in °C
if (isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
delay(2000);
return;
}
// ===== State Transitions =====
switch (currentState) {
case Idle:
if (temp < targetTemp - tolerance)
currentState = Heating;
break;
case Heating:
if (temp >= targetTemp - tolerance)
currentState = Stabilizing;
else if (temp > overheatTemp)
currentState = Overheat;
break;
case Stabilizing:
if (fabs(temp - targetTemp) <= tolerance)
currentState = TargetReached;
else if (temp > overheatTemp)
currentState = Overheat;
else if (temp < targetTemp - tolerance)
currentState = Heating;
break;
case TargetReached:
if (temp > overheatTemp)
currentState = Overheat;
else if (temp < targetTemp - tolerance)
currentState = Heating;
break;
case Overheat:
if (temp <= targetTemp)
currentState = Stabilizing;
break;
}
// ===== Output =====
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print(" °C -> State: ");
Serial.println(getStateName(currentState));
delay(2000); // Wait 2 seconds before next reading
}
// ===== Helper Function =====
String getStateName(State s) {
switch (s) {
case Idle: return "Idle";
case Heating: return "Heating";
case Stabilizing: return "Stabilizing";
case TargetReached: return "Target Reached";
case Overheat: return "Overheat";
}
return "Unknown";
}