#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TinyGPSPlus.h>
// LCD setup (address may vary: use 0x27 or 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// GPS using HardwareSerial 2
HardwareSerial GPS(2);
TinyGPSPlus gps;
// Pin definitions
#define BUZZER_PIN 27
#define LED_PIN 26
#define BUTTON_PIN 25
// Location strings
String latitudeStr = "";
String longitudeStr = "";
void setup() {
// Serial Monitor
Serial.begin(115200);
// Start GPS Serial
GPS.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
// Pin Modes
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Smart SOS System");
delay(2000);
lcd.clear();
}
void loop() {
// Read GPS data
while (GPS.available() > 0) {
gps.encode(GPS.read());
}
// When button is pressed (LOW due to INPUT_PULLUP)
if (digitalRead(BUTTON_PIN) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SOS Activated!");
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
// Get GPS data
if (gps.location.isValid()) {
latitudeStr = String(gps.location.lat(), 6);
longitudeStr = String(gps.location.lng(), 6);
Serial.println("Sending SOS with Location:");
Serial.print("Latitude: ");
Serial.println(latitudeStr);
Serial.print("Longitude: ");
Serial.println(longitudeStr);
lcd.setCursor(0, 1);
lcd.print("Lat:");
lcd.print(latitudeStr.substring(0, 5)); // Show 5 digits
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Long:");
lcd.print(longitudeStr.substring(0, 5));
} else {
Serial.println("GPS Location Invalid");
lcd.setCursor(0, 1);
lcd.print("No GPS Signal");
}
delay(5000); // Alert duration
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
lcd.clear();
}
}