#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <WebSocketsServer.h>
#include "index.h"
#include <ESP32Servo.h>
Servo servo; // create servo object to control a servo
//setting sr04 pins
#define trigger_pin 23
#define echo_pin 35
//setting servo pin
#define SERVO_PIN 13
// Setting Motor A
int enable1Pin = 14;
int motor1Pin1 = 27;
int motor1Pin2 = 26;
//Settin Motor B
int enable2Pin = 32;
int motor2Pin3 = 25;
int motor2Pin4 = 33;
//keys for car movement
#define CMD_STOP 0
#define CMD_FORWARD 1
#define CMD_BACKWARD 2
#define CMD_LEFT 4
#define CMD_RIGHT 8
// define pins for flame sensor
#define FlamePinForawrdAnlog 4
#define FlamePinRight 15
#define FlamePinLeft 18
// define pins for gas sensor
#define GasSensorDi 17
// pin 12 that connects to the relay to control the pump
#define RELAY_PIN 12
//pins for siren led and buzzer
//siren
#define LedBlue 2
#define LedRed 21
#define Buzzer 19
//vars for falme sensor read front analog rest is digital
int FlameCheckForawrdAnalog;
int FlameCheckRight;
int FlameCheckLeft;
//vars for gas sensor read
int GasSensorD;
int three60forward = 0;//var for 360 turn
//time vars for front sensor
const unsigned long eventFrontSensorInterval = 200;
unsigned long previouseventFrontSensor = 0;
//time vars for front sensor trigger and movement forward
const unsigned long eventCarMovementInterval = 200;
unsigned long previouseventCarMovement = 0;
//time vars for front sensor trigger and movment left and right
const unsigned long eventCarSideMovementInterval = 200;
unsigned long previouseventCarSideMovement = 0;
//time vars for siren
const unsigned long eventSirenInterval = 500;
unsigned long previousEventSiren = 0;
//var for movement forward on the gas condition
const unsigned long eventCarMovementGasInterval = 2500;
unsigned long previouseventGasCarMovement = 0;
const char* ssid = "Galaxy A52s 5GA0A0"; // wifi name
const char* password = "zmuz6970"; // wifi password
AsyncWebServer server(80);
WebSocketsServer webSocket = WebSocketsServer(81); // WebSocket server on port 81
void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED:
{
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]);
}
break;
case WStype_TEXT:
//Serial.printf("[%u] Received text: %s\n", num, payload);
String angle = String((char*)payload);
int command = angle.toInt();
Serial.print("command: ");
Serial.println(command);
delay(200);
int CurrentDistance = DistanceMeasure();
delay(200);
switch (command) {
case CMD_STOP:
Serial.println("Stop");
StopCar();
break;
case CMD_FORWARD:
{
CurrentDistance = DistanceMeasure();
if(CurrentDistance >= 20){//movement forward if no obstacle ahead
Serial.println("Move Forward");
CAR_moveForwardWifi();
}
else
{ Serial.println("obstacle ahead");
obstacleAvoid();}
}
break;
case CMD_BACKWARD:
{
CurrentDistance = DistanceMeasure();
Serial.println("Move Backward");
CAR_moveBackwardWifi();
if(CurrentDistance < 20)
{obstacleAvoid();}
}
break;
case CMD_LEFT:
{
CurrentDistance = DistanceMeasure();
Serial.println("Turn Left");
CAR_turnLeftWifi();
if(CurrentDistance < 20)
{obstacleAvoid();}
}
break;
case CMD_RIGHT:
{
CurrentDistance = DistanceMeasure();
Serial.println("Turn Right");
CAR_turnRightWifi();
}
break;
default:
{
Serial.println("Unknown command");
}
}
break;
}
}
void setup() {
//modding motor A
pinMode(enable1Pin, OUTPUT);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
//modding Motor B
pinMode(enable2Pin, OUTPUT);
pinMode(motor2Pin3, OUTPUT);
pinMode(motor2Pin4, OUTPUT);
//setting flame sensor as input
//pinMode(FlamePinForawrd, INPUT);
pinMode(FlamePinForawrdAnlog, INPUT);
pinMode(FlamePinRight, INPUT);
pinMode(FlamePinLeft, INPUT);
//setting gas sensor as input
pinMode(GasSensorDi,INPUT);
// configure relay pin 12 as an oytput
pinMode(RELAY_PIN, OUTPUT);
//setting siren for right
pinMode(LedBlue, OUTPUT); //defined port for right leds
pinMode(LedRed, OUTPUT);
pinMode(Buzzer, OUTPUT); // port front buzzer
servo.attach(SERVO_PIN); // attaches the servo on pin 12 to the servo objectư
pinMode(trigger_pin,OUTPUT); // attaches the trigger pin to 5 pin
pinMode(echo_pin,INPUT); // attaches echo pin to 18 pin
// initaite serial monitor
Serial.begin(9600);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Initialize WebSocket server
webSocket.begin();
webSocket.onEvent(webSocketEvent);
// Serve a basic HTML page with JavaScript to create the WebSocket connection
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
Serial.println("Web Server: received a web page request");
String html = HTML_CONTENT; // Use the HTML content from the servo_html.h file
request->send(200, "text/html", html);
});
server.begin();
Serial.print("ESP32 Web Server's IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
webSocket.loop();
unsigned long currentTime = millis();
//vars for storing flame sensor vlaues
FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
Serial.println(FlameCheckForawrdAnalog);
FlameCheckRight = digitalRead(FlamePinRight);
FlameCheckLeft = digitalRead(FlamePinLeft);
//vars for storing gas sensor vlaues
GasSensorD=digitalRead(GasSensorDi);
// taking intial distance value
int CurrentDistance = DistanceMeasure();
// firefighting routine
if (FlameCheckForawrdAnalog <= 4090 && FlameCheckForawrdAnalog >= 500)
{
if(currentTime - previouseventCarMovement >= eventCarMovementInterval) {
Serial.println("flame dected a head");
FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
Serial.println(FlameCheckForawrdAnalog);
CAR_moveForwardWifi();
previouseventCarMovement = currentTime;
}
if(currentTime - previousEventSiren >= eventSirenInterval){
// siren on
Serial.println("sirens on");
//sirenOn(LedBlue, LedRed, Buzzer);
previousEventSiren = currentTime;
}
}
else if(FlameCheckRight == LOW && !FlameCheckForawrdAnalog < 4000 )
{
if(currentTime - previouseventCarSideMovement >= eventCarSideMovementInterval){
Serial.println("flame dected on the right");
Serial.println("turning right");
CAR_turnRightWifi();
Serial.println("siren on");
//sirenOn(LedBlue,LedRed, Buzzer);
previouseventCarSideMovement = currentTime;
}
}
else if(FlameCheckLeft == LOW && !FlameCheckForawrdAnalog < 4000 )
{
if(currentTime - previouseventCarSideMovement >= eventCarSideMovementInterval){
Serial.println("flame dected on the left");
Serial.println("turning left");
CAR_turnLeftWifi();
Serial.println("siren on");
//sirenOn(LedBlue,LedRed, Buzzer);
previouseventCarSideMovement = currentTime;
}
}
else if(GasSensorD == LOW && !FlameCheckForawrdAnalog < 4000){
if(currentTime - previousEventSiren >= eventSirenInterval){
// siren on
Serial.println("sirens on");
//sirenOn(LedBlue, LedRed, Buzzer);
previousEventSiren = currentTime;}
if(three60forward < 20){
Serial.println("gas dected ,looking around for fire");
Serial.println("turning right");
Serial.println(three60forward);
CAR_turnRightWifi();
three60forward++;}
else{
CurrentDistance = DistanceMeasure();
if(CurrentDistance < 20){//check if no obstacle ahead
Serial.println("obstacle ahead");
obstacleAvoid();}
{Serial.println("move forawrd");
CAR_moveForwardWifi();
delay(1000);}
three60forward = 0;}
}
else if(FlameCheckForawrdAnalog < 500 ){//turn pump while in front sensor triggred
StopCar();
Serial.println("pump on");
digitalWrite(RELAY_PIN, HIGH);
CurrentDistance = DistanceMeasure();
if(CurrentDistance < 20){//check if no obstacle ahead
Serial.println("obstacle ahead");
obstacleAvoid();
}
}
else
{Serial.println("pump off");
digitalWrite(RELAY_PIN, LOW);
Serial.println("sirens off");
sirenoff(LedBlue, LedRed, Buzzer);
StopCar();}
}
//functions for car movement
void CAR_moveForwardWifi() {
Serial.println("MoveForward");
//Set speed motor A and B
analogWrite(enable1Pin,195);
analogWrite(enable2Pin,200);
//move forawrd
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor2Pin3, HIGH);
digitalWrite(motor2Pin4, LOW);
}
void CAR_moveBackwardWifi() {
Serial.println("MoveBackward");
//setting speed motor A and B
analogWrite(enable1Pin,186);
analogWrite(enable2Pin,200);
//back movement
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin3, LOW);
digitalWrite(motor2Pin4, HIGH);
}
void CAR_turnLeftWifi() {
Serial.println("turn left");
//Set speed motor A and B
analogWrite(enable1Pin,178);
analogWrite(enable2Pin,195);
//turn left
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor2Pin3, LOW);
digitalWrite(motor2Pin4, LOW);
}
void CAR_turnRightWifi() {
Serial.println("turn right");
//Set speed motor A and B
analogWrite(enable1Pin,255);
analogWrite(enable2Pin,255);
//turn right
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin3, HIGH);
digitalWrite(motor2Pin4, LOW);
}
// stop car
void StopCar(){
Serial.println("StopCar");
analogWrite(enable1Pin,0);
analogWrite(enable2Pin,0);
digitalWrite(motor1Pin1,LOW);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin3,LOW);
digitalWrite(motor2Pin4, LOW);
delay(700);
}
//servo seek clear path funcs
//getting distance from hc-sr04
//sro4 calc distance
int DistanceMeasure(){
long t; //var time to calculate distance
float distance; //var to store diatnce
//setting hc-sro4
digitalWrite(trigger_pin,LOW);
delayMicroseconds(5);
digitalWrite(trigger_pin,HIGH);
delayMicroseconds(100);
digitalWrite(trigger_pin,LOW);
//time to singanl get back
t = pulseIn(echo_pin, HIGH);
//calculation of distance
distance = (t*0.034)/2;
Serial.print("Distance (cm): ");
Serial.print(distance);
Serial.print(" Duration (us): ");
Serial.println(t);
return distance;
}
//servo turn left
int ServoLookLeft(){
Serial.println("ServoLookLeft");
int distanceLeft = 0;
delay(500);
servo.write(180); //lefting servo and taking value
delay(2000);
distanceLeft = DistanceMeasure();
return distanceLeft;
}
//servo turn right
int ServoLookRight(){
Serial.println("ServoLookRight");
int ditanceRight = 0;
delay(500);
servo.write(0); //lefting servo and taking value
delay(2000);
ditanceRight = DistanceMeasure();
servo.write(90);
return ditanceRight;
}
//avoid obastacle protocol
void obstacleAvoid(){
//setting var for left and right distances
int CalculatedDistanceLeft = 0;
int CalculatedDistanceRight = 0;
//car will stop
StopCar();
delay(200);
//car backwards
CAR_moveBackwardWifi();
delay(200);
//car will stop
StopCar();
//left distance calc
CalculatedDistanceLeft = ServoLookLeft();
delay(200);
//right distance calc
CalculatedDistanceRight = ServoLookRight(); //right distance calc
delay(200);
//calcauting shortest distance
if(CalculatedDistanceRight <= CalculatedDistanceLeft)
{CAR_turnLeftWifi();
delay(500);}
else
{CAR_turnRightWifi();
delay(500);}
}
//functions for siren
void sirenOn(int Led1Pin, int Led2Pin,int BuzzerPin)
{
int i;
for (int i = 700; i < 800; i++) // duration of the first sound 350 2 millisecond cycles.
{
tone(BuzzerPin,i);
delay(15);
digitalWrite(Led1Pin, HIGH); // turn on the leds
digitalWrite(Led2Pin, LOW);
delay(30);
digitalWrite(Led1Pin, LOW); // blinking leds
digitalWrite(Led2Pin, HIGH);
delay(30);
delay(15); // wait 1 millisecond and restart from the for statement (100 repetitions)
}
for(i=800;i>700;i--){
tone(BuzzerPin,i);
delay(15);
digitalWrite(Led1Pin, HIGH); // turn on the leds
digitalWrite(Led2Pin, LOW);
delay(30);
digitalWrite(Led1Pin, LOW); // blinking leds
digitalWrite(Led2Pin, HIGH);
delay(30);
delay(15); // wait 1 millisecond and restart from the for statement (100 repetitions)
}
}
void sirenoff(int Led1Pin, int Led2Pin,int BuzzerPin)
{
digitalWrite(Led1Pin, LOW); // turn off blinking leds
digitalWrite(Led2Pin, LOW);
tone(BuzzerPin,0); // turn off buzzer
}
the web loop is wifi controlled car. with obstacle avoidance.
next in the loop is is the fire fighting part.
when the front sensor triggers ,the car will move forward up to a safe distance from the
fire the water pump will turn on.
what happens
Connecting to WiFi...
Connecting to WiFi...
Connecting to WiFi...
Connecting to WiFi...
Connecting to WiFi...
Connected to WiFi
ESP32 Web Server's IP address: 192.168.83.7
0
Distance (cm): 51.54 Duration (us): 3032
StopCar
pump on
the code jump right into the condition
else if(FlameCheckForawrdAnalog < 500 ){//turn pump while in front sensor triggred
StopCar();
Serial.println("pump on");
digitalWrite(RELAY_PIN, HIGH);
CurrentDistance = DistanceMeasure();
if(CurrentDistance < 20){//check if no obstacle ahead
Serial.println("obstacle ahead");
obstacleAvoid();
}
}
instead of moving into goes right into turn on the pump.
when i try the code without the wifi element
// Setting Motor A
int enable1Pin = 14;
int motor1Pin1 = 27;
int motor1Pin2 = 26;
//Settin Motor B
int enable2Pin = 32;
int motor2Pin3 = 25;
int motor2Pin4 = 33;
// define pins for flame sensor
//#define FlamePinForawrd 17
#define FlamePinForawrdAnlog 4
#define FlamePinRight 15
//#define FlamePinLeft
// define pins for gas sensor
#define GasSensorDi 17
// pin 12 that connects to the relay to control the pump
#define RELAY_PIN 12
//pins for siren led and buzzer
//siren
#define LedBlue 2
#define LedRed 21
#define Buzzer 19
//vars for falme sensor read
int FlameCheckForawrdAnalog;
int FlameCheckRight;
//vars for gas sensor read
int GasSensorD;
int three60forward = 0;//var for 360 turn
//time vars for front sensor
const unsigned long eventFrontSensorInterval = 200;
unsigned long previouseventFrontSensor = 0;
//time vars for front sensor trigger and movement forward
const unsigned long eventCarMovementInterval = 200;
unsigned long previouseventCarMovement = 0;
//time vars for front sensor trigger and movment left and right
const unsigned long eventCarSideMovementInterval = 200;
unsigned long previouseventCarSideMovement = 0;
//time vars for siren
const unsigned long eventSirenInterval = 500;
unsigned long previousEventSiren = 0;
//time vars for water pump
const unsigned long eventPumpInterval = 500;
unsigned long previousEventPump = 0;
//var for movement forward on the gas condition
const unsigned long eventCarMovementGasInterval = 2500;
unsigned long previouseventGasCarMovement = 0;
void setup() {
//modding motor A
pinMode(enable1Pin, OUTPUT);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
//modding Motor B
pinMode(enable2Pin, OUTPUT);
pinMode(motor2Pin3, OUTPUT);
pinMode(motor2Pin4, OUTPUT);
//setting flame sensor as input
//pinMode(FlamePinForawrd, INPUT);
pinMode(FlamePinForawrdAnlog, INPUT);
pinMode(FlamePinRight, INPUT);
//pinMode(FlamePinLeft, INPUT);
//setting gas sensor as input
pinMode(GasSensorDi,INPUT);
// configure relay pin 12 as an oytput
pinMode(RELAY_PIN, OUTPUT);
//setting siren for right
pinMode(LedBlue, OUTPUT); //defined port for right leds
pinMode(LedRed, OUTPUT);
pinMode(Buzzer, OUTPUT); // port front buzzer
// initaite serial monitor
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
//vars for storing flame sensor vlaues
// if(currentTime - previouseventFrontSensor >= eventFrontSensorInterval) {
// FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
// Serial.println(FlameCheckForawrdAnalog);
// previouseventFrontSensor = currentTime;
// }
FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
Serial.println(FlameCheckForawrdAnalog);
FlameCheckRight = digitalRead(FlamePinRight);
//vars for storing gas sensor vlaues
GasSensorD=digitalRead(GasSensorDi);
///sensorTest();
if (FlameCheckForawrdAnalog <= 4090 && FlameCheckForawrdAnalog >= 500)
{
if(currentTime - previouseventCarMovement >= eventCarMovementInterval) {
Serial.println("flame dected a head");
//FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
Serial.println(FlameCheckForawrdAnalog);
CAR_moveForwardWifi();
previouseventCarMovement = currentTime;
}
if(currentTime - previousEventSiren >= eventSirenInterval){
// siren on
Serial.println("sirens on");
//sirenOn(LedBlue, LedRed, Buzzer);
previousEventSiren = currentTime;
}
}
else if(FlameCheckRight == LOW && !FlameCheckForawrdAnalog < 4000 )
{
if(currentTime - previouseventCarSideMovement >= eventCarSideMovementInterval){
Serial.println("flame dected on the right");
Serial.println("turning right");
CAR_turnRightWifi();
Serial.println("siren on");
//sirenOn(LedBlue,LedRed, Buzzer);
previouseventCarSideMovement = currentTime;
}
}
//else if (FlameCheckLeft == LOW)
//{
//Serial.println("flame dected on the left");
//while(FlameCheckForawrd != LOW)
//{
//FlameCheckForawrd = digitalRead(FlamePinForawrd);
//Serial.println("turning left");
//CAR_turnLeftWifi();
//delay(200);
//}
//}
else if(GasSensorD == LOW && !FlameCheckForawrdAnalog < 4000){
if(currentTime - previousEventSiren >= eventSirenInterval){
// siren on
Serial.println("sirens on");
//sirenOn(LedBlue, LedRed, Buzzer);
previousEventSiren = currentTime;}
if(three60forward < 20){
Serial.println("gas dected ,looking around for fire");
Serial.println("turning right");
Serial.println(three60forward);
CAR_turnRightWifi();
three60forward++;}
else{
{Serial.println("move forawrd");
CAR_moveForwardWifi();
delay(1000);}
three60forward = 0;}
}
else if(FlameCheckForawrdAnalog < 500 ){//turn pump while in front sensor triggred
StopCar();
Serial.println("pump on");
digitalWrite(RELAY_PIN, HIGH);
}
else
{Serial.println("pump off");
digitalWrite(RELAY_PIN, LOW);
Serial.println("sirens off");
sirenoff(LedBlue, LedRed, Buzzer);
StopCar();}
}
// stop car
void StopCar(){
Serial.println("StopCar");
analogWrite(enable1Pin,0);
analogWrite(enable2Pin,0);
digitalWrite(motor1Pin1,LOW);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin3,LOW);
digitalWrite(motor2Pin4, LOW);
}
void CAR_moveForwardWifi() {
//Set speed motor A and B
analogWrite(enable1Pin,200);
analogWrite(enable2Pin,185);
//move forawrd
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor2Pin3, HIGH);
digitalWrite(motor2Pin4, LOW);
}
void CAR_moveBackwardWifi() {
//setting speed motor A and B
analogWrite(enable1Pin,190);
analogWrite(enable2Pin,200);
//back movement
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin3, LOW);
digitalWrite(motor2Pin4, HIGH);
}
void CAR_turnLeftWifi() {
//Set speed motor A and B
analogWrite(enable1Pin,255);
analogWrite(enable2Pin,0);
//turn left
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
digitalWrite(motor2Pin3, LOW);
digitalWrite(motor2Pin4, LOW);
}
void CAR_turnRightWifi() {
//Set speed motor A and B
analogWrite(enable1Pin,255);
analogWrite(enable2Pin,255);
//turn right
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin3, HIGH);
digitalWrite(motor2Pin4, LOW);
}
void sensorTest() {
while (1) {
for (int i = 0; i < 3; i++) {
Serial.print(digitalRead(i + 15)); // read "flame" sensors
}
Serial.println(); // print the sensor state
delay(250);
}
}
//functions for siren
void sirenOn(int Led1Pin, int Led2Pin,int BuzzerPin)
{
int i;
for (int i = 700; i < 800; i++) // duration of the first sound 350 2 millisecond cycles.
{
tone(BuzzerPin,i);
delay(15);
digitalWrite(Led1Pin, HIGH); // turn on the leds
digitalWrite(Led2Pin, LOW);
delay(30);
digitalWrite(Led1Pin, LOW); // blinking leds
digitalWrite(Led2Pin, HIGH);
delay(30);
delay(15); // wait 1 millisecond and restart from the for statement (100 repetitions)
}
for(i=800;i>700;i--){
tone(BuzzerPin,i);
delay(15);
digitalWrite(Led1Pin, HIGH); // turn on the leds
digitalWrite(Led2Pin, LOW);
delay(30);
digitalWrite(Led1Pin, LOW); // blinking leds
digitalWrite(Led2Pin, HIGH);
delay(30);
delay(15); // wait 1 millisecond and restart from the for statement (100 repetitions)
}
}
void sirenoff(int Led1Pin, int Led2Pin,int BuzzerPin)
{
digitalWrite(Led1Pin, LOW); // turn off blinking leds
digitalWrite(Led2Pin, LOW);
tone(BuzzerPin,0); // turn off buzzer
}
the car move forward just fine.