#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define TEMP_HUMID_PIN 14
#define DHT_MODEL DHT22
DHT envSensor(TEMP_HUMID_PIN, DHT_MODEL);
#define SONIC_TRIG_PIN 5
#define SONIC_ECHO_PIN 18
#define LED_OVERHEAT 15
#define LED_DRYAIR 2
#define LED_PRESSURE_ALERT 4
#define LED_DIM_LIGHT 16
#define BUZZER_ALARM 17
int pressureSensorPin = 34;
int pressureRawValue;
float echoTime_us, objectDistance_cm;
#define LIGHT_SENSOR_PIN 33
#define GAS_SENSOR_PIN 32
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
WiFiClient espClient;
PubSubClient client(espClient);
void wifi_config() {
delay(10);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
randomSeed(micros());
}
void callback(char* topic, byte* payload, unsigned int length) {
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to Mosquitto MQTT...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connection Established");
client.publish("/SmartHome/Publish", "hi");
client.subscribe("/SmartHome/Subscribe");
}}
}
void setup() {
wifi_config();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Serial.begin(115200);
Serial.println(F("Booting up Smart Home System..."));
envSensor.begin();
pinMode(SONIC_TRIG_PIN, OUTPUT);
pinMode(SONIC_ECHO_PIN, INPUT);
pinMode(LED_OVERHEAT, OUTPUT);
pinMode(LED_DRYAIR, OUTPUT);
pinMode(LED_PRESSURE_ALERT, OUTPUT);
pinMode(LED_DIM_LIGHT, OUTPUT);
pinMode(BUZZER_ALARM, OUTPUT);
pinMode(GAS_SENSOR_PIN, INPUT);
}
void loop() {
if (!client.connected()) {
reconnect();
}
float currentTemp = envSensor.readTemperature();
String temprature = String(currentTemp, 2);
client.publish("/SmartHome/temprature", temprature.c_str());
float currentHumidity = envSensor.readHumidity();
String Humidity = String(currentHumidity, 2);
client.publish("/SmartHome/Humidity", Humidity.c_str());
pressureRawValue = analogRead(pressureSensorPin);
int pressureConverted = map(pressureRawValue, 0, 4095, 0, 100);
String Pressure = String(pressureConverted);
client.publish("/SmartHome/Pressure", Pressure.c_str());
digitalWrite(SONIC_TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(SONIC_TRIG_PIN, LOW);
echoTime_us = pulseIn(SONIC_ECHO_PIN, HIGH);
objectDistance_cm = 0.017 * echoTime_us;
String Distance = String(objectDistance_cm, 2);
client.publish("/SmartHome/Distance", Distance.c_str());
int lightIntensity = analogRead(LIGHT_SENSOR_PIN);
int LightIntensity = map(lightIntensity, 0, 4095, 0, 100);
String IntensityOfLight = String(LightIntensity);
client.publish("/SmartHome/IntensityOfLight", IntensityOfLight.c_str());
int gasReading = analogRead(GAS_SENSOR_PIN);
int gasPPM = map(gasReading, 0, 4095, 0, 1000);
String Gas = String(gasPPM);
client.publish("/SmartHome/Gas", Gas.c_str());
Serial.println(F("================================================="));
Serial.println(F(" SMART HOME STATUS REPORT "));
Serial.println(F("================================================="));
if (!isnan(currentTemp) && !isnan(currentHumidity)) {
Serial.print(F("Temperature: "));
Serial.print(currentTemp);
Serial.println(F(" °C"));
Serial.print(F("Humidity: "));
Serial.print(currentHumidity);
Serial.println(F(" %"));
} else {
Serial.println(F("Error: Not able to retrieve the data of Temp/Humidity."));
}
Serial.print(F("Pressure: "));
Serial.print(pressureConverted);
Serial.println(F(" psi"));
Serial.print(F("Distance to object: "));
Serial.print(objectDistance_cm);
Serial.println(F(" cm"));
Serial.print(F("Intensity of Light: "));
Serial.print(LightIntensity);
Serial.println(F(" lux"));
Serial.print(F("Gas concentration: "));
Serial.print(gasPPM);
Serial.println(" PPM");
Serial.println(F("-------------------------------------------------"));
if (currentTemp > 30) {
digitalWrite(LED_OVERHEAT, HIGH);
Serial.println(F("Alert: Activating cooling systems, Since high temprature detected."));
} else {
digitalWrite(LED_OVERHEAT, LOW);
}
if (currentHumidity < 40) {
digitalWrite(LED_DRYAIR, HIGH);
Serial.println(F("Alert: Activating humidifier, Since low humidity is detected"));
} else {
digitalWrite(LED_DRYAIR, LOW);
}
if (pressureConverted > 70) {
digitalWrite(LED_PRESSURE_ALERT, HIGH);
Serial.println(F("Alert: Pressure has exceeded the safe limits!"));
} else {
digitalWrite(LED_PRESSURE_ALERT, LOW);
}
if (objectDistance_cm < 30) {
digitalWrite(BUZZER_ALARM, HIGH);
Serial.println(F("Alert: Object has been detected near garage. So opening the door."));
} else {
digitalWrite(BUZZER_ALARM, LOW);
}
if (lightIntensity < 500) {
digitalWrite(LED_DIM_LIGHT, HIGH);
Serial.println(F("Alert: Low light has been detected. So turning on the lights."));
} else {
digitalWrite(LED_DIM_LIGHT, LOW);
Serial.println(F("Lights are off since lightning is adequate."));
}
if (gasReading > 300) {
digitalWrite(BUZZER_ALARM, HIGH);
Serial.println(F("Alert: Dangerous gas levels has been detected. So turning buzzer on."));
} else {
digitalWrite(BUZZER_ALARM, LOW);
}
Serial.println(F("================================================="));
delay(3000);
}