当我们使用最简单的红外发信器时,单次点击是没有问题的,但是当长按一个按钮时会接收到16进制的FFFFFFFF转化为10进制为4294967295,如果要处理长按信息,我的思路是设置两个string类型的变量,一个储存当前的状态,一个储存上一个状态,日过当前状态接受到了FFFFFFFF那么就把当前状态变为上一个状态的值,如果不是那么更新两个状态,没有接收到信息则初始化状态,这样就必须有延迟我测试的150毫秒的延迟是比较好的,如果不要求高精度,这样是刚好的,下面放一个用长按控制led的代码,长按按钮亮,松开则灭
//长按红外模板
#include <IRremote.h>
int RECV_PIN = 8;//接受脚位
String strp,strnow;
IRrecv irrecv(RECV_PIN);//红外接收器的对象irrecv
decode_results results;//储存接收到的红外信息
void setup()
{
Serial.begin(9600);//串口输出
Serial.println("begin...");
irrecv.enableIRIn(); // 启动红外
Serial.println("end");
pinMode(7,OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {//如果接受到红外信号存入results内
Serial.println(results.value);//十六进制打印信号
// 按一下
// if(results.value==0xFF30CF){
// digitalWrite(7,HIGH);
// }else if(results.value==0xFF6897){
// digitalWrite(7,LOW);
// }
if(results.value==4294967295){//最大值接收到重复值
strnow=strp;//把当前值变为上一个接收到的
}else{//不是重复的则更新
strnow=results.value;
strp=results.value;
}
// Serial.println(strnow+" "+strp);
if(strnow=="16724175"){
digitalWrite(7,HIGH);
}
strnow="";
irrecv.resume(); // 确认接收下一个
}else{
digitalWrite(7,LOW);
}
delay(150);
}