极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12685|回复: 2

【新手求助】关于连续按键问题

[复制链接]
发表于 2015-9-9 18:06:07 | 显示全部楼层 |阅读模式
我想用红外遥控器控制LED,效果是按任意键一次为长亮(除了电源键);按两次闪烁;按三次为呼吸灯。

这是我参考的红外遥控代码,求大神们帮个忙。跪谢了!!!
  1. /**************************************************************
  2. **红外遥控LED
  3. *
  4. **原理介绍:irrecv.enableIRIn()启动红外解码后,这时候IRrecv对象
  5. * 会在后台接收红外线信号。接着就可以利用decode()函数持续检查,
  6. * 看看有没有解码成功。irrecv.decode(&results)  解码成功,这个函
  7. * 数会返回true,并把结果放在results里面,在解码一个红外线信号之
  8. * 后,要运行resume()函数,这样才会持续接收下一组信号。
  9. * 可以先利用这个程序解析出所使用遥控的编码,然后根据所得到的编
  10. * 码,修改程序实现所需的功能。解析出的编码数值是unsigned long,
  11. * 注意一下,在判决的时候用0x ******判定是否是某个按键。
  12. *
  13. **实验说明:按下遥控器的电源按钮,LED灭,按下静音按钮,LED亮
  14. *
  15. * BY YFRobot
  16. ***************************************************************/
  17. #include <IRremote.h>



  18. int RECV_PIN = 11;   //红外线接收器OUTPUT端接在pin 11
  19. int LED = 10;        // 定义LED引脚为10

  20. IRrecv irrecv(RECV_PIN);   // 定义IRrecv 对象来接收红外线信号
  21. decode_results results;   //解码结果放在decode_results构造的对象results里


  22. void irdisplay(unsigned long value)  //  按下按键后,显示本遥控对应的按键
  23. {
  24.   switch(value){         //判定按下的是哪个按键,串口显示按钮名称
  25.   case 0xFFA25D:
  26.     Serial.println("POWER");
  27.     digitalWrite(LED, LOW);          //电源键按下,执行关闭LED灯
  28.     break;
  29.   case 0xFF629D:
  30.     Serial.println("Mode");
  31.     break;
  32.   case 0xFFE21D:
  33.     Serial.println("MUTE");
  34.     digitalWrite(LED, HIGH);        //静音键按下,执行点亮LED灯
  35.     break;
  36.    
  37.   //其他按键
  38.   case 0xFF22DD:
  39.     Serial.println("PLAY/PAUSE");
  40.     break;
  41.   case 0xFF02FD:
  42.     Serial.println("PREV");
  43.     break;
  44.   case 0XFFC23D:
  45.     Serial.println("NEXT");
  46.     break;
  47.   case 0xFFE01F:
  48.     Serial.println("EQ");
  49.     break;
  50.   case 0xFFA857:
  51.     Serial.println("-");
  52.     break;
  53.   case 0xFF906F:
  54.     Serial.println("+");
  55.     break;
  56.   case 0xFF6897:
  57.     Serial.println("0");
  58.     break;
  59.   case 0xFF9867:
  60.     Serial.println("BACK");
  61.     break;
  62.   case 0xFFB04F:
  63.     Serial.println("U/SD");
  64.     break;
  65.   case 0xFF30CF:
  66.     Serial.println("1");
  67.     break;
  68.   case 0xFF18E7:
  69.     Serial.println("2");
  70.     break;
  71.   case 0xFF7A85:
  72.     Serial.println("3");
  73.     break;
  74.   case 0xFF10EF:
  75.     Serial.println("4");
  76.     break;
  77.   case 0xFF38C7:
  78.     Serial.println("5");
  79.     break;
  80.   case 0xFF5AA5:
  81.     Serial.println("6");
  82.     break;
  83.   case 0xFF42BD:
  84.     Serial.println("7");
  85.     break;
  86.   case 0xFF4AB5:
  87.     Serial.println("8");
  88.     break;
  89.   case 0xFF52AD:
  90.     Serial.println("9");
  91.     break;
  92.   }
  93. }
  94. void setup()
  95. {
  96.   pinMode(LED,OUTPUT);          // 定义LED为输出引脚
  97.   Serial.begin(9600);          //开启串口通信,并设定波特率为9600
  98.   irrecv.enableIRIn();          //启动红外解码
  99. }
  100. void loop() {
  101.   if (irrecv.decode(&results))  
  102.   {
  103.     //解码成功,收到一组红外线信号  
  104.     irdisplay(results.value);   
  105.     irrecv.resume();         
  106.   }   
  107. }

复制代码
回复

使用道具 举报

发表于 2015-9-10 21:36:14 | 显示全部楼层
本帖最后由 pzg123 于 2015-9-10 21:39 编辑

int num=0;
void loop() {
  if (irrecv.decode(&results))  
  {
    //解码成功,收到一组红外线信号  
    irdisplay(results.value);   
    if(results.value != 0xFFA25D)
    {
      num++;
      if(num>3) num = 1;
      switch(num)
      {
        case 1: 函数1
         break;
        case 2: 函数2
        break;
        case 3: 函数3
         break;
      }
    }
    irrecv.resume();         
  }   
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-26 17:15:36 | 显示全部楼层
pzg123 发表于 2015-9-10 21:36
int num=0;
void loop() {
  if (irrecv.decode(&results))  

thanks!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 17:30 , Processed in 0.037714 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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