Mohammed Adnan Khan
Published

Fall/Accident Detection and Alert System

A device for the elderly or physically challenged that helps them in their time of need, if they fall or met with accident.

IntermediateFull instructions providedOver 1 day354

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
SIM800L GSM Module
×1
NEO6M GPS Module
×1
TTP223 Touch Switch Module
×1
Buzzer
Buzzer
×1
SparkFun Power Cell - LiPo Charger/Booster
SparkFun Power Cell - LiPo Charger/Booster
×1
Li-Ion Battery 1000mAh
Li-Ion Battery 1000mAh
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

PCB, For DMB-4775
PCB, For DMB-4775

Story

Read more

Schematics

Schematic

Code

Fall/Accident detection and alert system

C/C++
#include <AltSoftSerial.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <math.h>
#include<Wire.h>


#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 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, 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 > 1999) 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--; 
  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); 
  sim800.println("ATH");
  delay(1000); 
}

 void sendSms(String text)
{
  sim800.print("AT+CMGF=1\r");
  delay(1000);
  sim800.print("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();
    sim800.println(at_command);
    x = 0;
    previous = millis();
    do{
        if(sim800.available() != 0){
            response += sim800.read();
            x++;
            if(response.indexOf(expected_answer) > 0){
                answer = 1;
                break;
            }
        }
    }while((answer == 0) && ((millis() - previous) < timeout));

  Serial.println(response);
  return answer;
}

Credits

Mohammed Adnan Khan

Mohammed Adnan Khan

2 projects • 8 followers
Embedded systems engineer

Comments