This document provides a detailed overview of a circuit designed for accident detection and location tracking. The circuit integrates an MPU6050 accelerometer, a Neo 6M GPS module, an ESP32 microcontroller, and a SIM800L GSM module. The ESP32 microcontroller serves as the central unit, interfacing with the other components to detect accidents, determine the location, and send notifications via SMS.
// Pseudo code for accident detection
if (abs(acceleration.x) > threshold || abs(acceleration.y) > threshold || abs(acceleration.z) > threshold) {
accident_detected = true;
}
double calculateDistance(lat1, lon1, lat2, lon2) {
// Implement Haversine formula to calculate distance
double dLat = (lat2 - lat1) * DEG_TO_RAD;
double dLon = (lon2 - lon1) * DEG_TO_RAD;
// Compute the distance using earth radius and return value
return distance;
}
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <TinyGPS++.h>
#include <HardwareSerial.h>
#include <HTTPClient.h>
// GPS Module
TinyGPSPlus gps;
HardwareSerial gpsSerial(1); // Use UART1 for GPS
// MPU6050 Accelerometer
Adafruit_MPU6050 mpu;
// GSM Module
HardwareSerial gsmSerial(2); // Use UART2 for GSM
const char* apn = "your_apn"; // Replace with your APN
const char* user = "your_user"; // Replace with your APN username
const char* pass = "your_pass"; // Replace with your APN password
const char* phone_number = "916309479746"; // Replace with the recipient's phone number
void setup() {
Serial.begin(115200);
// Initialize GPS
gpsSerial.begin(9600, SERIAL_8N1, 16, 17); // RX, TX pins for GPS
Serial.println("GPS module initialized");
// Initialize MPU6050
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
Serial.println("MPU6050 initialized");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
// Initialize GSM
gsmSerial.begin(9600, SERIAL_8N1, 26, 27); // RX, TX pins for GSM
Serial.println("GSM module initialized");
// Connect to GSM network
connectGSM();
}
void loop() {
// Read GPS data
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
Serial.print("Latitude: ");
Serial.println(gps.location.lat(), 6);
Serial.print("Longitude: ");
Serial.println(gps.location.lng(), 6);
}
// Read accelerometer data
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Check for fall detection (example threshold)
if (a.acceleration.z < -9.0) {
Serial.println("Fall detected!");
sendSMS("Fall detected! Location: " + String(gps.location.lat(), 6) + ", " + String(gps.location.lng(), 6));
}
delay(1000);
}
void connectGSM() {
gsmSerial.println("AT");
delay(1000);
gsmSerial.println("AT+CPIN?");
delay(1000);
gsmSerial.println("AT+CREG?");
delay(1000);
gsmSerial.println("AT+CGATT?");
delay(1000);
gsmSerial.println("AT+CSTT=\"" + String(apn) + "\",\"" + String(user) + "\",\"" + String(pass) + "\"");
delay(1000);
gsmSerial.println("AT+CIICR");
delay(1000);
gsmSerial.println("AT+CIFSR");
delay(1000);
}
void sendSMS(String message) {
gsmSerial.println("AT+CMGF=1"); // Set SMS to text mode
delay(1000);
gsmSerial.println("AT+CMGS=\"" + String(phone_number) + "\"");
delay(1000);
gsmSerial.print(message);
delay(1000);
gsmSerial.write(26); // ASCII code for CTRL+Z to send the SMS
delay(1000);
}
gsm.sendSMS("+1234567890", "Accident Detected! Location: https://maps.google.com/?q=" + String(latitude) + "," + String(longitude));