#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <TinyGPSPlus.h>
#include <DFPlayerMini.h>
// Define Blynk settings
#define BLYNK_TEMPLATE_ID "TMPL3FR9dY-_A"
#define BLYNK_TEMPLATE_NAME "SMART GLASSES FOR VISUALLY BLIND"
#define BLYNK_AUTH_TOKEN "W0UQHwSq9Dhcz1WnUfMhgtRtjp16gwi1"
// Ultrasonic Sensor Pins
#define TRIG_PIN1 14
#define ECHO_PIN1 13
#define TRIG_PIN2 45
#define ECHO_PIN2 48
// IR Sensor Pins
#define IR_PIN1 15
#define IR_PIN2 42
#define IR_PIN3 35
// DHT22 Sensor Settings
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Buzzer Pin
#define BUZZER_PIN 12
// Temperature Sensor Pins
#define ONE_WIRE_BUS 18
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// GPS Settings
TinyGPSPlus gps;
HardwareSerial gpsSerial(1); // RX, TX
// DFPlayer Mini Settings
#define DFPLAYER_RX_PIN 26
#define DFPLAYER_TX_PIN 27
DFRobotDFPlayerMini dfPlayer;
// WiFi and Blynk settings
char ssid[] = "Hash";
char pass[] = "contrasena";
// ThingSpeak settings
unsigned long myChannelNumber = 2628555;
const char * myWriteAPIKey = "TSBK165SONTOXYR1Y";
WiFiClient client;
void setup() {
Serial.begin(115200);
gpsSerial.begin(9600);
// Initialize sensors and modules
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
pinMode(IR_PIN1, INPUT);
pinMode(IR_PIN2, INPUT);
pinMode(IR_PIN3, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
dht.begin();
sensors.begin();
// Initialize DFPlayer Mini
Serial2.begin(9600); // Use Serial2 for DFPlayer Mini
if (!dfPlayer.begin(Serial2)) {
Serial.println("DFPlayer Mini not detected!");
while (true);
}
dfPlayer.volume(20); // Set volume (0 to 30)
// Initialize WiFi, Blynk, and ThingSpeak
WiFi.begin(ssid, pass);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
ThingSpeak.begin(client);
}
void loop() {
Blynk.run();
checkUltrasonicSensors();
checkIRSensors();
checkTemperature();
checkGPS();
delay(2000); // delay between checks
}
void checkUltrasonicSensors() {
long duration1, distance1, duration2, distance2;
// Ultrasonic 1
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN1, LOW);
duration1 = pulseIn(ECHO_PIN1, HIGH);
distance1 = (duration1 * 0.034) / 2;
// Ultrasonic 2
digitalWrite(TRIG_PIN2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN2, LOW);
duration2 = pulseIn(ECHO_PIN2, HIGH);
distance2 = (duration2 * 0.034) / 2;
// Object detection
if (distance1 < 50 || distance2 < 50) {
tone(BUZZER_PIN, 1000, 200);
speak("Obstacle ahead");
}
// Stairs detection (up or down)
if (distance1 > distance2 + 10) {
speak("Stairs down detected");
} else if (distance2 > distance1 + 10) {
speak("Stairs up detected");
}
}
void checkIRSensors() {
int ir1 = digitalRead(IR_PIN1);
int ir2 = digitalRead(IR_PIN2);
int ir3 = digitalRead(IR_PIN3);
// Hole or gap detection
if ((ir1 == LOW && ir2 == LOW) || (ir2 == LOW && ir3 == LOW) || (ir1 == LOW && ir3 == LOW)) {
tone(BUZZER_PIN, 1500, 200);
speak("Gap detected");
}
}
void checkTemperature() {
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
float tempDHT = dht.readTemperature();
if (temperature > 30 || tempDHT > 30) {
tone(BUZZER_PIN, 1000, 200);
speak("Hot object detected");
}
}
void checkGPS() {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
if (gps.location.isUpdated()) {
float latitude = gps.location.lat();
float longitude = gps.location.lng();
// Send location to ThingSpeak
ThingSpeak.setField(1, latitude);
ThingSpeak.setField(2, longitude);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
// Alert via DFPlayer Mini
speak("Location updated");
}
}
}
void speak(String text) {
// Convert text to audio file ID or use pre-recorded files
// For simplicity, assume you have pre-recorded audio files with specific IDs
if (text == "Obstacle ahead") {
dfPlayer.play(1); // Play track 1
} else if (text == "Stairs down detected") {
dfPlayer.play(2); // Play track 2
} else if (text == "Stairs up detected") {
dfPlayer.play(3); // Play track 3
} else if (text == "Gap detected") {
dfPlayer.play(4); // Play track 4
} else if (text == "Hot object detected") {
dfPlayer.play(5); // Play track 5
} else if (text == "Location updated") {
dfPlayer.play(6); // Play track 6
}
}