查看: 393|回复: 7

[未解决] 菜鸟遇到一个关于遥控器程序问题,急需高手帮忙解决!...

[复制链接]
  • TA的每日心情
    开心
    2018-8-11 00:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2018-8-11 00:50 | 显示全部楼层 |阅读模式

    菜鸟在做遥控器实验时遇到下面问题无法解决,请高手指点!!!
    要实现的功能是:按下遥控器1号键,LED亮,并反复打印"turn on LED";按下遥控器2号键,LED灭,并反复打印"turn off LED",如此顺利切换。用了while循环,发现先按了1号键后,再按2号键没有反应,或者重新复位后先按了2号键后,再按1号键也没有反应,尽管已经在子函数ir_remote内调用了自己,还是不能解决,有没有办法让while语句循环执行,按了另一个按键后又能跳出当前循环,进入另一个while语句循环执行,能相互切换,请高手支招,谢谢!
    程序如下:
    #include <IRremote.h>
    int RECV_PIN = 10;
    int LED=11;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); //初始化红外遥控
      pinMode(LED,OUTPUT);
    }
    void loop()
    {
    ir_remote(); //调用遥控控制子函数
    }
    ///////////////////////遥控控制子函数/////////////
    void ir_remote()
    {
      if (irrecv.decode(&results))
      {
        if(results.value==0x00FF30CF)      //如果遥控器的按键1被按下
        {
         while(1)
         {
          digitalWrite(LED,HIGH);                //点亮LED
          Serial.println("turn on LED"); //串口打印“turn on LED”
          irrecv.resume(); // 接收下一个编码
          ir_remote();
          delay(10);      
          }
        }
        if(results.value==0x00FF18E7)   //如果遥控器的按键2被按下
        {
           while(1)
           {
            digitalWrite(LED,LOW);            //熄灭LED
            Serial.println("turn off LED");    //串口打印“turn off LED”
            irrecv.resume(); // 接收下一个编码
            ir_remote();
            delay(10);
           }
         }
        irrecv.resume(); // 接收下一个编码
      }
    }

    该用户从未签到

    发表于 2018-8-16 17:27 | 显示全部楼层
    这个程序你根本没跳出第一个进去的循环,就算第二次按下的案件不一样了也没重新判断

    该用户从未签到

    发表于 2018-8-16 17:34 | 显示全部楼层
    你是在ir_remote();里面调用了ir_remote();???

    该用户从未签到

    发表于 2018-8-16 17:39 | 显示全部楼层
    感觉换成这样会好点吧!
    void ir_remote()
    {
       if (irrecv.decode(&results))
       {
         while(1)
         {
           if(results.value==0x00FF30CF)      //如果遥控器的按键1被按下
          {
             digitalWrite(LED,HIGH);                //点亮LED
             Serial.println("turn on LED"); //串口打印“turn on LED”
             delay(10);  
           }
           if(results.value==0x00FF18E7)
          {
             digitalWrite(LED,LOW);            //熄灭LED
             Serial.println("turn off LED");    //串口打印“turn off LED”
             delay(10);
           }
           irrecv.resume(); // 接收下一个编码
          }
      }

    该用户从未签到

    发表于 2018-8-16 17:48 | 显示全部楼层
    刚才好像少了点东西,只能循环显示一次,下面的这个你试一下吧,没试验过
    void ir_remote()
    {
       String x=irrecv.resume;    //编码寄存器
       if (irrecv.decode(&results))
       {
         while(1)
         {
           if(results.value==0x00FF30CF)      //如果遥控器的按键1被按下
          {
             x=irrecv.resume;
           }
           if(results.value==0x00FF18E7)      //如果遥控器的按键2被按下
          {
             x=irrecv.resume;
           }
           
           if(x==0x00FF30CF)      //如果遥控器的按键1被按下
          {
             digitalWrite(LED,HIGH);                //点亮LED
             Serial.println("turn on LED"); //串口打印“turn on LED”
             delay(10);  
           }
           if(x==0x00FF18E7)
          {
             digitalWrite(LED,LOW);            //熄灭LED
             Serial.println("turn off LED");    //串口打印“turn off LED”
             delay(10);
           }
           irrecv.resume(); // 接收下一个编码
          }
      }

  • TA的每日心情
    开心
    2018-8-11 00:51
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2018-8-23 13:23 | 显示全部楼层
    bdx499875280 发表于 2018-8-16 17:34
    你是在ir_remote();里面调用了ir_remote();???

    比如下面的程序是可以实现:当按下key1时led1闪烁,当按下key2时led2闪烁,能正常跳出while()循环的。
    就是不明白为什么按键扫描子函数scankey()可以嵌套调用而红外子函数不能嵌套调用?跳出while()循环的??
    const int led1 =  2;      
    const int led2 =  3;   
    const int key1 =  A0;      
    const int key2 =  A1;      

    int ledState = LOW;     

    unsigned long previousMillis = 0;   

    const long interval = 500;      
    void setup() {

      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode(key1, INPUT_PULLUP);
      pinMode(key2, INPUT_PULLUP);   
    }
    void loop()
    {
    flicker1();  
    scankey();
    }
    ///////////////////////
    void scankey()
    {
      scankey1();
      scankey2();  
    }
    ///////////////
    void scankey1()                     
    {  
      if(digitalRead(key1) == LOW)           
      {  
        delay(10);                           
        if(digitalRead(key1) == LOW)         
        {  
          int KEY_NUM1 = 1;   
          digitalWrite(led2,LOW);
          while(KEY_NUM1 == 1)            
            {     
            flicker1();
            scankey();      
            }
        }  
       }
    }

    ///////////
    void scankey2()                     
    {  
      if(digitalRead(key2) == LOW)      
      {  
        delay(10);                           
        if(digitalRead(key2) == LOW)         
        {  
          int KEY_NUM1 = 1;   
          digitalWrite(led1,LOW);
          while(KEY_NUM1 == 1)           
            {     
             flicker2();
             scankey();      
            }
        }  
       }
    }

    //////////
    void flicker1()
    {
           unsigned long currentMillis = millis();
           if (currentMillis - previousMillis >= interval)
           {
            previousMillis = currentMillis;
              if (ledState == LOW)
              {
               ledState = HIGH;
              }
              else
              {
               ledState = LOW;
               }
            digitalWrite(led1, ledState);
           }
    }
    /////////////
    void flicker2()
    {
           unsigned long currentMillis = millis();
           if (currentMillis - previousMillis >= interval)
           {
            previousMillis = currentMillis;
              if (ledState == LOW)
              {
               ledState = HIGH;
              }
              else
              {
               ledState = LOW;
               }
            digitalWrite(led2, ledState);
           }
    }
  • TA的每日心情
    开心
    2018-8-11 00:51
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2018-8-23 14:03 | 显示全部楼层
    bdx499875280 发表于 2018-8-16 17:48
    刚才好像少了点东西,只能循环显示一次,下面的这个你试一下吧,没试验过
    void ir_remote()
    {

    编译不通过,显示错误:conversion from 'void' to non-scalar type 'String' requested
  • TA的每日心情
    开心
    2018-8-11 00:51
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2018-8-23 14:24 | 显示全部楼层
    wxj5368 发表于 2018-8-23 14:03
    编译不通过,显示错误:conversion from 'void' to non-scalar type 'String' requested

    我现在想用两个轻触式按键key1和key2,以及遥控器上的1号键(键值0x00FF30CF)和2号键(键值0x00FF18E7)分别控制LED1和LED2的,具体想法如下:
    当按下键盘上的key1或者遥控器的1号键时,LED1不断闪亮;
    当按下键盘上的key2或者遥控器的2号键时,LED2不断闪亮;
    也就是说进无论是键盘按的键还是遥控器的按键都能控制对应的LED闪亮,
    键盘按键的程序我已经写了,就是不知道怎么把遥控部分的程序加进去,请帮帮忙,谢谢!
    键盘程序如下:

    #include <IRremote.h>
    int RECV_PIN = 10;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    const int led1 =  32;      // LED引脚号
    const int led2 =  33;      // LED引脚号
    const int key1 =  A0;      // LED引脚号
    const int key2 =  A1;      // LED引脚号
    int ledState = LOW;         
    unsigned long previousMillis = 0;      
    const long interval = 500;   
    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn();
      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode(key1, INPUT_PULLUP);
      pinMode(key2, INPUT_PULLUP);   
    }
    void loop()
    {
    flicker1();  //默认让led1先闪亮
    scankey();
    }
    ///////////////////////
    void scankey()
    {
      scankey1();
      scankey2();  
    }
    ///////////////
    void scankey1()                     
    {  
      if(digitalRead(key1) == LOW)         
      {  
        delay(10);                             
        if(digitalRead(key1) == LOW)   
        {  
          int KEY_NUM1 = 1;   
          digitalWrite(led2,LOW);
          while(KEY_NUM1 == 1)           
            {     
            flicker1();
            scankey();      
            }
         }  
       }
    }
    ///////////
    void scankey2()                     
    {  
      if(digitalRead(key2) == LOW)           
      {  
        delay(10);                           
        if(digitalRead(key2) == LOW)        
        {  
          int KEY_NUM1 = 1;     
          digitalWrite(led1,LOW);
          while(KEY_NUM1 == 1)           
            {     
             flicker2();
             scankey();      
            }
         }  
       }
    }

    //////////
    void flicker1()
    {
           unsigned long currentMillis = millis();
           if (currentMillis - previousMillis >= interval)
           {
            previousMillis = currentMillis;
              if (ledState == LOW)
              {
               ledState = HIGH;
              }
              else
              {
               ledState = LOW;
               }
            digitalWrite(led1, ledState);
           }
    }
    /////////////
    void flicker2()
    {
           unsigned long currentMillis = millis();
           if (currentMillis - previousMillis >= interval)
           {
            previousMillis = currentMillis;
              if (ledState == LOW)
              {
               ledState = HIGH;
              }
              else
              {
               ledState = LOW;
               }
            digitalWrite(led2, ledState);
           }
    }



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

    本版积分规则

    热门推荐

    Arduino IDE安装esp8266 SDK
    Arduino IDE安装esp8266 S
    使用Arduino IDE开发esp8266开发板 1.下载Arduino IDE 下载地址 2.打开Arduino IDE
    arduino SD卡识别不了
    arduino SD卡识别不了
    arduino版本为1.8.7 单片机是arduino uno 使用的程序为自带程序cardinf 连线开始弄错
    arduino sd卡读取后 后期数据处理的问题
    arduino sd卡读取后 后期
    测试内容:UNO板子+SD卡+时钟1302模块+自制传感器模块。实现采集到的数据储存到SD卡中
    求助!在使用Digispack Kickstarter做BadUSB时报错
    求助!在使用Digispack Ki
    如图 在编译时出现错误 [mw_shl_code=c,true]void setup() { Digispark.Keyboard vo
    arduino智能小车蓝牙控制系统
    arduino智能小车蓝牙控制
    蓝牙智能小车简介 智能小车主要可以分为 3 部分, 传感器部分、控制部分、执行部分。
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表