#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD address
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ==============================
// PIN DEFINITIONS
// ==============================
#define BUZZER_PIN 26
#define LED_PIN 27
#define BUTTON_PIN 14
// ==============================
// VARIABLES
// ==============================
float acceleration;
int gasLevel;
float impactThreshold;
int gasThreshold;
void setup() {
Serial.begin(115200);
// LCD I2C
Wire.begin(21, 22);
// LCD initialize
lcd.init();
lcd.backlight();
// Pin Modes
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Startup Screen
lcd.setCursor(0, 0);
lcd.print("SMART HELMET");
lcd.setCursor(0, 1);
lcd.print("SYSTEM READY");
delay(2000);
lcd.clear();
// ==============================
// USER INPUT THRESHOLDS
// ==============================
Serial.println("===== SMART HELMET =====");
Serial.println("Enter Accident Threshold:");
while (Serial.available() == 0);
impactThreshold = Serial.parseFloat();
while (Serial.available() > 0) {
Serial.read();
}
Serial.print("Impact Threshold = ");
Serial.println(impactThreshold);
delay(1000);
Serial.println("Enter Gas Threshold:");
while (Serial.available() == 0);
gasThreshold = Serial.parseInt();
while (Serial.available() > 0) {
Serial.read();
}
Serial.print("Gas Threshold = ");
Serial.println(gasThreshold);
Serial.println("========================");
}
void loop() {
// ==============================
// USER ENTERS ACCELERATION VALUE
// ==============================
Serial.println("\nEnter Acceleration Value:");
while (Serial.available() == 0);
acceleration = Serial.parseFloat();
while (Serial.available() > 0) {
Serial.read();
}
Serial.print("Acceleration = ");
Serial.println(acceleration);
// ==============================
// USER ENTERS GAS VALUE
// ==============================
Serial.println("Enter Gas Value:");
while (Serial.available() == 0);
gasLevel = Serial.parseInt();
while (Serial.available() > 0) {
Serial.read();
}
Serial.print("Gas Level = ");
Serial.println(gasLevel);
Serial.println("-----------------------");
// ==============================
// LCD DISPLAY
// ==============================
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gas:");
lcd.print(gasLevel);
// ==============================
// ACCIDENT DETECTION
// ==============================
if (acceleration > impactThreshold ||
digitalRead(BUTTON_PIN) == LOW) {
Serial.println("ACCIDENT DETECTED!");
Serial.println("GPS LOCATION SENT");
// Simulated GPS Coordinates
float latitude = 17.3850;
float longitude = 78.4867;
Serial.print("Latitude: ");
Serial.println(latitude, 6);
Serial.print("Longitude: ");
Serial.println(longitude, 6);
// LCD Alert
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACCIDENT!");
lcd.setCursor(0, 1);
lcd.print("GPS SENT");
// LED ON
digitalWrite(LED_PIN, HIGH);
// Buzzer ON
tone(BUZZER_PIN, 1000);
delay(5000);
// OFF
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, LOW);
lcd.clear();
}
// ==============================
// GAS DETECTION
// ==============================
else if (gasLevel > gasThreshold) {
Serial.println("GAS/ALCOHOL DETECTED!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("GAS DETECTED");
lcd.setCursor(0, 1);
lcd.print("RIDE BLOCKED");
// LED ON
digitalWrite(LED_PIN, HIGH);
// Buzzer ON
tone(BUZZER_PIN, 1500);
delay(3000);
// OFF
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, LOW);
lcd.clear();
}
// ==============================
// NORMAL CONDITION
// ==============================
else {
lcd.setCursor(0, 1);
lcd.print("Helmet Safe");
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
Serial.println("Helmet Safe");
}
delay(1000);
}