#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP32Servo.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker
const char* mqtt_broker = "test.mosquitto.org"; // a Mosquitto Public Test Server
const int mqtt_port = 1883;
const char* mqtt_username = "";
const char* mqtt_password = "";
// MQTT topics
const char* tempTopic = "zied/temperature"; // to send temperature values to broker
const char* humTopic = "zied/humidity"; // to send humidity values to broker
const char* servoTopic = "zied/onoff"; // to control the servo
// Define pin constants
#define DHTpin 25 // Pin for DHT22 sensor
#define BUTTON 18 // Pin for push button
#define LED 23 // Pin for LED
#define BUZZER 4 // Pin for buzzer
#define ONE_WIRE_BUS 19 // Pin for OneWire bus
#define TRIG_PIN 5 // Pin for ultrasonic sensor trigger
#define ECHO_PIN 18 // Pin for ultrasonic sensor echo
#define SERVO_PIN 21 // Pin for servo
// Define thresholds for triggering the alarm
#define TEMPERATURE_THRESHOLD 45.0 // Temperature threshold in Celsius
#define HUMIDITY_THRESHOLD 50.0 // Humidity threshold in percentage
#define SOUND_SPEED 0.034 // Speed of sound in cm/ms
// Create instances
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Servo servoMotor;
// WiFi and MQTT clients
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
// Function to check if alarm conditions are met
bool isAlarmTriggered(float temperature, float humidity) {
// Check if temperature exceeds the threshold
if (temperature > TEMPERATURE_THRESHOLD || humidity > HUMIDITY_THRESHOLD) {
return true;
}
return false;
}
// Function to connect to WiFi
void connectWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
Serial.println("Connected to WiFi");
}
// Function to connect to MQTT broker
void connectMQTT() {
Serial.println("Connecting to MQTT Broker...");
mqttClient.setServer(mqtt_broker, mqtt_port);
while (!mqttClient.connected()) {
if (mqttClient.connect("ESP32Client", mqtt_username, mqtt_password)) {
Serial.println("Connected to MQTT Broker");
} else {
Serial.print("MQTT connection failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
// MQTT callback function
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String message;
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
message += (char)payload[i];
}
Serial.println();
// Process the message based on the topic
if (String(topic) == servoTopic) {
if (message == "on") {
servoMotor.write(90); // Turn on servo
} else if (message == "off") {
servoMotor.write(0); // Turn off servo
}
}
}
void setup() {
Serial.begin(9600);
connectWiFi();
connectMQTT();
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize DHT sensor
dhtSensor.setup(DHTpin, DHTesp::DHT22);
// Initialize OneWire bus and DallasTemperature sensors
sensors.begin();
// Set pin modes
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Attach servo to pin
servoMotor.attach(SERVO_PIN);
// Subscribe to MQTT topics
mqttClient.subscribe(servoTopic);
mqttClient.setCallback(callback);
}
void loop() {
// Read temperature and humidity
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temperature = data.temperature;
float humidity = data.humidity;
// Display temperature and humidity on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print("%");
// Check if alarm conditions are met
if (isAlarmTriggered(temperature, humidity)) {
// Turn on LED
digitalWrite(LED, HIGH);
// Play alarm sound effect
for (int i = 0; i < 5; i++) {
tone(BUZZER, 2000); // Adjust frequency as needed
delay(100); // Adjust duration as needed
noTone(BUZZER);
delay(100);
}
// Turn off LED
digitalWrite(LED, LOW);
}
// Publish temperature and humidity to MQTT broker
if (mqttClient.connected()) {
mqttClient.publish(tempTopic, String(temperature).c_str());
mqttClient.publish(humTopic, String(humidity).c_str());
}
// Maintain MQTT connection
if (!mqttClient.connected()) {
connectMQTT();
}
// Check MQTT messages
mqttClient.loop();
// Delay before next iteration
delay(2000);
}