Arduino UNO-Based Impact Detection and GPS Tracking System with GSM Communication
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This circuit integrates an Arduino UNO with an ADXXL335 accelerometer, a Neo 6M GPS Module, and a Sim800l GSM module. The Arduino UNO serves as the central processing unit, interfacing with the accelerometer to detect impacts, the GPS module to obtain location data, and the GSM module to communicate via SMS or voice call. The primary application of this circuit is to detect impacts and provide location data, potentially for an emergency response system.
Component List
Arduino UNO
- Description: A microcontroller board based on the ATmega328P.
- Purpose: Acts as the central controller for the circuit, reading sensor data, processing information, and controlling communication modules.
ADXXL335 Accelerometer
- Description: A small, thin, low power, complete 3-axis accelerometer with signal conditioned voltage outputs.
- Purpose: Measures acceleration to detect impacts or vibrations.
Neo 6M GPS Module
- Description: A standalone GPS receiver module.
- Purpose: Provides location data by communicating with the Arduino over serial communication.
Sim800l GSM Module
- Description: A complete Quad-band GSM/GPRS solution in an SMT module.
- Purpose: Enables the circuit to make calls and send SMS messages for alerts.
Wiring Details
Arduino UNO
- GND connected to:
- ADXXL335 GND
- Neo 6M GPS Module GND
- Sim800l GND
- Vin connected to Sim800l VCC
- A1 connected to ADXXL335 X-OUT
- A2 connected to ADXXL335 Y-OUT
- A3 connected to ADXXL335 Z-OUT
- D10 connected to Neo 6M GPS Module RX
- D9 connected to Neo 6M GPS Module TX
- D3 connected to Sim800l RXD
- D2 connected to Sim800l TXD
ADXXL335 Accelerometer
- VCC connected to Neo 6M GPS Module VCC
- X-OUT connected to Arduino UNO A1
- Y-OUT connected to Arduino UNO A2
- Z-OUT connected to Arduino UNO A3
Neo 6M GPS Module
- GND connected to Arduino UNO GND
- TX connected to Arduino UNO D10
- RX connected to Arduino UNO D9
- VCC connected to ADXXL335 VCC
Sim800l GSM Module
- GND connected to Arduino UNO GND
- VCC connected to Arduino UNO Vin
- RXD connected to Arduino UNO D3
- TXD connected to Arduino UNO D2
Documented Code
#include <AltSoftSerial.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <math.h>
#include <SoftwareSerial.h>
const String EMERGENCY_PHONE = "+91xxxxxxxxxx";
#define rxPin 2
#define txPin 3
SoftwareSerial sim800(rxPin, txPin);
AltSoftSerial neogps;
TinyGPSPlus gps;
String sms_status, sender_number, received_date, msg;
String latitude, longitude;
#define BUZZER 5
#define BUTTON 6
#define xPin A0
#define yPin A1
#define zPin A2
byte updateflag;
int xaxis = 0, yaxis = 0, zaxis = 0;
int deltx = 0, delty = 0, deltz = 0;
int vibration = 2;
int devibrate = 75;
int magnitude = 0;
int sensitivity = 20;
double angle;
boolean impact_detected = false;
unsigned long time1;
unsigned long impact_time;
unsigned long alert_delay = 30000;
void setup() {
Serial.begin(9600);
sim800.begin(9600);
neogps.begin(9600);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
sms_status = "";
sender_number = "";
received_date = "";
msg = "";
sim800.println("AT");
delay(1000);
sim800.println("ATE1");
delay(1000);
sim800.println("AT+CPIN?");
delay(1000);
sim800.println("AT+CMGF=1");
delay(1000);
sim800.println("AT+CNMI=1,1,0,0,0");
delay(1000);
time1 = micros();
xaxis = analogRead(xPin);
yaxis = analogRead(yPin);
zaxis = analogRead(zPin);
}
void loop() {
if (micros() - time1 > 4999) Impact();
if (updateflag > 0) {
updateflag = 0;
Serial.println("Impact detected!!");
Serial.print("Magnitude:");
Serial.println(magnitude);
getGps();
digitalWrite(BUZZER, HIGH);
impact_detected = true;
impact_time = millis();
}
if (impact_detected == true) {
if (millis() - impact_time >= alert_delay) {
digitalWrite(BUZZER, LOW);
makeCall();
delay(1000);
sendAlert();
impact_detected = false;
impact_time = 0;
}
}
if (digitalRead(BUTTON) == LOW) {
delay(200);
digitalWrite(BUZZER, LOW);
impact_detected = false;
impact_time = 0;
}
while (sim800.available()) {
parseData(sim800.readString());
}
while (Serial.available()) {
sim800.println(Serial.readString());
}
}
void Impact() {
time1 = micros();
int oldx = xaxis;
int oldy = yaxis;
int oldz = zaxis;
xaxis = analogRead(xPin);
yaxis = analogRead(yPin);
zaxis = analogRead(zPin);
vibration--;
Serial.print("Vibration = ");
Serial.println(vibration);
if (vibration < 0) vibration = 0;
if (vibration > 0) return;
deltx = xaxis - oldx;
delty = yaxis - oldy;
deltz = zaxis - oldz;
magnitude = sqrt(sq(deltx) + sq(delty) + sq(deltz));
if (magnitude >= sensitivity) {
updateflag = 1;
vibration = devibrate;
} else {
magnitude = 0;
}
}
void parseData(String buff) {
Serial.println(buff);
unsigned int len, index;
index = buff.indexOf("\r");
buff.remove(0, index + 2);
buff.trim();
if (buff != "OK") {
index = buff.indexOf(":");
String cmd = buff.substring(0, index);
cmd.trim();
buff.remove(0, index + 2);
if (cmd == "+CMTI") {
index = buff.indexOf(",");
String temp = buff.substring(index + 1, buff.length());
temp = "AT+CMGR=" + temp + "\r";
sim800.println(temp);
} else if (cmd == "+CMGR") {
if (buff.indexOf(EMERGENCY_PHONE) > 1) {
buff.toLowerCase();
if (buff.indexOf("get gps") > 1) {
getGps();
String sms_data;
sms_data = "GPS Location Data\r";
sms_data += "http://maps.google.com/maps?q=loc:";
sms_data += latitude + "," + longitude;
sendSms(sms_data);
}
}
}
}
}
void getGps() {
boolean newData = false;
for (unsigned long start = millis(); millis() - start < 2000;) {
while (neogps.available()) {
if (gps.encode(neogps.read())) {
newData = true;
break;
}
}
}
if (newData) {
latitude = String(gps.location.lat(), 6);
longitude = String(gps.location.lng(), 6);
newData = false;
} else {
Serial.println("No GPS data is available");
latitude = "";
longitude = "";
}
Serial.print("Latitude= "); Serial.println(latitude);
Serial.print("Lngitude= "); Serial.println(longitude);
}
void sendAlert() {
String sms_data;
sms_data = "Accident Alert!!\r";
sms_data += "http://maps.google.com/maps?q=loc:";
sms_data += latitude + "," + longitude;
sendSms(sms_data);
}
void makeCall() {
Serial.println("calling....");
sim800.println("ATD" + EMERGENCY_PHONE + ";");
delay(20000); //20 sec delay
sim800.println("ATH");
delay(1000); //1 sec delay
}
void sendSms(String text) {
sim800.print("AT+CMGF=1\r");
delay(1000);
sim800.print("AT+CMGS=\"" + EMERGENCY_PHONE + "\"\r");
delay(1000);
sim800.print