极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13507|回复: 1

入门级实验:用LED表示遥控器按下了哪个按键

[复制链接]
发表于 2013-8-24 18:50:26 | 显示全部楼层 |阅读模式
本帖最后由 chaoser 于 2013-8-24 18:54 编辑

好久没上了,为了表示歉意,来个入门教程第二十课的扩展实验吧。
原帖见这里:Arduino入门教程--第二十课--红外遥控器介绍

实验目的:用遥控器遥控LED明灭

实现方式:
  为了直观兼简单,打算使用三组LED来表示遥控器按下了哪一个按键。遥控器与原帖中的相同。
  第1组:三个绿灯,用二进制表示第1~7行;
  第2组:两个黄灯,用二进制表示第1~3列;
  第3组:一个红灯,表示解码错误。

原理图:

连线图:(注意:实际使用的红外线接收器与楼主相同,引脚依此为VOUT、GND、VCC。由于找不到相应的元件图,就用了这个代替,其引脚依此为GND、VCC、VOUT。实际连接时请注意调整。)

源程序:
  1. #include <IRremote.h>
  2. const int irPin=12;
  3. IRrecv irrecv(irPin);
  4. decode_results irRes;

  5. // 根据遥控器按键所在行列位置,建立键值对比数组。各遥控器键值不同,请自测修改。
  6. long remote[7][3]={16753245, 16736925, 16769565,
  7.                    16720605, 16712445, 16761405,
  8.                    16769055, 16754775, 16748655,
  9.                    16738455, 16750695, 16756815,
  10.                    16724175, 16718055, 16743045,
  11.                    16716015, 16726215, 16734885,
  12.                    16728765, 16730805, 16732845};

  13. void setup() {
  14.   for (int i=2; i<=12; i++) pinMode(i,OUTPUT);
  15.   Serial.begin(9600);
  16.   irrecv.enableIRIn();
  17. }

  18. void loop() {
  19.   int stat=0;
  20.   if (!irrecv.decode(&irRes)) return;    // 红外接收不成功则重新开始
  21.   Serial.print("ircode: ");
  22.   Serial.println(irRes.value);    // 监控窗口输出。以上两行无实际意义,可以不要
  23.   for (int i=1; i<=7; i++) {    // 判断哪个按键被按下,调用过程点亮相应LED
  24.     for (int j=1; j<=3; j++) {
  25.       if (remote[i-1][j-1]==irRes.value) {
  26.         light(i,j);
  27.         stat=1;
  28.       }
  29.     }
  30.   }
  31.   if (stat==0) light(0,0);    // 如果没有匹配键值,则点亮红灯以示警告
  32.   irrecv.resume();
  33.   delay(500);
  34. }

  35. void light(int x, int y) {      // 点亮LED以显示遥控器按键所在行列
  36.   int x1=2; int x2=3; int x3=4;
  37.   int y1=5; int y2=6; int z1=8;    // 定义各行列所连接的数字口,具体见原理图
  38.   for (int i=2; i<=10; i++) digitalWrite(i,0);    // 初始化,LED全灭
  39.   if (x==0 && y==0) {    // 点亮警告红灯
  40.     digitalWrite(z1,1);
  41.     return;
  42.   }
  43.   if (x==1 || x==3 || x==5 || x==7) digitalWrite(x1,1);    // 以下三行点亮行标示灯
  44.   if (x==2 || x==3 || x==6 || x==7) digitalWrite(x2,1);
  45.   if (x==4 || x==5 || x==6 || x==7) digitalWrite(x3,1);
  46.   if (y==1 || y==3) digitalWrite(y1,1);    // 以下两行点亮列标示灯
  47.   if (y==2 || y==3) digitalWrite(y2,1);
  48. }
复制代码

最终效果很不错,瞎按一个按键,就可以从LED上判断出按了哪个。light函数再细化一下,就可以当做具体的遥控器控制程序了。

祝大家玩的开心!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +10 收起 理由
swim + 10 谢谢分享

查看全部评分

回复

使用道具 举报

发表于 2013-8-24 21:29:24 | 显示全部楼层
很好的入门例程,大大的支持楼主!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 16:51 , Processed in 0.036724 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表