/*
Elderly free fall SOS
NOTE : The fall is detected only when the value of all
the 3 axis is less than 0.3g
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MPU6050.h>
// Initialize LCD Display
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialize MPU6050 Accelerometer
MPU6050 mpu;
// Pin Definitions
#define buzzer_pin 3
#define led_pin 11
#define sosbutton_pin 12
#define l_led 13
void setup() {
// Start Serial Communication
//Serial.begin(9600);
// Initialize LCD Display
lcd.begin(16, 2); // 16 columns and 2 rows
lcd.backlight();
lcd.clear(); // Ensure LCD is clear
lcd.setCursor(0, 0);
lcd.print("Fall Detection");
pinMode(l_led, OUTPUT);
// Initialize MPU6050
Wire.begin();
mpu.initialize(); // Initialize MPU6050
if (!mpu.testConnection()) {
lcd.setCursor(0, 1);
lcd.print("MPU Init Failed");
while (1); // Stop if MPU6050 initialization fails
}
// Configure MPU6050
mpu.setXAccelOffset(0); // Adjust offsets as necessary
mpu.setYAccelOffset(0);
mpu.setZAccelOffset(0);
// Initialize Buzzer, LED, and Button
pinMode(buzzer_pin, OUTPUT);
pinMode(led_pin, OUTPUT);
pinMode(sosbutton_pin, INPUT_PULLUP);
lcd.setCursor(0, 1);
lcd.print("System Ready");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Monitoring...");
}
void loop() {
// Read accelerometer values
int16_t accelX = mpu.getAccelerationX();
int16_t accelY = mpu.getAccelerationY();
int16_t accelZ = mpu.getAccelerationZ();
// Normalize accelerometer values (convert to g)
float normAccelX = accelX / 16384.0;
float normAccelY = accelY / 16384.0;
float normAccelZ = accelZ / 16384.0;
// Detect fall based on sudden change in acceleration
if (abs(normAccelX) < 0.3 && abs(normAccelY) < 0.3 && abs(normAccelZ) < 0.3) {
triggerFallAlert();
}
// Check for manual SOS
if (digitalRead(sosbutton_pin) == LOW) {
triggerSOSAlert();
}
}
// Function to handle fall alert
void triggerFallAlert() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Fall Detected!");
lcd.setCursor(0, 1);
lcd.print("Help Required");
digitalWrite(buzzer_pin, HIGH); // Turn on buzzer
for (int i = 0; i < 6; i++) { // Blink LED 6 times
digitalWrite(led_pin, HIGH);
delay(250);
digitalWrite(led_pin, LOW);
delay(250);
}
digitalWrite(buzzer_pin, LOW); // Turn off buzzer
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Monitoring...");
}
// Function to handle manual SOS
void triggerSOSAlert() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Manual SOS!");
lcd.setCursor(0, 1);
lcd.print("Help Required");
digitalWrite(buzzer_pin, HIGH); // Turn on buzzer
for (int i = 0; i < 6; i++) { // Blink LED 6 times
digitalWrite(led_pin, HIGH);
delay(250);
digitalWrite(led_pin, LOW);
delay(250);
}
digitalWrite(buzzer_pin, LOW); // Turn off buzzer
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Monitoring...");
}