This circuit integrates a microcontroller (ESP32), a GPS module (Neo 6M), an accelerometer/gyroscope (InvenSense MPU6050), and a GSM module (SIM800L) to create a system capable of detecting accidents and providing location data. The ESP32 serves as the central processing unit, interfacing with the GPS module for location tracking, the MPU6050 for motion detection, and the SIM800L for GSM communication. The system is designed to detect significant accelerations that may indicate an accident and then communicate the event and location data via SMS.
#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 = "your_phone_number"; // 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);
}
// 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;
}
gsm.sendSMS("+1234567890", "Accident Detected! Location: https://maps.google.com/?q=" + String(latitude) + "," + String(longitude));
This documentation provides an overview of the circuit's components, their wiring, and the code that governs their behavior. Each section is designed to give a clear understanding of the circuit's functionality and how the components interact with each other.