#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define LED_PIN 4
#define NEW_LED_PIN 2
#define DHT_PIN 5
#define buzzerPin 13
#define OLED_RESET 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display(OLED_RESET);
// Wi-Fi user-Name, password // here the password is null as it uses inbuilt wifi network
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker Details
String device_id = "YOGII";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_user = "yogii";
const char* mqtt_password = "yogii";
const char* mqtt_clientId = "yogii";
const char* topic_publish = "yogii";
const char* topic_subscribe = "yogii";
WiFiClient esp_client;
void callback(char* topic, byte* payload, unsigned int length);
PubSubClient mqtt_client(mqtt_server, mqtt_port, callback, esp_client);
unsigned long CurrentMillis, PreviousMillis, DataSendingTime = (unsigned long) 1000 * 10;
byte lightStatus;
byte newLightStatus;
float previousX = 0.0;
const int threshold = 10.0;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(NEW_LED_PIN, OUTPUT);
dht.begin();
mpu.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.setTextSize(1);
display.setTextColor(WHITE);
delay(5000);
Serial.println("\n\nWelcome to YOGII Team\n");
setup_wifi();
mqtt_connect();
}
void loop() {
// Earthquake Detection
sensors_event_t event;
mpu.getAccelerometerSensor()->getEvent(&event);
float currentX = event.acceleration.x;
if (abs(currentX - previousX) > threshold) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Earthquake detected!");
display.display();
tone(buzzerPin, 1000);
Serial.println("Earthquake detected!");
delay(5000);
noTone(buzzerPin);
delay(5000);
display.clearDisplay();
}
previousX = currentX;
// Temperature, Humidity data
float DHT_Temperature = dht.readTemperature();
float DHT_Humidity = dht.readHumidity();
if (isnan(DHT_Temperature) || isnan(DHT_Humidity)) {
Serial.println("\n\nFailed to read from DHT22 sensor!");
delay(1000);
} else {
Serial.println("\n\nDHT Temperature: " + String(DHT_Temperature) + " °C");
Serial.println("DHT Humidity: " + String(DHT_Humidity) + " %");
Serial.println("LED: " + String(lightStatus) + " " + String(lightStatus == 1 ? "ON" : "OFF"));
Serial.println("New LED: " + String(newLightStatus) + " " + String(newLightStatus == 1 ? "ON" : "OFF"));
// Display Temperature and Humidity on OLED
display.clearDisplay();
display.setCursor(0, 0);
display.println("Temperature: " + String(DHT_Temperature) + " C");
display.println("Humidity: " + String(DHT_Humidity) + " %");
display.display();
delay(1000);
// Devices connection
CurrentMillis = millis();
if (CurrentMillis - PreviousMillis > DataSendingTime) {
PreviousMillis = CurrentMillis;
// Temperature Data in websocket
String pkt = "{";
pkt += "\"device_id\": \"YOGII\", ";
pkt += "\"type\": \"Temperature\", ";
pkt += "\"value\": " + String(DHT_Temperature) + "";
pkt += "}";
mqtt_publish((char*) pkt.c_str());
//Humidity Data
String pkt2 = "{";
pkt2 += "\"device_id\": \"YOGII\", ";
pkt2 += "\"type\": \"Humidity\", ";
pkt2 += "\"value\": " + String(DHT_Humidity) + "";
pkt2 += "}";
mqtt_publish((char*) pkt2.c_str());
}
}
if (!mqtt_client.loop())
mqtt_connect();
}
void setup_wifi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println("\"" + String(ssid) + "\"");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void mqtt_connect() {
while (!mqtt_client.connected()) {
Serial.println("Attempting MQTT connection...");
if (mqtt_client.connect(mqtt_clientId)) {
Serial.println("MQTT Web Connected");
mqtt_publish((char*)("Hi from " + device_id).c_str());
mqtt_subscribe(topic_subscribe);
} else {
Serial.print("failed, rc=");
Serial.print(mqtt_client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void mqtt_publish(char * data) {
mqtt_connect();
if (mqtt_client.publish(topic_publish, data))
Serial.println("Publish \"" + String(data) + "\" ok");
else
Serial.println("Publish \"" + String(data) + "\" failed");
}
void mqtt_subscribe(const char * topic) {
if (mqtt_client.subscribe(topic))
Serial.println("Subscribe \"" + String(topic) + "\" ok");
else
Serial.println("Subscribe \"" + String(topic) + "\" failed");
}
void callback(char* topic, byte* payload, unsigned int length) {
String command;
Serial.print("\n\nMessage arrived [");
Serial.print(topic);
Serial.println("] ");
for (int i = 0; i < length; i++)
command += (char)payload[i];
if (command.length() > 0)
Serial.println("Command receive is : " + command);
DynamicJsonDocument doc(1024);
deserializeJson(doc, command);
JsonObject obj = doc.as<JsonObject>();
String id = obj[String("device_id")];
String type = obj[String("type")];
String value = obj[String("value")];
Serial.println("\nCommand device_id is : " + id);
Serial.println("Command type is : " + type);
Serial.println("Command value is : " + value);
if (id == device_id && type == "Light") {
if (value == "1") {
lightStatus = 1;
digitalWrite(LED_PIN, HIGH);
Serial.println("\nLED ON by Application");
mqtt_publish((char*) command.c_str());
} else {
lightStatus = 0;
digitalWrite(LED_PIN, LOW);
Serial.println("\nLED OFF by Application");
mqtt_publish((char*) command.c_str());
}
}
if (id == device_id && type == "Light2") {
if (value == "1") {
newLightStatus = 1;
digitalWrite(NEW_LED_PIN, HIGH);
Serial.println("\nNew LED ON by Application");
mqtt_publish((char*) command.c_str());
} else {
newLightStatus = 0;
digitalWrite(NEW_LED_PIN, LOW);
Serial.println("\nNew LED OFF by Application");
mqtt_publish((char*) command.c_str());
}
}
}