Inspiration

Getting lost, falling, or having a health issue happens fast—and calling for help isn’t always possible. We wanted a simple, wearable-ish safety device that can notice danger and share useful info automatically.

What it does

SafetyBeacon reads heart rate + motion + temperature/humidity on an ESP32, detects risky events (impact / abnormal HR / overheating), switches to WARNING, beeps until acknowledged, and sends compact JSON over BLE to an Android app. In WARNING it also includes GPS info (satellites + lat/lon) when available.

How we built it

ESP32 + MAX30100 + MPU6050 + DHT11 + DFR1103 GPS + I2S speaker

ESP32 code: state machine (NORMAL/WARNING), sensor sampling, threshold logic, snapshot + GPS polling, BLE notify JSON

Android (Kotlin + Jetpack Compose): BLE scan/connect/subscribe, parse JSON, display live cards + raw JSON debug window

Challenges we ran into

BLE notifications were the biggest pain: permissions, MTU/fragmentation, CCCD subscription reliability, and parsing partial packets. Also, heart-rate stabilization + “finger not detected” handling needed debouncing so it wouldn’t false-trigger.

Accomplishments that we're proud of

A full end-to-end pipeline: real sensors → real detection logic → BLE streaming → live mobile UI. WARNING mode is clear, logged, and includes extra context (GPS + reason) instead of just “something happened.”

What we learned

BLE is deceptively tricky—getting “connected” doesn’t mean you’re actually subscribed to notifications. Also, sensor data needs smoothing and gating (validity checks) before it’s usable for safety decisions.

What's next for SafetyBeacon

Better detection (fall model + activity context), background alerts (SMS/cloud relay), map view for GPS, persistent logs, battery/power optimization, and a cleaner hardware form factor.

Built With

  • ble
  • bluetoothgatt
  • bluetoothlescanner
  • c++
  • esp32
  • gatt
  • i2c
  • i2s
  • jetpack
  • kotlin
Share this project:

Updates