#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoJson.h>
// WiFi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker
const char* mqttServer = "test.mosquitto.org";
const int mqttPort = 1883;
const char* mqttTopic = "accident detected";
// PIR Sensor
#define PIR_PIN 35
// OLED Display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMotionTime = 0;
const unsigned long alertCooldown = 10000; // 10 seconds cooldown between alerts
// MQTT Callback to handle received alerts
void callback(char* topic, byte* payload, unsigned int length) {
String msg = "";
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
Serial.println("Received MQTT: " + msg);
// Parse JSON
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, msg);
if (error) {
Serial.println("Failed to parse MQTT JSON");
return;
}
if (doc["accident"] == true) {
Serial.println("🚨 MQTT Accident Detected!");
showAccidentAlert();
}
}
void showAccidentAlert() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Accident Alert!");
display.setTextSize(2);
display.setCursor(0, 20);
display.println("Detected");
display.display();
delay(10000);
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("Monitoring...");
display.display();
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
// Initialize OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED init failed");
while(true);
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.println("Booting...");
display.display();
// Connect WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
// Connect MQTT
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("userid")) { //user id must be unique in case of many users under one topic to avoid conflict/crosstalk information
Serial.println("Connected to MQTT");
client.subscribe(mqttTopic); //SUBSCRIBE TOPIC
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("Monitoring...");
display.display();
}
void loop() {
client.loop();
int motion = digitalRead(PIR_PIN);
unsigned long currentTime = millis();
if (motion == HIGH && currentTime - lastMotionTime > alertCooldown) {
Serial.println("🚨 PIR Motion Detected!");
// Publish MQTT accident message
StaticJsonDocument<100> doc;
doc["accident"] = true;
char buffer[100];
serializeJson(doc, buffer);
client.publish(mqttTopic, buffer);
// Show on OLED
showAccidentAlert();
lastMotionTime = currentTime;
}
delay(200); // Small delay to reduce CPU usage
}