|
|
本帖最后由 chaoser 于 2013-8-24 18:54 编辑
好久没上了,为了表示歉意,来个入门教程第二十课的扩展实验吧。
原帖见这里:Arduino入门教程--第二十课--红外遥控器介绍
实验目的:用遥控器遥控LED明灭
实现方式:
为了直观兼简单,打算使用三组LED来表示遥控器按下了哪一个按键。遥控器与原帖中的相同。
第1组:三个绿灯,用二进制表示第1~7行;
第2组:两个黄灯,用二进制表示第1~3列;
第3组:一个红灯,表示解码错误。
原理图:
连线图:(注意:实际使用的红外线接收器与楼主相同,引脚依此为VOUT、GND、VCC。由于找不到相应的元件图,就用了这个代替,其引脚依此为GND、VCC、VOUT。实际连接时请注意调整。)
源程序:
- #include <IRremote.h>
- const int irPin=12;
- IRrecv irrecv(irPin);
- decode_results irRes;
- // 根据遥控器按键所在行列位置,建立键值对比数组。各遥控器键值不同,请自测修改。
- long remote[7][3]={16753245, 16736925, 16769565,
- 16720605, 16712445, 16761405,
- 16769055, 16754775, 16748655,
- 16738455, 16750695, 16756815,
- 16724175, 16718055, 16743045,
- 16716015, 16726215, 16734885,
- 16728765, 16730805, 16732845};
- void setup() {
- for (int i=2; i<=12; i++) pinMode(i,OUTPUT);
- Serial.begin(9600);
- irrecv.enableIRIn();
- }
- void loop() {
- int stat=0;
- if (!irrecv.decode(&irRes)) return; // 红外接收不成功则重新开始
- Serial.print("ircode: ");
- Serial.println(irRes.value); // 监控窗口输出。以上两行无实际意义,可以不要
- for (int i=1; i<=7; i++) { // 判断哪个按键被按下,调用过程点亮相应LED
- for (int j=1; j<=3; j++) {
- if (remote[i-1][j-1]==irRes.value) {
- light(i,j);
- stat=1;
- }
- }
- }
- if (stat==0) light(0,0); // 如果没有匹配键值,则点亮红灯以示警告
- irrecv.resume();
- delay(500);
- }
- void light(int x, int y) { // 点亮LED以显示遥控器按键所在行列
- int x1=2; int x2=3; int x3=4;
- int y1=5; int y2=6; int z1=8; // 定义各行列所连接的数字口,具体见原理图
- for (int i=2; i<=10; i++) digitalWrite(i,0); // 初始化,LED全灭
- if (x==0 && y==0) { // 点亮警告红灯
- digitalWrite(z1,1);
- return;
- }
- if (x==1 || x==3 || x==5 || x==7) digitalWrite(x1,1); // 以下三行点亮行标示灯
- if (x==2 || x==3 || x==6 || x==7) digitalWrite(x2,1);
- if (x==4 || x==5 || x==6 || x==7) digitalWrite(x3,1);
- if (y==1 || y==3) digitalWrite(y1,1); // 以下两行点亮列标示灯
- if (y==2 || y==3) digitalWrite(y2,1);
- }
复制代码
最终效果很不错,瞎按一个按键,就可以从LED上判断出按了哪个。light函数再细化一下,就可以当做具体的遥控器控制程序了。
祝大家玩的开心!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|