#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// WiFi & MQTT
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// DHT22 config
#define DHTPIN 26
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// NTC Thermistor config
const int ntcPin = 34; // Analog input
// Buzzer pin
const int buzzerPin = 15;
// Threshold
float threshold = 30.0;
// MQTT topics
const char* alertTopic = "alerts/trigger";
const char* fanTopic = "commands/fan/set_speed";
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(100);
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32ClientAlert")) {
Serial.println("MQTT connected");
} else {
delay(1000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
float readNTCTemperature() {
int adc = analogRead(ntcPin);
float voltage = adc / 4095.0 * 3.3;
float resistance = (3.3 * 10000 / voltage) - 10000;
float tempK = 1.0 / (1.0 / 298.15 + log(resistance / 10000) / 3950.0);
return tempK - 273.15;
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
float tempDHT = dht.readTemperature();
float tempNTC = readNTCTemperature();
Serial.print("DHT22 Temp: ");
Serial.println(tempDHT);
Serial.print("NTC Temp: ");
Serial.println(tempNTC);
// Choose one sensor or compare both
if (tempDHT > threshold || tempNTC > threshold) {
digitalWrite(buzzerPin, HIGH);
client.publish(alertTopic, "ALERT: Temperature exceeded!");
client.publish(fanTopic, "80"); // Send command to turn on fan
} else {
digitalWrite(buzzerPin, LOW);
}
delay(5000); // 5 seconds interval
}