#include <IRremote.h>
#include <boarddefs.h>
#include <NewPing.h>
enum {Idle,MovingForward,Turnleft,Turnright,Turn,AM_Backward,Backward,rest,AM_MovingForward};
int currentState = Idle;
int RECV_PIN = A4;
int VOID = LOW;
IRrecv irrecv(RECV_PIN);
decode_results results;
#define BUTTON_front 0xEFA25D
#define BUTTON_back 0xEFB24D
#define BUTTON_left 0xEF50AF
#define BUTTON_right 0xEF12ED
#define BUTTON_speedup 0xEFE817
#define BUTTON_speeddown 0xEF6897
#define ControlMotorLeft1 A0
#define ControlMotorLeft2 A1
#define ControlMotorRight1 A2
#define ControlMotorRight2 A3
#define TheLED 7
#define IRS 6
#define PushButtonON 5
#define PushButtonOFF 4
#define PushButtonAUTO 3
#define Controller A4
#define TRIGGER_PIN A5
#define ECHO_PIN A5
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
//Control Motor Left
pinMode(ControlMotorLeft1, OUTPUT);
pinMode(ControlMotorLeft2, OUTPUT);
//Control Motor Right
pinMode(ControlMotorRight1, OUTPUT);
pinMode(ControlMotorRight2, OUTPUT);
//LED
pinMode(TheLED,OUTPUT);
//R1 sensor
pinMode(IRS,INPUT);
//button(ON)
pinMode(PushButtonON,INPUT_PULLUP);
//button(OFF)
pinMode(PushButtonOFF,INPUT_PULLUP);
//button(auto)
pinMode(PushButtonAUTO,INPUT_PULLUP);
//controller
irrecv.enableIRIn();
}
void AllOff(){
digitalWrite(ControlMotorLeft1,LOW);
digitalWrite(ControlMotorLeft2,LOW);
digitalWrite(ControlMotorRight1,LOW);
digitalWrite(ControlMotorRight2,LOW);
digitalWrite(TheLED,LOW);
}
void loop() {
switch(currentState)
{
case Idle:{
Serial.println("Idle");
AllOff();
if(!digitalRead(PushButtonON))
currentState = rest;
if(!digitalRead(PushButtonAUTO))
currentState = AM_MovingForward;
break;
}
case rest:{
Serial.println("Rest");
digitalWrite(ControlMotorLeft1,LOW);
digitalWrite(ControlMotorLeft2,LOW);
digitalWrite(ControlMotorRight1,LOW);
digitalWrite(ControlMotorRight2,LOW);
digitalWrite(TheLED,HIGH);
if(!digitalRead(PushButtonOFF))
currentState = Idle;
if(!digitalRead(PushButtonAUTO))
currentState = AM_MovingForward;
if (irrecv.decode(&results)){
if (results.value == BUTTON_front){
currentState = MovingForward;
irrecv.resume();
}
if (results.value == BUTTON_back){
currentState = Backward;
irrecv.resume();
}
if (results.value == BUTTON_right){
currentState = Turnright;
irrecv.resume();
}
if (results.value == BUTTON_left){
currentState = Turnleft;
irrecv.resume();
}
irrecv.resume();
}
break;}
case MovingForward:{
Serial.println("Moving Forward");
analogWrite(ControlMotorLeft1,150);
analogWrite(ControlMotorLeft2,0);
analogWrite(ControlMotorRight1,150);
analogWrite(ControlMotorRight2,0);
digitalWrite(TheLED,HIGH);
VOID = digitalRead(IRS);
if(!digitalRead(PushButtonOFF))
currentState = Idle;
if(!digitalRead(PushButtonAUTO))
currentState = AM_MovingForward;
if (irrecv.decode(&results)){
if (results.value == BUTTON_back){
currentState = Backward;
irrecv.resume();
}
if (results.value == BUTTON_right){
currentState = Turnright;
irrecv.resume();
}
if (results.value == BUTTON_left){
currentState = Turnleft;
irrecv.resume();
}
if (results.value == BUTTON_speedup){
analogWrite(ControlMotorLeft1,250);
analogWrite(ControlMotorRight1,250);
}
irrecv.resume();
if (results.value == BUTTON_speeddown){
digitalWrite(ControlMotorLeft1,100);
analogWrite(ControlMotorRight1,100);
}
}
if (VOID == HIGH){
currentState =Backward ;
}
break;}
case Backward:{
Serial.println("Backward");
digitalWrite(ControlMotorLeft1,LOW);
digitalWrite(ControlMotorLeft2,HIGH);
digitalWrite(ControlMotorRight1,LOW);
digitalWrite(ControlMotorRight2,HIGH);
digitalWrite(TheLED,HIGH);
VOID = digitalRead(IRS);
if(!digitalRead(PushButtonOFF))
currentState = Idle;
if(!digitalRead(PushButtonAUTO))
currentState = AM_MovingForward;
if (irrecv.decode(&results)){
if (results.value == BUTTON_front){
currentState = MovingForward;
irrecv.resume();
}
if (results.value == BUTTON_right){
currentState = Turnright;
irrecv.resume();
}
if (results.value == BUTTON_left){
currentState = Turnleft;
irrecv.resume();
}
irrecv.resume();
}
if (VOID == HIGH){
currentState =MovingForward ;
}
break;}
case Turnleft:{
Serial.println("Turn left");
digitalWrite(ControlMotorLeft1,LOW);
digitalWrite(ControlMotorLeft2,HIGH);
digitalWrite(ControlMotorRight1,HIGH);
digitalWrite(ControlMotorRight2,LOW);
digitalWrite(TheLED,HIGH);
if(!digitalRead(PushButtonOFF))
currentState = Idle;
if(!digitalRead(PushButtonAUTO))
currentState = AM_MovingForward;
if (irrecv.decode(&results)){
if (results.value == BUTTON_front){
currentState = MovingForward;
}
if (results.value == BUTTON_back){
currentState = Backward;
}
if (results.value == BUTTON_right){
currentState = Turnright;
}
irrecv.resume();
}
break;}
case Turnright:{
Serial.println("Rest");
digitalWrite(ControlMotorLeft1,HIGH);
digitalWrite(ControlMotorLeft2,LOW);
digitalWrite(ControlMotorRight1,LOW);
digitalWrite(ControlMotorRight2,HIGH);
digitalWrite(TheLED,HIGH);
if(!digitalRead(PushButtonOFF))
currentState = Idle;
if(!digitalRead(PushButtonAUTO))
currentState = AM_MovingForward;
if (irrecv.decode(&results)){
if (results.value == BUTTON_front){
currentState = MovingForward;
}
if (results.value == BUTTON_back){
currentState = Backward;
}
if (results.value == BUTTON_left){
currentState = Turnleft;
}
irrecv.resume();
}
break;}
case AM_MovingForward:{
Serial.println("Auto Mode");
digitalWrite(ControlMotorLeft1,HIGH);
digitalWrite(ControlMotorLeft2,LOW);
digitalWrite(ControlMotorRight1,HIGH);
digitalWrite(ControlMotorRight2,LOW);
VOID = digitalRead(IRS);
digitalWrite(TheLED,HIGH);
if(!digitalRead(PushButtonOFF))
currentState = Idle;
if (VOID == HIGH){
currentState =AM_Backward ;}
if(sonar.ping_cm()<=8)
currentState =AM_Backward ;
break;}
case AM_Backward:{
Serial.println("Backward");
digitalWrite(ControlMotorLeft1,LOW);
digitalWrite(ControlMotorLeft2,HIGH);
digitalWrite(ControlMotorRight1,LOW);
digitalWrite(ControlMotorRight2,HIGH);
digitalWrite(TheLED,HIGH);
delay(1000);
currentState = Turn;
if(!digitalRead(PushButtonOFF))
currentState = Idle;
break;}
case Turn:{
Serial.println("Turn");
digitalWrite(ControlMotorLeft1,HIGH);
digitalWrite(ControlMotorLeft2,LOW);
digitalWrite(ControlMotorRight1,LOW);
digitalWrite(ControlMotorRight2,HIGH);
digitalWrite(TheLED,HIGH);
delay(1000);
currentState = AM_MovingForward;
if(!digitalRead(PushButtonOFF))
currentState = Idle;
break;}
}
}