#include <altsoftserial.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <math.h>
#include <SoftwareSerial.h>
const string EMERGENCY_PHONE ="+919342889536";
#define rxPin 2
#define txPin 3
SoftwareSerial sim800(rxPin, txPin);
AltSoftSerial neogps;
TinyGPSPlus gps;
//gps(9,8)
String sms_status, sender_number, received_data, msg;
String latitude, longitude;
#define BUZZER 12
#define BUTTON 11
#define xPin A1
#define yPin A2
#define zPin A3
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(BUZZER, INPUT_PULLUP);
sms_status="";
sender_number="";
received_data="";
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,");
delay(1000);
time1=micros();
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.index0f("\r");
buff.remove(0,index+2);
buff.trim();
if(buff!="OK"){
index=buff.index0f(":");
String cmd=buff.substring(0,index);
cmd.trim();
buff.remove(0,index+2);
if(cmd=="+CMTI"){
index=buff.index0f(",");
String temp=buff.substring(index+1,buff.length());
temp="AT+CMGR="+ temp+"\r";
sim800.println(temp);
}
else if (cmd=="+CMGR"){
if (buff.index0f(EMERGENCY_PHONE)>1){
buff.toLowerCase();
if(buff.index0f("get gps")>1){
getGps();
String sms_data;
sms_data="GPS Location Data\r";
sms_data+="http://maps.googlr.com/maps?q=loc:";
sms_data+= latitude+","+longitude;
sendSms(sms_data);
}
}
}
}
else{
}
}
void getGps()
[
boolean newData = false;
for (unsigned long start = millis(); millis() start <2000;){
while (neogps.available()){
newData = true;
break ;
}
}
}
if(newData)
{
latitude = string(gps.location.lat(),6);
longitiude = 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("longitude ="); 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(2000);
sim800.println("ATH");
delay(1000);
}
void sendSms(String text)
{
sim800.Print("AT+CMGF+1|r");
delay(1000);
sim800.println("AT+CMGS=\"" + EMERGENCY_PHONE + "\"\r");
delay(1000);
sim800.print(text);
delay(100);
sim800.write(0x1a);
delay(1000);
Serial.println("SMS Sent Successfully.");
}
boolean SendAT(String at_command,string expected_answer,unsigned int timeout) {
uint8_t x=0;
boolean answer = 0;
String response;
unsigned long previous;
while(sim800.available() > 0) sim800.read();
simi800.println(at_command);
x=0;
previous = millis ();
do{
if (sim800.available()!=0) {
response += sim800.read();
x++;
if (response.index0f(expected_answer)>0){
answer = 1;
break;
}
}
}
while ((answer == 0)&& ((millis() - previous)<timeout)) {
uint8_t x=0;
boolean answer = 0;
String response;
unsigned long previous;
while(sim800.available() >0) sim800.read();
sim800.println(at_command);
x=0;
previous = millis();
do {
if (sim800 available ()!=0) {
response +=sim800.read();
x++;
if (response.index0f(expected_answer) > 0) {
answer = 1;
break;
}
}
}
while ((answer ==0) && ((millis() - previous) < timout));
Serial.println(response);
return answer;
}
}
}
]