Introduction: Emergency Fall Notifier With Panic Button

Every year, one-third to one-half of the population aged 65 and over experience falls. Falls are the leading cause of injury in older adults and the leading cause of accidental death in those 75 years of age and older. For a human, experiencing a fall unobserved can be doubly dangerous. The obvious possibility of initial injury may be further aggravated by the possible consequences if treatment is not obtained within a short time. Statistics show that the majority of serious consequences are not the direct result of falling, but rather are due to a delay in assistance and treatment. Post-fall consequences can be greatly reduced if relief personnel can be alerted in time.

Many elderly live alone either in an apartment or a smaller house after their children have grown up and left home. It is not uncommon after a fall that an elderly person is unable to get up by themselves or summon help. There is therefore a need for an automatic fall detection system in which a patient can summon help even if they are unconscious or unable to get up after the fall.

Many algorithms have been developed but till now it is difficult to distinguish real falls from certain fall-like activities such as sitting down quickly and jumping, resulting in many false positives. Most of the algorithms use accelerometer to detect fall with body orientation, but it is not very useful when the ending position is not horizontal, e.g. falls happen on stairs.

I made a novel fall detection system using both accelerometers and gyroscopes and for that my algorithm reduces both false positives and false negatives, while improving fall detection accuracy. My system instantly notifies to a concern person with SMS and Email when fall occurred. It has also a panic button and an emergency notification can be sent by pressing it.

Step 1: List of Materials

1. MPU6050 Accelerometer & Gyroscope Breakout (Sparkfun)

2. ESP8266 WiFi Module (Sparkfun)

3. Lithium Battery Charging Module (Amazon)

4. Polymer Lithium Ion Battery (Sparkfun)

5. ATmega328 with Arduino Optiboot (Uno) (Sparkfun)

6. 16MHz Crystal

7. 15pf Disk Capacitor (2pcs)

7. 10K Resistor

8. Momentary Button

9. On-off switch

Tools:

1. Soldering Iron (Gearbest)

2. Hot Glue Gun (Gearbest)

3. Diagonal Cutting Pliers (Gearbest)

Step 2: Fall Detection Algorithm

With the prospect of commercialization that often surrounds health related issues, there is substantial research in the academic arena surrounding fall detection for the elderly. The majority of this research is focused on designing new more successful algorithms for distinguishing falls from non-falls. Researchers in this area typically use one or two sensors with which to extract data, develop, and test their algorithms. The first approach uses accelerometers to detect acceleration along a certain axis. When monitoring for a large acceleration from a tri-axis accelerometer, most often they look at the magnitude vector rather than at each of the axes separately. Another approach use both accelerometer & gyroscope to measure acceleration and orientation change and is more accurate compared with first one.

My algorithm is based off the concept that during a fall, a person experiences a momentary freefall or reduction in acceleration, followed by a large spike in acceleration, then a change in orientation. The flowchart for Algorithm is given below. We see the algorithm checks to see if the acceleration magnitude (AM) breaks a set lower threshold. If this lower threshold is broken, the algorithm then checks to see if AM breaks a set upper threshold within 0.5s. If this upper threshold is broken, the algorithm then checks to see if the person’s orientation has changed in a set range within 0.5s, which would indicate a person has fallen or toppled over. If the person’s orientation has changed, the algorithm then examines to see if that orientation remains after 10s, which would indicate the person is immobilized in their fallen position on the ground. If this holds true, the algorithm recognizes this as a fall. A failure of any of the intermediate decision conditions would reset the triggers and send you back to the start. The strength of this algorithm is that it requires an activity to break two AM thresholds and have an orientation change. Ideally this additional lower threshold would reduce the number of false positives. The weakness of this algorithm is that it requires the fall to involve an orientation change.

Step 3: Implementing the Algorithm With Arduino (ATmega328 Microcontroller)

According to the algorithm following program was developed. For collecting data 6DOF MPU6050 accelerometer & gyroscope sensor is used. This sensor provide data through I2C serial bus. Arduino wire library was used to communicate with with the sensor using ATmega328 microcontroller. I used standalone ATmega chip instead of arduino board to keep the form factor small because form factor is a vital issue for wearable devices. You will get several tutorial on the Internet how to program standalone ATmega chip using Arduino board or if you buy bootloaded ATmega328 microcontroller then you can program it just replacing the chip from the Arduino Uno board. After replacement put your new chip into the Arduino board and program it. After programming detach it from the board and use it in your circuit.

Step 4: Programming ATmega328P Microcontroller With Arduino Uno

The complete Arduino program is attached herewith. You may need to calibrate the MPU sensor for getting accurate result. you may also required to adjust the threshold values used in the program. Make sure that Arduino wire library is installed.

// MPU-6050 Short Example Sketch
// Public Domain
#include
const int MPU_addr=0x68; // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
float ax=0, ay=0, az=0, gx=0, gy=0, gz=0;

//int data[STORE_SIZE][5]; //array for saving past data
//byte currentIndex=0; //stores current data array index (0-255)
boolean fall = false; //stores if a fall has occurred
boolean trigger1=false; //stores if first trigger (lower threshold) has occurred
boolean trigger2=false; //stores if second trigger (upper threshold) has occurred
boolean trigger3=false; //stores if third trigger (orientation change) has occurred

byte trigger1count=0; //stores the counts past since trigger 1 was set true
byte trigger2count=0; //stores the counts past since trigger 2 was set true
byte trigger3count=0; //stores the counts past since trigger 3 was set true
int angleChange=0;


void setup(){
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);

pinMode(11, OUTPUT);
digitalWrite(11, HIGH);
}
void loop(){

mpu_read();
//2050, 77, 1947 are values for calibration of accelerometer
// values may be different for you
ax = (AcX-2050)/16384.00;
ay = (AcY-77)/16384.00;
az = (AcZ-1947)/16384.00;

//270, 351, 136 for gyroscope
gx = (GyX+270)/131.07;
gy = (GyY-351)/131.07;
gz = (GyZ+136)/131.07;

// calculating Amplitute vactor for 3 axis
float Raw_AM = pow(pow(ax,2)+pow(ay,2)+pow(az,2),0.5);
int AM = Raw_AM * 10; // as values are within 0 to 1, I multiplied
// it by for using if else conditions

Serial.println(AM);
//Serial.println(PM);
//delay(500);

if (trigger3==true){
trigger3count++;
//Serial.println(trigger3count);
if (trigger3count>=10){
angleChange = pow(pow(gx,2)+pow(gy,2)+pow(gz,2),0.5);
//delay(10);
Serial.println(angleChange);
if ((angleChange>=0) && (angleChange<=10)){ //if orientation changes remains between 0-10 degrees
fall=true; trigger3=false; trigger3count=0;
Serial.println(angleChange);
}
else{ //user regained normal orientation
trigger3=false; trigger3count=0;
Serial.println("TRIGGER 3 DEACTIVATED");
}
}
}
if (fall==true){ //in event of a fall detection
Serial.println("FALL DETECTED");
digitalWrite(11, LOW);
delay(20);
digitalWrite(11, HIGH);
fall=false;
// exit(1);
}
if (trigger2count>=6){ //allow 0.5s for orientation change
trigger2=false; trigger2count=0;
Serial.println("TRIGGER 2 DECACTIVATED");
}
if (trigger1count>=6){ //allow 0.5s for AM to break upper threshold
trigger1=false; trigger1count=0;
Serial.println("TRIGGER 1 DECACTIVATED");
}
if (trigger2==true){
trigger2count++;
//angleChange=acos(((double)x*(double)bx+(double)y*(double)by+(double)z*(double)bz)/(double)AM/(double)BM);
angleChange = pow(pow(gx,2)+pow(gy,2)+pow(gz,2),0.5); Serial.println(angleChange);
if (angleChange>=30 && angleChange<=400){ //if orientation changes by between 80-100 degrees
trigger3=true; trigger2=false; trigger2count=0;
Serial.println(angleChange);
Serial.println("TRIGGER 3 ACTIVATED");
}
}
if (trigger1==true){
trigger1count++;
if (AM>=12){ //if AM breaks upper threshold (3g)
trigger2=true;
Serial.println("TRIGGER 2 ACTIVATED");
trigger1=false; trigger1count=0;
}
}
if (AM<=2 && trigger2==false){ //if AM breaks lower threshold (0.4g)
trigger1=true;
Serial.println("TRIGGER 1 ACTIVATED");
}
//It appears that delay is needed in order not to clog the port
delay(100);
}

void mpu_read(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
}

Step 5: Making IFTTT Channel

If you’re not using IFTTT (If This Then That), you’re seriously missing out. If This Then That allows you to combine different services with your own custom logic. Channels are the fundamental building blocks of IFTTT. They represent web services that provide data sources or even physical devices like fitness wearables.

The Maker Channel allows you to connect IFTTT to your personal DIY projects. With Maker, you can connect a Recipe to any device or service that can make or receive a web request.

I will use Maker Channel to receive a GET request from ESP8266 Module when triggered by ATmega chip. Maker Channel then send a SMS to a predefined number using SMS Channel. So, let's explain how to work with IFTTT.

1. If you don't have one already, create an account on www.IFTTT.com.

2. After sign in click to Channels to create a channel

3. Select Maker from DIY Electronics

4. Click to Connect button

5. Note your key, it will be required at the time of programming the ESP8266 module. Then click to Create a New Recipe.

6. Click on this

7. Choose Maker as Trigger Channel

8. Choose Receive a web request

9. Make an event name, I used 'button'. Event name is important and you have to use same name in the program.

10. Then click to that

11. Choose Android SMS as Action Channel

12. Click Send an SMS as an Action

13. Enter a phone number to which you want to get the SMS

14. Finally, click to Create Recipe

15. You will see the following response with Recipe ID.

Congratulation! You successfully created your IFTTT Channel & Recipe.

Now, you have to install IFTTT app to your mobile phone. Install it to your mobile phone and signed in into your account.

Step 6: Programming ESP8266 Module

ESP8266 MCU is a wifi chip plus a programable micro-controller. There are several ESP8266 boards available, usually numbered ESP-01 through ESP-12. The prices vary from around $2 for a simple ESP-01 to $15 for a complete board with USB to serial and 3.3 volt regulator. Because the ESP8266 provides a cost-effective solution to the rapidly growing market of internet-connected projects and devices (Internet Of Things), it has become one of the most popular development platforms over the past year and a half. In consequence, a dedicated community has formed around the platform (http://esp8266.com), which has been focused on improving its functionality. For starters, different firmware options have been ported to run on the ESP8266, effectively taking it from a simple Serial to Wi-Fi adapter into a fully functional microcontroller with access to its GPIO and hardware-based functions like PWM, I2C, 1-Wire communication, and ADC; all this, of course, in addition to maintaining its Wi-Fi capabilities.

Before start programming you need to flash your ESP-01 with the latest NodeMCU firmware. Once you have uploaded the latest NodeMCU firmware. All yo need is to upload init.lua, button.lua and ifttt.lua. Don't forget to modify your SSID, password, IFTTT trigger and key. To upload all the Lua files you may use LuaLoader.

Special thanks to Noel Portugal who first developed the code snippets for his IFTTT Easy Button.

Step 7: Circuit Diagram

Circuit diagram was designed using Eagle schematic design software. As I mentioned earlier I used standalone Arduino chip for my project and for that I used ATmega328P in the schematic. A 16MHz crystal is used as clock source. Two 15pf ceramic capacitor is added for better stability. The rang can be 15pf to 22pf. You may used any value within the range. Microcontroller communicates MPU sensor through I2C bus and for that SCL and SDA pin is used to connect with MPU sensor. For receiving data correctly an interrupt signal is required and external hardware interrupt INT0 is used for the purpose. You see, I connect reset pin of microcontroller directly to the VCC. If you want reset facility you should use a 10K resistor between Vcc & Reset pin and add a button switch between Ground & reset pin. After detecting any fault microcontroller will trigger an I/O pin of ESP8266 wifi module and for that I connected Arduino pin 11 to ESP8266 GPIO2 pin. Arduino pin 11 is the pin 17 of ATmega328 IC. I used a momentary button to the PB5 of the microcontroller and the button will act as a panic button.

Step 8: PCB Design

PCB was designed using Eagle Layout editor and the board file is attached below. I tried to keep form factor small but as I used toner transfer method to developing the PCB and for that I had to use wider trace size (24mil). One jumper was required and marked as red in the top layer. PDF file is attached. You may directly print it without any scaling. Any scaling will make the thing useless. If you want to know details about PCB design using Eagle you may follow the videos.

Step 9: Etching & Drilling

Etching is a "subtractive" method used for the production of printed circuit boards: acid is used to remove unwanted copper from a prefabricated laminate. This is done by applying a temporary mask that protects parts of the laminate from the acid and leaves the desired copper layer untouched. You can etch a PCB by yourself, in a lab or even at home, through a simple and inexpensive production process. Two Acid types that can be used for etching are ferric chloride (Eisen-3-Chlorid) and Sodium Persulfate (Natriumpersulfat - Feinätzkristall). Etching can be done in simple plastic boxes as I used here. For details about etching you can follow this nice instructables: Sponge + Ferric Chloride Method -- Etch PCBs in One Minute!.& this tutorial.

After successfully etching the PCB you need to drill it using any PCB drill. You can you mini drill or DIY drill using a simple DC motor. I used a 12V DC motor to make my drill and it's performance is very good.

Step 10: Solder ESP8266 Module to PCB

I think you made the PCB successfully. Now it is the time to soldering all the components. If you have no soldering experience I recommend you the tutorial How to Solder - Through-hole Soldering from sparkfun and a nice instructables How to Solder. I assumed you have now enough experience of soldering. So, we can start soldering now. First you should solder a 28 pin IC base for the microcontroller. It is good practice to use IC base without directly soldering the IC to the PCB board. It can protect your IC from damaging it during soldering. Then you need to solder ESP8266 module very carefully to the PCB board. Also solder crystal and disk capacitors.

Step 11: Solder MPU6050 Sensor Board to PCB

As you soldered IC base and ESP module in the previous step now it is the time to solder MPU sensor. Carefully solder it to the board. I attached some image from my case.

Step 12: Connect & Attached Power Switch & Charging Circuit

Now, connect a lipo battery charging module to the back side of the PCB. As you are attaching it in the back side you have to use hot glue to attached it with PCB. Be careful about short circuit. Make enough gap between soldered pad and the charging module when attaching hot glue. You should also attached a on-off switch with the module.

Step 13: Connect Battery

At this stage connect a li-ion battery to the charging circuit. You also have to attach it using hot glue. You may use some insulating tape at the bottom side of battery for better protection from short circuit. You may follow the photos.

Step 14: Testing

Connection is completed. Noe, it is the high time to test our invention. I think we should first check the charging of the battery. Connect a smart phone charging cable to the mini USB port. Red led should turn on means battery is charging. When battery get full charged then blue led will be on instead of red.

OK, our charging circuit is working good.

Now, turn on the on/off switch. Two leds, one from MPU sensor and another from ESP module will be turn on and it proves that our device is working correctly so far. At the beginning blue led from ESP module will be blink and indicate it is connecting to the wifi network.

Before farther testing we need to add a shock proof casing or box. You you have access to 3D printer definitely it will be a very good option to make a 3D printed casing for the device. Unfortunately I have no access to any 3D printer and for that I have to think how I can make a case for my device.

Let me some moment to think about the matter. See you again to the next step.

Step 15: Different View of Completed Device

I used some image of the completed device here from different view.

Step 16: Making a Case

OK guys I find a way to make the case. I used two instructable embroidery iron patch to make the case. Just use a needle and some thread to make a case I shown in the images.

Step 17: Putting the Device Into the Case

Now, put the device into the instructables case and attached a safety pin in the top side of the case. power on the device. Use a tweezers to power on the device. After successful powering leds will be glow. Now test it by throwing from the top into your bed. If you receive ad SMS into your mobile phone than Congratulation!!!

You successfully made a fall detector with emergency notification.

Now you can throw it, you can put it into your pocket or you can hang it on your shoulder using a ribbon or you can push the panic button if you are in trouble. Use it as you like.

Comments

author
nguyen anhN1 (author)2017-07-25

Great Instructable!!!!!

But why do you have to make 2 thresholds ( upper and lower) ? Please explain, I've been thinking about it for days but I couldn't figure it out

author
JosephP152 (author)2017-06-04

hi,

can i know why you use the value for calibration of accelerometer and gyroscope? please advise. thank you!!!

author
skourkos (author)2016-12-09

Congrats for the build. Electronics at the service of people's health not just for fun... Try making it internet independent (with an A6 module for instance) for maximum convenience and portability. Thumbs up for this great project. I will be making it.

author
Vinitkumar (author)2016-10-18

i have esp12 wifi module do the codes support it

and i didnt get the firmware flasher thing

author
amansinghaljpr (author)2016-07-13

Does your device should always be connected to an active internet connection ?

author
taifur (author)amansinghaljpr2016-07-13

Yes

author
ManuelA11 (author)taifur2016-09-22

nice instructable
i will like to ask whether its possible to use only the sms feature without internet connection. that will mean using the gsm shield in this project.

tjanks

author
gokulgo (author)2016-08-02

please tell me ,is it possible to convert the above given lua code into arduino?

author
gokulgo (author)2016-08-02

good project.but how can i change the lua codes into arduino?

author
Chitlange Sahas (author)2016-07-04

Useful !

Keep up the great work.

author
QUYNGUYENXUAN (author)2016-06-29

Hello , I found your project very well , I 'm doing it but there are some problems , you can guide me how to load the ZIP file to be esp8266 not , I can not connect to my channel IFTTT , thank you

author
R Jordan Kreindler (author)2016-06-20

Unfortunately the Instructable site currently leaves off anything after #include, i.e., both the greater and less than symbols (obviously a bad software implementation - which hopefully will be corrected shortly) and any text between these symbols (just check the posted sketch).

Thus, what is the include library you intended for us to use in your sketch. Please be kind enough to just respond without the greater than or less than symbols, as we can add these by hand. A text only response (without symbols) will insure your message gets through in its entirety. It may come thorough if you include those symbols here in a message, but there appears no need to take a chance it may not.

BTW: A very nice Instructable - thanks.

author
Niranjan_Niru (author)2016-06-13

great work but i dint get how the trigger occours does the chip esp8266 connect to wifi

and how the IFTTT get trigger what i mean is how does the communication occour betwee esp8266 and IFTTT any one please let me know

author
taifur (author)Niranjan_Niru2016-06-13

You have to register IFTTT maker channel. You will get a unique key for your channel. When you program esp8266 module you have to use the key. You also have to install IFTTT app into your mobile phone. When esp8266 get triggered then it communicates through the channel and sent a notification to your mobile app & your mobile app sent an SMS to assigned phone number using your operator.

author
ohoilett (author)2016-06-13

Nice dude.

author
taifur (author)ohoilett2016-06-13

Thanks

author
robonautus (author)2016-06-12

Great Instructable!

author
taifur (author)robonautus2016-06-12

Thank you

author
WalleyK (author)2016-06-09

Ow, I need One.... you are so brilliant. done a very useful project for Old men and women

author
taifur (author)WalleyK2016-06-09

Thanks for your nice comment.

author
PainlessPete360 (author)2016-06-06

Awesome! One remark though; the title of your page. You should write, "Come" instead of "Cum", unless the operator of the device is seeking an alternate form of assistance.

author

Yes, fix the spelling....I do not think that word means what you think it means.

author
Istarian (author)wrecks1352016-06-08

I think he is referring to the Latin word (https://en.wiktionary.org/wiki/cum#Latin) which is generally used like the word 'with' or the meaning of being next to or additional. Ever heard of 'magna cum laude'? A general translation of that is 'with great distinction'.

It's probably fine to just use 'with' though if one is concerned with the ever burgeoning quantity of words that are added to the list of innuendo in english.

author
wrecks135 (author)Istarian2016-06-08

Shows where my mind is...that usage and meaning for "cum" never even occurred to me although I'm familiar with it. Thanks for making this very valid point and distinction.

author
taifur (author)Istarian2016-06-08

You are right and I have changed the word.

author
tzq33tdq (author)PainlessPete3602016-06-06

I second that XD

author
taifur (author)PainlessPete3602016-06-06

Thanks

author
tttapa (author)2016-06-07

Nice project! However, it seems a bit counterintuitive to use a separate ATmega considering the fact that the ESP8266 is a full microcontroller on its own. An argument pro two microcontrollers is that you could use an ATmega (or even an ATtiny) to detect a fall, and keep the ESP8266 (that draws a lot of current) in deep sleep until it's triggered by the Atmel chip. That way, the battery could last for days on end! (also, the ESP8266 allows you to check the supply voltage, so you could send a low battery warning as well)
I recommend you search for Andreas Spiess on YouTube, he has a lot of interesting videos on programming the ESP8266, and about deep sleep and power saving.
(of course, you'll need an ESP8266 with the SPI pins laid out, e.g. the esp-07 or esp-12)

author
taifur (author)tttapa2016-06-07

You are absolutely right. Truly speaking I am working on the fact specially about power management. Thank you for your nice suggestions.

author
Nateowami (author)2016-06-07

What if someone falls on the device? Won't it almost certainly be crushed? Also, might it catch on fire if a short circuit were caused? Doesn't seem very fail-safe.

My suggestion would be to have the device send a "no fall detected" signal about every 5 seconds (and also send out a different signal if a fall is detected). Then if no signal is received, perhaps the battery is dead or the device isn't working, or the wifi or internet connection is bad. Then the text and email can say there's no connection, perhaps a malfunction or it broke due to a fall.

You could even make it beep when it thinks a fall was detected, and create an "I'm OK" button that can be pressed if it's a false positive (perhaps separate from the device, so the button isn't accidentally pressed in case of a fall). Or use Twilio to automate a call to the elderly person and see if it is answered.

Very cool project by the way. Well done.

author
taifur (author)Nateowami2016-06-07

Than you very much for your nice idea & suggestions, I will try to implement it in my next version.

author
jhdeedar (author)2016-06-07

It's a useful and mind blowing post ....

author
taifur (author)jhdeedar2016-06-07

Thank you Deedar

author
smartrem (author)2016-06-07

Nice project! Just one question, how long will the battery last before you need to charge it?

author
taifur (author)smartrem2016-06-07

I used rechargeable battery so you can recharge it. I don't calculate the power consumption.

author
gopalyajur (author)2016-06-06

Excellent

author
taifur (author)gopalyajur2016-06-06

Thank you

About This Instructable

12,885views

200favorites

License:

Bio: I like to learn, like to make, like to share.
More by taifur:$5 IoT Pill BottlePortable ECG Machine Physical Pattern Lock
Add instructable to: