关于红外遥控器解码的一点疑问
程序员文章站
2022-03-21 23:49:30
...
最开始由3D打印机接触到arduino,燃起了一点兴趣,最近有些空闲时间开始研究arduino程序,发现各种库果然十分方便,适合我这种怕麻烦星人。。。
计划是做红外遥控器控制舵机的小程序,经过一下午的查资料,敲代码,改代码,改代码,改代码。。。终于可以实现功能。按下遥控器数字键舵机转动到相对应的角度。
#include <IRremote.h>
#include <Servo.h>
#define MAX 22
Servo myservo;//定义舵机变量名
int val;
int angle;
int RECV_PIN = 7; //定义红外接收模块输出口接arduino数字引脚11
IRrecv irrecv(RECV_PIN);
decode_results results;
//Car mp3编码
unsigned long rremote_code[MAX] = {
0xFFA25D,0xFF629D,0xFFE21D,//CH- CH CH+
0xFF22DD,0xFF02FD,0xFFC23D,//PREV NEXT PLAY
0xFFE01F,0xFFA857,0xFF906F,//VOL- VOL+ EQ
0xFF6897,0xFF9867,0xFFB04F,// 0 100+ 200+
0xFF30CF,0xFF18E7,0xFF7A85,// 1 2 3
0xFF10EF,0xFF38C7,0xFF5AA5,// 4 5 6
0xFF42BD,0xFF4AB5,0xFF52AD, // 7 8 9
0xFFFFFFFF//长按
};
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); //初始化红外遥控
myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)
}
void loop() {
if (irrecv.decode(&results)) {
//打印字符串
int val = getRremoteString(results.value);
Serial.println("遥控输入:");
Serial.println(val);
angle=val*20;
Serial.println("舵机当前角度:");
Serial.println(angle);
myservo.write(angle);//设置舵机旋转的角度
delay(50);
irrecv.resume(); // 接收下一个值
}
}
/**
* 解析红外编码并返回对应的字符串
*/
int getRremoteString(unsigned long code){
int codeString=0;
switch (code){
case 0xFF6897: codeString=0; break;
case 0xFF30CF: codeString=1; break;
case 0xFF18E7: codeString=2; break;
case 0xFF7A85: codeString=3; break;
case 0xFF10EF: codeString=4; break;
case 0xFF38C7: codeString=5; break;
case 0xFF5AA5: codeString=6; break;
case 0xFF42BD: codeString=7; break;
case 0xFF4AB5: codeString=8; break;
case 0xFF52AD: codeString=9; break;
default: codeString=0;
}
return codeString;
}
程序借鉴了arduino中文社区的文章:感谢
有几个问题
1.原程序中编码与字符串一一对应的思路非常简洁,但转换后数据类型变为字符串,无法进行后续处理屏蔽掉无关按键只留下数字键,以及给舵机复制操作。尝试强制转换为int型,不过没能成功,希望能获得指点。
2.使用switch语句后无法屏蔽长按操作,当前定义是长按归零。不知怎样实现长按舵机无操作功能。
初次接触arduino编程,水平有限,见谅见谅
上一篇: C语言的基础类型的内存空间
下一篇: Nodejs中什么是可写流?怎么使用