Fall Detector for Old Man Using Cayenne

About This Project

Falling down is too risky to many old man. If they are fall, we must helping them as soon as possible before any bad bad things happened. The problem is we can’t always keep watch their activities.

So, in this project we will create a prototype of fall detection to solve the problem above.

This device should send an alert to your email if fall detected.

What’s Connected

NodeMCU ESP8266

MPU6050 triple axis acc gyro

Triggers & Alerts

Trigger to send email if fall detected

Scheduling

No scheduling

Dashboard Screenshots

Photos of the Project

2 Likes

Video added…

Great use case! Would also be great if you could post the code you used in case other members of community want to replicate :slight_smile:

-B

I will add the code asap

#include "CayenneDefines.h"
#include "CayenneWiFi.h"
#include "CayenneWiFiClient.h"
#include <Wire.h>
#include <MPU6050.h>

MPU6050 mpu;

boolean freefallDetected = false;

char token[] = ""; //fill the token of cayenne
char ssid[] = ""; //fill with wifi ssid
char pwd[] = ""; //fill with wifi password

void setup() 
{
  Serial.begin(115200);
  Cayenne.begin(token, ssid, pwd);
  Serial.println("Initialize MPU6050");

  while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_16G))
  {
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
  }

  mpu.setAccelPowerOnDelay(MPU6050_DELAY_3MS);
  
  mpu.setIntFreeFallEnabled(true);
  mpu.setIntZeroMotionEnabled(false);
  mpu.setIntMotionEnabled(false);
  
  mpu.setDHPFMode(MPU6050_DHPF_5HZ);

  mpu.setFreeFallDetectionThreshold(17);
  mpu.setFreeFallDetectionDuration(2);	
  
  checkSettings();
  
  attachInterrupt(12, doInt, RISING);
}

void doInt()
{
  freefallDetected = true;  
}

void checkSettings()
{
  Serial.println();
  
  Serial.print(" * Sleep Mode:                ");
  Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled");

  Serial.print(" * Motion Interrupt:     ");
  Serial.println(mpu.getIntMotionEnabled() ? "Enabled" : "Disabled");

  Serial.print(" * Zero Motion Interrupt:     ");
  Serial.println(mpu.getIntZeroMotionEnabled() ? "Enabled" : "Disabled");

  Serial.print(" * Free Fall Interrupt:       ");
  Serial.println(mpu.getIntFreeFallEnabled() ? "Enabled" : "Disabled");

  Serial.print(" * Free Fal Threshold:          ");
  Serial.println(mpu.getFreeFallDetectionThreshold());

  Serial.print(" * Free FallDuration:           ");
  Serial.println(mpu.getFreeFallDetectionDuration());
  
  Serial.print(" * Clock Source:              ");
  switch(mpu.getClockSource())
  {
case MPU6050_CLOCK_KEEP_RESET:     Serial.println("Stops the clock and keeps the timing generator in reset"); break;
case MPU6050_CLOCK_EXTERNAL_19MHZ: Serial.println("PLL with external 19.2MHz reference"); break;
case MPU6050_CLOCK_EXTERNAL_32KHZ: Serial.println("PLL with external 32.768kHz reference"); break;
case MPU6050_CLOCK_PLL_ZGYRO:      Serial.println("PLL with Z axis gyroscope reference"); break;
case MPU6050_CLOCK_PLL_YGYRO:      Serial.println("PLL with Y axis gyroscope reference"); break;
case MPU6050_CLOCK_PLL_XGYRO:      Serial.println("PLL with X axis gyroscope reference"); break;
case MPU6050_CLOCK_INTERNAL_8MHZ:  Serial.println("Internal 8MHz oscillator"); break;
  }
  
  Serial.print(" * Accelerometer:             ");
  switch(mpu.getRange())
  {
case MPU6050_RANGE_16G:            Serial.println("+/- 16 g"); break;
case MPU6050_RANGE_8G:             Serial.println("+/- 8 g"); break;
case MPU6050_RANGE_4G:             Serial.println("+/- 4 g"); break;
case MPU6050_RANGE_2G:             Serial.println("+/- 2 g"); break;
  }  

  Serial.print(" * Accelerometer offsets:     ");
  Serial.print(mpu.getAccelOffsetX());
  Serial.print(" / ");
  Serial.print(mpu.getAccelOffsetY());
  Serial.print(" / ");
  Serial.println(mpu.getAccelOffsetZ());

  Serial.print(" * Accelerometer power delay: ");
  switch(mpu.getAccelPowerOnDelay())
  {
case MPU6050_DELAY_3MS:            Serial.println("3ms"); break;
case MPU6050_DELAY_2MS:            Serial.println("2ms"); break;
case MPU6050_DELAY_1MS:            Serial.println("1ms"); break;
case MPU6050_NO_DELAY:             Serial.println("0ms"); break;
  }  
  
  Serial.println();
}

void loop()
{
  Cayenne.run();
}

CAYENNE_OUT(V8)
{
  Vector rawAccel = mpu.readRawAccel();
  Activites act = mpu.readActivites();

if (freefallDetected)
{
Cayenne.virtualWrite(V8, act.isFreeFall); //virtual pin
delay(100);
}
}
1 Like

wrap the old person in aluminum foil, spread aluminum foil on the floor. When he falls, the aluminum completes a circuit…

Bwahahaha!

(I quack myself up)

Excellent use of accellerometer!