/*  Arduino Program for making a ESP32 controlled bluetooth controlled car. 
        This code is written according to the commands of this app, you can install this app only from apkPure:

        App Name: "Bluetooth_RC_Car_Controller By invexsLabs"
        ApkPure Link: https://apkpure.com/bluetooth-rc-car-controller-by-invexslabs-customizable-ui/appinventor.ai_abdgto251.BT_Car_Controller4

        Upload this code to your esp32 and then wire all the conenctions. 

       The car's bluetooth name is "ESP32 BT CAR 2889". You can change it in the void setup.
*/

#include <BluetoothSerial.h>

// Motor control pins
#define backright 13
#define fordright 14
#define fordleft 27
#define backleft 26
#define enleft 25
#define enright 12

// LED pins
#define led 2
#define whiteled 22
#define redled 32
#define horn 23

int rightspeed = 255;     
int leftspeed = 255;

//You can change it if your car turns when driving forward by decreasing the speed of one-side wheel.
const int maxrightspeed = 255;   
const int maxleftspeed = 255;

//This is the minimum speed to which the car sets it's speed at level 1 speed. You can change it according to your car. 
const int minrightspeed = 120;
const int minleftspeed = 120;

int leftadder;
int rightadder;

BluetoothSerial SerialBT;

void setup() {
  // Motor direction pins
  pinMode(fordright, OUTPUT);
  pinMode(fordleft, OUTPUT);
  pinMode(backleft, OUTPUT);
  pinMode(backright, OUTPUT);

  // PWM control pins
  pinMode(enright, OUTPUT);
  pinMode(enleft, OUTPUT);

  // LEDs
  pinMode(led, OUTPUT);
  pinMode(whiteled, OUTPUT);
  pinMode(redled, OUTPUT);
  pinMode(horn, OUTPUT);

  Serial.begin(115200);

  //You can change the bluetooth name of the car here:
  SerialBT.begin("ESP32 BT CAR 2889");

  //Just to show that the car is turned ON:
  for (int i = 0; i < 3; i++) {
    digitalWrite(led, HIGH);
    delay(200);
    digitalWrite(led, LOW);
    delay(200);
  }

  leftadder = (maxleftspeed - minleftspeed) / 9;
  rightadder = (maxrightspeed - minrightspeed) / 9;
}

void handleSpeed(int left, int right) {
  rightspeed = minrightspeed + right;
  leftspeed = minleftspeed + left;
  analogWrite(enright, rightspeed);
  analogWrite(enleft, leftspeed);
}

void loop() {
  if (SerialBT.available()) {
    char store = SerialBT.read();
    Serial.print(store);

    switch (store) {
      case 'F':  // Forward
        digitalWrite(fordright, HIGH);
        digitalWrite(fordleft, HIGH);
        digitalWrite(backleft, LOW);
        digitalWrite(backright, LOW);
        digitalWrite(led, HIGH);
        break;

      case 'B':  // Backward
        digitalWrite(fordright, LOW);
        digitalWrite(fordleft, LOW);
        digitalWrite(backleft, HIGH);
        digitalWrite(backright, HIGH);
        digitalWrite(led, HIGH);
        break;

      case 'R':  // Right
        digitalWrite(fordright, LOW);
        digitalWrite(fordleft, HIGH);
        digitalWrite(backleft, LOW);
        digitalWrite(backright, HIGH);
        digitalWrite(led, HIGH);
        break;

      case 'L':  // Left
        digitalWrite(fordright, HIGH);
        digitalWrite(fordleft, LOW);
        digitalWrite(backleft, HIGH);
        digitalWrite(backright, LOW);
        digitalWrite(led, HIGH);
        break;

      case 'C':  // Forward Left
        digitalWrite(fordright, HIGH);
        digitalWrite(fordleft, LOW);
        digitalWrite(backleft, LOW);
        digitalWrite(backright, LOW);
        digitalWrite(led, HIGH);
        break;

      case 'D':  // Forward Right
        digitalWrite(fordright, LOW);
        digitalWrite(fordleft, HIGH);
        digitalWrite(backleft, LOW);
        digitalWrite(backright, LOW);
        digitalWrite(led, HIGH);
        break;

      case 'E':  // Backward Left
        digitalWrite(fordright, LOW);
        digitalWrite(fordleft, LOW);
        digitalWrite(backleft, LOW);
        digitalWrite(backright, HIGH);
        digitalWrite(led, HIGH);
        break;

      case 'G':  // Backward Right
        digitalWrite(fordright, LOW);
        digitalWrite(fordleft, LOW);
        digitalWrite(backleft, HIGH);
        digitalWrite(backright, LOW);
        digitalWrite(led, HIGH);
        break;

      case 'U':  //for headlights
        digitalWrite(whiteled, HIGH);
        break;
      case 'u':
        digitalWrite(whiteled, LOW);
        break;

      case 'W':    //for backlights
        analogWrite(redled, 25);
        break;
      case 'w':
        analogWrite(redled, 0);
        break;

      case 'H':    //for horn
        tone(horn, 400);
        break;
      case 'h':
        noTone(horn);
        break;

      case '0':    //for adjusting speeds
        handleSpeed(0 - minrightspeed, -minleftspeed);
        break;
      case '1':
        handleSpeed(0, 0);
        break;
      case '2':
        handleSpeed(rightadder, leftadder);
        break;
      case '3':
        handleSpeed((2 * rightadder), (2 * leftadder));
        break;
      case '4':
        handleSpeed((3 * rightadder), (3 * leftadder));
        break;
      case '5':
        handleSpeed((4 * rightadder), (4 * leftadder));
        break;
      case '6':
        handleSpeed((5 * rightadder), (5 * leftadder));
        break;
      case '7':
        handleSpeed((6 * rightadder), (6 * leftadder));
        break;
      case '8':
        handleSpeed((7 * rightadder), (7 * leftadder));
        break;
      case '9':
        handleSpeed((8 * rightadder), (8 * leftadder));
        break;
      case 'q':
        handleSpeed((9 * rightadder), (9 * leftadder));
        break;

      case 'S':  // Stop
        digitalWrite(fordright, LOW);
        digitalWrite(fordleft, LOW);
        digitalWrite(backleft, LOW);
        digitalWrite(backright, LOW);
        digitalWrite(led, LOW);
        break;
    }
  }
}
