#include <IRremote.h>  // sets up the IR Remote

// The following integers are for the two wheel motors
int RECV_PIN = 8;  // receiver pin
int leftForward = 9;  // pin for the left wheel to go forward
int leftBackward = 10;  // pin for left wheel to go backward
int rightForward = 6;  // pin for right wheel to go forward
int rightBackward = 5;  // pin for right wheel to go backward

// The following integers are for the RGB LED
const int Red = 2;  // Red led
const int Green = 3;  // Green led
const int Blue = 4;  // Blue led

// The following values are the codes for the IR Remote buttons
long forward = 0x10EFA05F;  // up arrow
long backward = 0x10EF00FF;  // down arrow
long left = 0x10EF10EF;  // left arrow
long right = 0x10EF807F;  // right arrow
long center = 0x10EF20DF;  // center circle
long A = 0x10EFF807;  // "A" button
long B = 0x10EF7887;  // "B" button
long C = 0x10EF58A7;  //"C" button
long power = 0x10EFD827;  // Power button

IRrecv irrecv(RECV_PIN);
decode_results results;  // decodes the values of the remote codes

void setup()
{
  Serial.begin(9600);  // begins serial port
// The following "pinMode"'s set the wheel pins as outputs
  pinMode(leftForward, OUTPUT);  
  pinMode(rightForward, OUTPUT);
  pinMode(leftBackward, OUTPUT);
  pinMode(rightBackward, OUTPUT);
  
// The following "pinMode"'s set the RGB pins as outputs
  pinMode(Red, OUTPUT);
  pinMode(Green, OUTPUT);
  pinMode(Blue, OUTPUT);
  
  irrecv.enableIRIn(); // Start the receiver
  irrecv.blink13(true); // blink LED on P13 when IR signal is present
}

void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);  // the serial monitor will read the code values when a button is pressed 
    
    if(results.value == power)  // if the "Power" button is pressed:
    {
      delay(100);
      // Both wheels stop spinning:
      digitalWrite(rightBackward, LOW);
      digitalWrite(leftBackward, LOW);
      digitalWrite(leftForward, LOW);
      digitalWrite(rightForward, LOW);
      
      // LED shuts off:
      digitalWrite(Red, LOW);
      digitalWrite(Green, LOW);
      digitalWrite(Blue, LOW);
    }
    if (results.value == forward)  // if the up arrow button is pressed:
    {
      delay(100);
      // Both wheels spin forward:
      digitalWrite(leftForward, HIGH);
      digitalWrite(rightForward, HIGH);
      digitalWrite(rightBackward, LOW);
      digitalWrite(leftBackward, LOW); 
           
      // LED turns GREEN:           
      digitalWrite(Red, LOW);
      digitalWrite(Green, HIGH);
      digitalWrite(Blue, LOW);
    }
    if (results.value == backward)  // if the down arrow is pressed:
    {
      delay(100);
      // Both wheels spin backward:  
      digitalWrite(rightBackward, HIGH);
      digitalWrite(leftBackward, HIGH);
      digitalWrite(leftForward, LOW);
      digitalWrite(rightForward, LOW);
      
      // LED turns Red:      
      digitalWrite(Red, HIGH);
      digitalWrite(Green, LOW);
      digitalWrite(Blue, LOW);
    }
    if (results.value == left)  // if the left arrow is pressed:
    {
      delay(100);
      // Left wheel spins forward:  
      digitalWrite(leftForward, HIGH);
      digitalWrite(leftBackward, LOW);
      digitalWrite(rightForward, LOW);
      digitalWrite(rightBackward, LOW);
      
      // LED turns Blue:      
      digitalWrite(Red, LOW);
      digitalWrite(Green, LOW);
      digitalWrite(Blue, HIGH);
    }
    if (results.value == right)  // if the right arrow is pressed:
    {
      delay(100);
      // Right wheel spins forward:
      digitalWrite(rightForward, HIGH);
      digitalWrite(leftBackward, LOW);
      digitalWrite(leftForward, LOW);
      digitalWrite(rightBackward, LOW);
      
      // LED turns Purple:      
      digitalWrite(Red, HIGH);
      digitalWrite(Green, LOW);
      digitalWrite(Blue, HIGH);
    }
    if (results.value == center)  // if the center circle button is pressed:
    {
      delay(100);
      // Both wheels stop spinning:  
      digitalWrite(rightBackward, LOW);
      digitalWrite(leftBackward, LOW);
      digitalWrite(leftForward, LOW);
      digitalWrite(rightForward, LOW);
      
      // LED turns White:      
      digitalWrite(Red, HIGH);
      digitalWrite(Green, HIGH);
      digitalWrite(Blue, HIGH);
    }
   
  irrecv.resume(); // Receive the next value
  }
}