#include <ESP32Servo.h>
Servo servo;  // create servo object to control a servo
#define trigger_pin 5
#define echo_pin 18
#define SERVO_PIN 19 //steering servo pin 
// #define SERVO_PIN 12 //seeting servo pin
// Setting Motor A
int enable1Pin = 14;
int motor1Pin1 = 27;
int motor1Pin2 = 26;
//Settin Motor B
int enable2Pin = 32;
int motor2Pin3 = 25;
int motor2Pin4 = 33;
// Setting PWM properties
const int frequency = 3000;
const int pwm_channel = 0;
const int resolution = 8;
long t;    //var time to calculate distance
int distance; //var to store diatnce
void setup() {
  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
  //modding motor A
  pinMode(enable1Pin, OUTPUT);
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  //modding Motor B
  pinMode(enable2Pin, OUTPUT);
  pinMode(motor2Pin3, OUTPUT);
  pinMode(motor2Pin4, OUTPUT);
  // configure LEDC PWM
  ledcAttachChannel(enable1Pin, frequency, resolution, pwm_channel);
  ledcAttachChannel(enable2Pin, frequency, resolution, pwm_channel);
}
void loop() {
  //setting hc-sro4
  digitalWrite(trigger_pin, LOW);
  delay(5);
  digitalWrite(trigger_pin, HIGH);
  delay(10);
  digitalWrite(trigger_pin, LOW);
  //getting distance from hc-sr04
  t = pulseIn(echo_pin, HIGH);
  distance = (t * 0.034) / 2;
  //default moving forward
  MoveForward();
  delay(200);
  //centering servo
  servo.write(90);
  delay(500);
  if (distance < 20) {
    int distanceLeft = 0; //setting var for left and right
    int distanceRight = 0;
    delay(200);
    distanceLeft = ServoLookLeft(distance);
    delay(200);
    distanceRight = ServoLookRight(distance);
    delay(200);
    StopCar();
    delay(200);
    MoveBackward();
    delay(200);
    StopCar();
    delay(200);
    //calcauting shortest distance
    if (distanceRight <= distanceLeft) {
      TurnLeft();
    }
    else {
      TurnRight();
    }
  }
}
//servo seek clear path
//servo turn left
int ServoLookLeft(int distance) {
  int ditanceLeft = 0;
  delay(500);
  servo.write(180); //lefting servo and taking value
  delay(2000);
  return distance;
}
//servo turn right
int ServoLookRight(int distance) {
  int ditanceRight = 0;
  delay(500);
  servo.write(0); //lefting servo and taking value
  delay(2000);
  return distance;
}
int SeekClearPath() {
  int ditanceRight = 0;
  int ditanceLeft = 0;
  delay(500);
  servo.write(0); //righting servo
  delay(2000);
  ditanceRight = distance;
  servo.write(180); //lefting servo
  delay(2000);
  ditanceLeft = distance;
  //lcd.clear();
  //centering  servo back
  servo.write(90);
  delay(1000);
}
//car movement functions
//move forward
void MoveForward() {
  //Set speed motor A and B
  analogWrite(enable1Pin, 255);
  analogWrite(enable2Pin, 255);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin3, HIGH);
  digitalWrite(motor2Pin4, LOW);
  //lcd.clear();
}
//move backward
void MoveBackward() {
  analogWrite(enable1Pin, 255);
  analogWrite(enable2Pin, 255);
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, HIGH);
  digitalWrite(motor2Pin4, LOW);
  //lcd.clear();
  delay(700);
}
//turn car left
void TurnLeft() {
  //Set speed motor A and B
  analogWrite(enable1Pin, 255);
  analogWrite(enable2Pin, 255);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, LOW);
  //lcd.clear();
  delay(850);
  //Stop motor for half second
  analogWrite(enable1Pin, 0);
  analogWrite(enable2Pin, 0);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, LOW);
  delay(500);
}
//turn car  right
void TurnRight() {
  //turn right
  analogWrite(enable1Pin, 255);
  analogWrite(enable2Pin, 255);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, HIGH);
  //lcd.clear();
  delay(850);
  //Stop motor for half second
  analogWrite(enable1Pin, 0);
  analogWrite(enable2Pin, 0);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, LOW);
  delay(500);
}
// stop car
void StopCar() {
  analogWrite(enable1Pin, 0);
  analogWrite(enable2Pin, 0);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, LOW);
  delay(700);
}
REV
FWD
REV
FWD
EN2
EN1
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
MOTORS: HIGH POWER
DEVICES: LOW POWER
COMMON GROUND