// Embedded Heater Control System - ESP32
#include <DHT.h>
#define DHTPIN 13 // DHT Sensor Pin
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define HEATER_PIN 2 // Heater Control (simulated LED)
#define LED_PIN 4 // State Indicator LED
#define BUZZER_PIN 5 // Overheat Buzzer
DHT dht(DHTPIN, DHTTYPE);
// Temperature thresholds
const float HEAT_ON_TEMP = 30.0;
const float STABILIZE_TEMP = 35.0;
const float OVERHEAT_TEMP = 40.0;
// State Enum
enum HeaterState {
IDLE,
HEATING,
STABILIZING,
TARGET_REACHED,
OVERHEAT
};
HeaterState currentState = IDLE;
bool buzzerState = false;
unsigned long previousMillis = 0;
const long buzzerInterval = 500; // milliseconds
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(HEATER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(HEATER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
float temp = dht.readTemperature();
if (isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
delay(1000);
return;
}
updateState(temp);
logStatus(temp);
handleBuzzer();
delay(2000); // Read every 2 seconds
}
void updateState(float temp) {
if (temp > OVERHEAT_TEMP) {
currentState = OVERHEAT;
digitalWrite(HEATER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
}
else if (temp >= STABILIZE_TEMP) {
currentState = TARGET_REACHED;
digitalWrite(HEATER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
else if (temp >= HEAT_ON_TEMP && temp < STABILIZE_TEMP) {
currentState = STABILIZING;
digitalWrite(HEATER_PIN, LOW);
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, LOW);
}
else if (temp < HEAT_ON_TEMP) {
currentState = HEATING;
digitalWrite(HEATER_PIN, HIGH);
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, LOW);
}
else {
currentState = IDLE;
digitalWrite(HEATER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
}
void handleBuzzer() {
if (currentState == OVERHEAT) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= buzzerInterval) {
previousMillis = currentMillis;
buzzerState = !buzzerState;
digitalWrite(BUZZER_PIN, buzzerState);
}
} else {
digitalWrite(BUZZER_PIN, LOW);
buzzerState = false;
}
}
void logStatus(float temp) {
String stateStr;
switch (currentState) {
case IDLE: stateStr = "Idle"; break;
case HEATING: stateStr = "Heating"; break;
case STABILIZING: stateStr = "Stabilizing"; break;
case TARGET_REACHED: stateStr = "Target Reached"; break;
case OVERHEAT: stateStr = "Overheat"; break;
}
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print(" °C | State: ");
Serial.println(stateStr);
}