#include <SoftwareSerial.h>
#define DEBUG true
//#include <Servo.h>
#include <VarSpeedServo.h>
SoftwareSerial esp8266(2,3); // make RX Arduino line is pin 2, make TX Arduino line is pin 3.
VarSpeedServo myservo;
int L298N_IN1 = 5;
int L298N_IN2 = 6;
int speedPinA = 9;
int L298N_IN3 = 7;
int L298N_IN4 = 8;
int speedPinB = 10;
char letter;
int PWMvalue;
int PWMleftright;
unsigned long current;
unsigned long previous;
unsigned long current1;
unsigned long previous1;
boolean PWMmode = false;
//Servo myservo;
//int pos = 0;
void setup() {
pinMode(L298N_IN1,OUTPUT);
pinMode(L298N_IN2,OUTPUT);
pinMode(speedPinA,OUTPUT);
pinMode(L298N_IN3,OUTPUT);
pinMode(L298N_IN4,OUTPUT);
pinMode(speedPinB,OUTPUT);
letter = 'A';
myservo.attach(11);
myservo.write(45);
PWMvalue = 30;
Serial.begin(9600); //for monitoring purposes
esp8266.begin(9600); // your esp's baud rate might be different
sendCommand("AT+RST\r\n",2000,DEBUG); // reset module
sendCommand("AT+CWMODE=1\r\n",1000,DEBUG); // configure as access point
sendCommand("AT+CWJAP=\"ABCDEFG\",\"12345678\"\r\n",3000,DEBUG);
delay(1000);
sendCommand("AT+CIFSR\r\n",1000,DEBUG); // get ip address
sendCommand("AT+CIPMUX=1\r\n",1000,DEBUG); // configure for multiple connections
sendCommand("AT+CIPSERVER=1,6625\r\n",1000,DEBUG); // turn on server on port 80
Serial.println("Server Ready");
}
void loop() {
if(esp8266.available()) {
if(esp8266.find("+IPD,0,")){
delay(10);
esp8266.find(":");
delay(10);
letter = esp8266.read();
Serial.print(letter);//for monitoring purposes
}
}
control(letter);
if(PWMmode == true){
PWMincrease();
Serial.println("PWMmode is ON");
Serial.println(PWMvalue);
}
}///////end of LOOP
void PWMincrease(){
current = millis();
if (current - previous >= 500) {
previous = current;
PWMvalue = PWMvalue + 20;
if(PWMvalue >= 255){
PWMvalue = 255;
}
control(letter);
}
}
void startCar(){
digitalWrite(L298N_IN1, HIGH);
digitalWrite(L298N_IN2, LOW);
digitalWrite(L298N_IN3, LOW);
digitalWrite(L298N_IN4, HIGH);
analogWrite(speedPinA, PWMvalue);
analogWrite(speedPinB, PWMvalue);
Serial.println(PWMvalue);
}
void stopCar(){
digitalWrite(L298N_IN1, LOW);
digitalWrite(L298N_IN2, LOW);
digitalWrite(L298N_IN3, LOW);
digitalWrite(L298N_IN4, LOW);
analogWrite(speedPinA, 0);
analogWrite(speedPinB, 0);
Serial.println(PWMvalue);
}
void leftTurn(){
digitalWrite(L298N_IN1, HIGH);
digitalWrite(L298N_IN2, HIGH);
digitalWrite(L298N_IN3, LOW);
digitalWrite(L298N_IN4, LOW);
analogWrite(speedPinA, 200);
analogWrite(speedPinB, 110); //LEFT
}
void rightTurn(){
digitalWrite(L298N_IN1, LOW);
digitalWrite(L298N_IN2, LOW);
digitalWrite(L298N_IN3, HIGH);
digitalWrite(L298N_IN4, HIGH);
analogWrite(speedPinA, 110);
analogWrite(speedPinB, 200); //RIGHT
}
void reverse(){
digitalWrite(L298N_IN1, LOW);
digitalWrite(L298N_IN2, HIGH);
digitalWrite(L298N_IN3, HIGH);
digitalWrite(L298N_IN4, LOW);
analogWrite(speedPinA, PWMvalue);
analogWrite(speedPinB, PWMvalue);
Serial.println(PWMvalue);
}
void positivetiltcamera(){
myservo.write(45, 15, true);
}
void negativetiltcamera(){
myservo.write(0, 15, true);
}
void control(char cmd) {
switch (cmd) {
case 'Q':
PWMmode = true;
startCar();
break;
case 'W':
PWMmode = false;
stopCar();
PWMvalue = 30;
break;
case 'A':
PWMmode = false;
PWMvalue = 30;
break;
case 'P':
PWMmode = false;
stopCar();
PWMvalue = 30;
break;
case 'J':
PWMmode = false;
leftTurn();
PWMvalue = 30;
break;
case 'H':
PWMmode = false;
rightTurn();
PWMvalue = 30;
break;
case 'Y':
PWMmode = true;
reverse();
break;
case 'L':
positivetiltcamera();
break;
case 'R':
negativetiltcamera();
break;
}
}
String sendCommand(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // send the read character to the esp8266
long int time = millis();
while( (time+timeout) > millis())
{
while(esp8266.available())
{
// The esp has data so display its output to the serial window
char c = esp8266.read(); // read the next character.
response+=c;
}
}
if(debug)
{
Serial.print(response);
}
return response;
}