Devices & Components
Arduino Nano
Wires
Olight® 650mAh 16340 RCR123A 3.7v Lithium-ion Rechargeable Batteries
NEO 6M GPS MODULE
HC-05 Bluetooth Module
5mm Green LED
Li-Po-Battery 3.7 V 1200 mA
MPU 6500
5mm Red LED
Hardware & Tools
3D Printer-Ultimaker S3
Software & Tools
Android Studio
Arduino IDE
TINKERCAD
Firebase
Project description
Code
MAIN CODE
js
MAIN CODE
1#include <Wire.h> 2 3#include <MPU6050_tockn.h> 4 5#include <TinyGPS++.h> 6 7#include <SoftwareSerial.h> 8 9 10 11// Constants 12 13#define GPS_BAUD 9600 14 15#define SERIAL_BAUD 9600 16 17#define GYRO_THRESHOLD 200.0 // deg/s (sudden rotation) 18 19#define TILT_ANGLE_THRESHOLD 60 // degrees from vertical 20 21#define SPEED_CHANGE_THRESHOLD 15.0 // km/h sudden stop 22 23#define ALERT_COOLDOWN 10000 // 10 seconds 24 25 26 27// Pins 28 29const uint8_t GPS_RX = 4; 30 31const uint8_t GPS_TX = 3; 32 33 34 35const uint8_t STATUS_LED = 13; 36 37 38 39MPU6050 mpu(Wire); 40 41TinyGPSPlus gps; 42 43SoftwareSerial gpsSerial(GPS_RX, GPS_TX); 44 45 46 47// State variables 48 49float prevSpeed = 0; 50 51uint32_t lastAlertTime = 0; 52 53 54 55void setup() { 56 57 pinMode(STATUS_LED, OUTPUT); 58 59 Serial.begin(SERIAL_BAUD); 60 61 gpsSerial.begin(GPS_BAUD); 62 63 Wire.begin(); 64 65 66 67 mpu.begin(); 68 69 mpu.calcGyroOffsets(true); 70 71 72 73 Serial.println(F("Gyro-Based Crash Detection Ready")); 74 75} 76 77 78 79void loop() { 80 81 static uint32_t lastUpdate = 0; 82 83 const uint32_t currentMillis = millis(); 84 85 86 87 mpu.update(); 88 89 90 91 // 1. Detect sudden rotation (gyroscope) 92 93 const float gyroX = mpu.getGyroX(); 94 95 const float gyroY = mpu.getGyroY(); 96 97 const float gyroZ = mpu.getGyroZ(); 98 99 const float gyroMagnitude = sqrt(gyroX*gyroX + gyroY*gyroY + gyroZ*gyroZ); 100 101 102 103 // 2. Check sustained tilt (using gravity vector) 104 105 const float accelY = mpu.getAccY(); 106 107 const float accelZ = mpu.getAccZ(); 108 109 const float tiltAngle = atan2(accelY, accelZ) * 180/PI; // Vertical tilt 110 111 112 113 // 3. Detect sudden stop (GPS speed) 114 115 const float currentSpeed = gps.speed.kmph(); 116 117 const float speedDelta = abs(prevSpeed - currentSpeed); 118 119 prevSpeed = currentSpeed; 120 121 122 123 // Accident condition check 124 125 if((gyroMagnitude > GYRO_THRESHOLD && abs(tiltAngle) > TILT_ANGLE_THRESHOLD)|| 126 127 (prevSpeed > 10 && speedDelta > SPEED_CHANGE_THRESHOLD) ) { 128 129 triggerAlert(); 130 131 } 132 133 134 135} 136 137 138 139void triggerAlert() { 140 141 if(millis() - lastAlertTime < ALERT_COOLDOWN) return; 142 143 lastAlertTime = millis(); 144 145 146 147 digitalWrite(STATUS_LED, HIGH); 148 149 Serial.println(F("@ACCIDENT_SOS 28.06, 77.03")); //assumed gps values due to poor connectivity of gps inside a room 150 151 152 153 if(gps.location.isValid()) { 154 155 Serial.print(F("Location: ")); 156 157 Serial.print(gps.location.lat(), 6); 158 159 Serial.print(","); 160 161 Serial.println(gps.location.lng(), 6); 162 163 } 164 165 166 167 delay(500); 168 169 digitalWrite(STATUS_LED, LOW); 170 171 172}
Downloadable files
CODE INO FILE
CODE
project_code.ino
EXPLANATION OF PROJECT
YOUTUBE VIDEO
https://youtu.be/IhCASYGO7Cc?si=oQ04ZUTdPVBKqMor
Documentation
MAIN
DOCUMENT
SMART HELMET.pdf
Comments
Only logged in users can leave comments