这个程序比较早的,下面这段是我后面做循环测试用的,
#include <IRremote.h>
/*#include <EEPROM.h>
union data //EEPROM 数据类型 字节拆分 转换
{
long a;
byte b[4];
};
data col;
*/
int RECV_PIN = 9; //红外脚
int Frelay=11; // 继电器控制电机 启/停
int Drelay=12; // 继电器控制电机 正/反转 通过H桥改变电源正/反
unsigned long time1 = 0, time2 = 0 ,time3 = 0 ,time4 = 0;
long num;
long num1; //每100ms 计数
long num2; //每200ms 计数
int count=0; //计数
int Start=0;
int Pause=0;
int Change=0;
int Direction=0;
int a=0;
int n;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
pinMode(Frelay,OUTPUT);
pinMode(Drelay,OUTPUT);
pinMode(2,INPUT_PULLUP);
attachInterrupt(0,Count,CHANGE);
irrecv.enableIRIn();
}
void loop()
{
Infrared(); //红外遥控
SpeedCompare(); //速度比较
MotorLoop();
if(Start==1)
{
Serial.print("count=");
Serial.println(count);
DirectionCompare(); //行程比较控制停止
}
}
void Infrared()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX);
if(results.value==0xB012615A) //正转按钮 A键
{
delay(50);
if(results.value==0xB012615A)
{
a=1;
time4=millis();
}
}
if(results.value==0xB2CC429A) //暂停键 C键
{
delay(50);
if(results.value==0xB2CC429A)
{
if(Pause==0)
{
digitalWrite(Frelay,0);
Start=0;
Pause=1;
}else{
digitalWrite(Frelay,1);
Start=1;
Pause=0;
}
}
}
irrecv.resume();
}
}
void MotorLoop()
{
if(a==1 && Direction==0)
{
if(millis()-time4>1000)
{
digitalWrite(Frelay,1);
delay(6);//继电器延时
Start=1;
a=0;
n++;
}
/*col.a=n;
for(int addr=0 ; addr < 4 ; addr++) //将count写入EEPROM
{
EEPROM.write(addr, col.b[addr]);
delay(3);
}*/
}else if(a==1 && Direction==1)
{
if(millis()-time4>1000)
{
digitalWrite(Drelay,1);
delay(6);
digitalWrite(Frelay,1);
delay(6);
Start=1;
a=0;
n++;
}
/*col.a=n;
for(int addr=0 ; addr < 4 ; addr++) //将count写入EEPROM
{
EEPROM.write(addr, col.b[addr]);
delay(3);
}*/
}
Serial.print("n = ");
Serial.println(n);
}
void Count()
{
if(Start==1)
{
if((millis()-time3)>5) //为了不计入噪音干扰脉冲,
{ //当2次中断之间的时间大于5ms时,计一次有效计数
count += 1; //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,编码器码盘计数加一
time3=millis();
}
}
}
void SpeedCompare()
{
if(Start==1)
{
if ((millis()-time1>=100) && Change==0)
{
time1=millis();
num1=count;
Change=1;
}
if ((millis()-time2>=200) && Change==1)
{
time2=millis();
num2=count;
num=num2-num1;
Change=0;
}
if(num<10 && count>100)
{
Start=0;
digitalWrite(Drelay,0);
delay(4);
digitalWrite(Frelay,0);
delay(4);
count=0;
if(Direction==0)
{
Direction=1;
a=1;
}else{
Direction=0;
a=1;
}
time4=millis();
}
}
}
void DirectionCompare()
{
if(800<count) //全程 行程比较
{
Start=0;
digitalWrite(Drelay,0);
delay(4);
digitalWrite(Frelay,0);
delay(4);
count=0;
if(Direction==0)
{
Direction=1;
a=1;
}else{
Direction=0;
a=1;
}
time4=millis();
}
}
|