#include <IRremote.h>
 int pin11=6;//定义I1接口
int pin12=9;//定义I2接口
int speedpin1=12;//定义EA(PWM调速)接口
int pin21=11;//定义I3接口
int pin22=10;//定义I4接口
int speedpin2=13;//定义EB(PWM调速)接口
int linepin=14;//定义传感器输入引脚
int RECV_PIN = 2;     //红外接收信号引脚
int val=LOW;

 //红外遥控逻辑代码 
#define ADVAN 0x40BFB04F   //我的遥控器2键
#define LEF 0x40BF08F7    //我的遥控器4键
#define BAC 0x40BFA857   //我的遥控器8键
#define RIG 0x40BF48B7    //我的遥控器6键
#define STO 0x40FF629D    //我的遥控器5键
#define INC 0x40BF30CF   //我的遥控器1键
#define DECR 0x40BF708F   //我的遥控器3键

IRrecv irrecv(RECV_PIN);//初始化
decode_results results;//定义结构体类型

void setup()
 {
   pinMode(pin11,OUTPUT);//定义该接口为接口为输出接口
  pinMode(pin12,OUTPUT);
   pinMode(speedpin1,OUTPUT);
   pinMode(pin21,OUTPUT);//定义该接口为接口为输出接口
  pinMode(pin22,OUTPUT);
   pinMode(speedpin2,OUTPUT); 
   pinMode(linepin,INPUT);
   Serial.begin(9600);
   irrecv.enableIRIn(); // 开始接收
}

void loop() {
   if (irrecv.decode(&results))
   {
      Serial.println(results.value, HEX);
     switch(results.value)
     {
     case ADVAN://2键前进
      advance(100);
       break;
     case LEF://4键左转
      turnleft(100);
       break;
     case BAC://8键后退
      backup(100);
       break;
     case RIG://6键右转
      turnright(100);
       break;
     case STO://5键前进
      stopa();
       break;
     case INC://1键加速 
      increase(100);
       break;
     case DECR://3键减速
      decrease(100);
       break;          
     default:
       delay(600);
     }
     irrecv.resume(); // Receive the next value
   }
   delay(600);
   val=digitalRead(linepin);
   if(val==HIGH)      
   {        
     backup(100);
     delay(2000);    
     turnright(100); 
     delay(2000);    
   }
 }

 void advance(int a)//前进
{     
   analogWrite(speedpin1,a);//输入模拟值进行设定速度     
   analogWrite(speedpin2,a);  
   digitalWrite(pin11,LOW);//使直流电机（左）顺时针转     
   digitalWrite(pin12,HIGH);  
   digitalWrite(pin22,LOW);//使直流电机（右）逆时针转     
   digitalWrite(pin21,HIGH);     
 }
 void backup(int b)//后退
{     
   analogWrite(speedpin1,b);//输入模拟值进行设定速度
  analogWrite(speedpin2,b);   
   digitalWrite(pin11,HIGH);//使直流电机（左）逆时针转
  digitalWrite(pin12,LOW);  
   digitalWrite(pin22,HIGH);//使直流电机（右）顺时针转     
   digitalWrite(pin21,LOW);     
   delay(600);
 }

 void turnleft(int c)//左转
{     
   analogWrite(speedpin1,c);//输入模拟值进行设定速度     
   analogWrite(speedpin2,c); 
   digitalWrite(pin11,HIGH);//使直流电机（左）逆时针转     
   digitalWrite(pin12,LOW);  
   digitalWrite(pin22,LOW);//使直流电机（右）逆时针转    
   digitalWrite(pin21,HIGH);    
   delay(600);
 }
 void turnright(int d)//右转
{     
   analogWrite(speedpin1,d);//输入模拟值进行设定速度     
   analogWrite(speedpin2,d);  
   digitalWrite(pin11,LOW);//使直流电机（左）顺时针转     
   digitalWrite(pin12,HIGH);  
   digitalWrite(pin22,HIGH);//使直流电机（右）顺时针转     
   digitalWrite(pin21,LOW);     
   delay(600);
 }
 void stopa()//停止
{    
    digitalWrite(pin11,HIGH);//使直流电机（左）制动  
   digitalWrite(pin12,HIGH); 
   digitalWrite(pin22,HIGH);//使直流电机（右）制动 
  digitalWrite(pin21,HIGH);    
   delay(600);
 }
 void increase(int e)//加速
{
   if(e<=225) //最大速度为225
   {
     e=e+10;
     analogWrite(speedpin1,e); //将a 的值赋给speedin1
     analogWrite(speedpin2,e); //将a 的值赋给speedin2
     delay(1000); //延时1 秒
  }
   else {
     analogWrite(speedpin1,225); //将a 的值赋给speedin1
     analogWrite(speedpin2,225); //将a 的值赋给speedin2 
     delay(1000);  
   }
 }
 void decrease(int f)//减速
{
   if(f>=0) //最小速度为0
   {
     f=f-10;
     analogWrite(speedpin1,f); //将a 的值赋给speedin1
     analogWrite(speedpin2,f); //将a 的值赋给speedin2
     delay(1000); //延时1 秒
  }
   else {
     analogWrite(speedpin1,0); //将a 的值赋给speedin1
     analogWrite(speedpin2,0); //将a 的值赋给speedin2    
     delay(1000);
   }
 }
