/* Self-Defense Cane Prototype for People with Vision Impairments
Group 2
12 STEM - Hipparchus
Chelsea Raine M. Baguio
Josephine Joy L. Bandola
Alex Roderick M. Bue Jr.
Justin Raeburn A. Dy
Angela B. Nunez
Jasmine Dianne R. Young
*/
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
// Function prototypes
void triggerSensor(int echoPin);
void sendSMS(const char *phoneNumber, const char *message);
void readGPS();
// GPS module configuration
static const int GPS_RXPin = 11, GPS_TXPin = 12;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial gpsSerial(GPS_RXPin, GPS_TXPin);
// Ultrasonic sensor configuration
int trigPin = 13;
int echo1 = 5;
int buzzer1 = 2;
int buzzer2 = 3;
int buzzer3 = 4;
long duration, duration2, duration3, cm1, cm2, cm3, cm;
// GSM module configuration
static const int GSM_RXPin = 9, GSM_TXPin = 10;
SoftwareSerial gsmSerial(GSM_RXPin, GSM_TXPin);
const int buttonPin = 8; // Button for sending GSM
const int ultbutton = 7; // Button for ultrasonic
// Variables to store GPS location
float savedLongitude = 0.0;
float savedLatitude = 0.0;
void setup()
{
Serial.begin(9600);
gpsSerial.begin(GPSBaud);
gsmSerial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ultbutton, INPUT_PULLUP);
pinMode(trigPin, OUTPUT);
pinMode(echo1, INPUT);
pinMode(buzzer1, OUTPUT);
pinMode(buzzer2, OUTPUT);
pinMode(buzzer3, OUTPUT);
}
void loop()
{
readGPS(); // Read GPS data
if (digitalRead(ultbutton) == LOW)
{
// Trigger Sensor 1
triggerSensor(echo1);
duration = pulseIn(echo1, HIGH);
cm1 = (duration / 2) * 0.03436426116838487972508591065292;
// Determine the shortest distance
cm = cm1;
// Print the distances and the shortest distance
Serial.println("Distance from Sensor 1: " + String(cm1) + "cm");
Serial.println("Shortest Distance: " + String(cm) + "cm");
// Determine how many buzzers
if (cm <= 50)
{
Serial.println(" 3 buzzers");
digitalWrite(buzzer1, HIGH);
digitalWrite(buzzer2, HIGH);
digitalWrite(buzzer3, HIGH);
}
else if (cm <= 100)
{
Serial.println(" 2 buzzers");
digitalWrite(buzzer1, HIGH);
digitalWrite(buzzer2, HIGH);
digitalWrite(buzzer3, LOW);
}
else if (cm <= 150)
{
Serial.println(" 1 buzzer");
digitalWrite(buzzer1, HIGH);
digitalWrite(buzzer2, LOW);
digitalWrite(buzzer3, LOW);
}
else
{
Serial.println(" No buzzer");
digitalWrite(buzzer1, LOW);
digitalWrite(buzzer2, LOW);
digitalWrite(buzzer3, LOW);
}
}
else
{
digitalWrite(buzzer1, LOW);
digitalWrite(buzzer2, LOW);
digitalWrite(buzzer3, LOW);
}
if (digitalRead(buttonPin) == LOW)
{
Serial.println("Button Pressed - Saving GPS Location...");
Serial.print("Saved Longitude: ");
Serial.println(savedLongitude, 6);
Serial.print("Saved Latitude: ");
Serial.println(savedLatitude, 6);
// Convert float values to strings
char latString[10];
char lonString[10];
dtostrf(savedLatitude, 6, 4, latString);
dtostrf(savedLongitude, 6, 4, lonString);
Serial.println("Sending SMS...");
char message[160];
sprintf(message, "Ms./Mr. Yanyan Young feels endangered. Please contact them immediately. Check their location here: %s,%s", lonString, latString);
sendSMS("+639291740535", message);
delay(5000); // Delay to avoid multiple SMS on a single button press
}
}
void triggerSensor(int echoPin) // Setting for ultrasonic sensor (turn on or off)
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
}
void sendSMS(const char *phoneNumber, const char *message)
{
Serial.println("Sending SMS...");
gsmSerial.println("AT+CMGF=1");
delay(1000);
char command[30];
sprintf(command, "AT+CMGS=\"%s\"", phoneNumber);
gsmSerial.println(command);
delay(1000);
gsmSerial.println(message);
delay(1000);
gsmSerial.println((char)26); // End the SMS with Ctrl+Z
delay(1000);
Serial.println("SMS Sent");
}
void readGPS()
{
gpsSerial.listen();
while (gpsSerial.available() > 0)
{
if (gps.encode(gpsSerial.read()))
{
if (gps.location.isValid())
{
// Save GPS location to variables
savedLongitude = gps.location.lng();
savedLatitude = gps.location.lat();
}
}
}
}