TTwar 2019-11-21 14:26 采纳率: 0%
浏览 1322
已采纳

arduino 红外遥控器设置功能按键

给红外遥控器设置两个功能按键,文字输入和数字输入,按下后再去按1-9按键可在LCD1602上显示数字或设置好的一串字母,红外遥控模块和LCD显示模块都没有问题,只是判断按键后执行语句中无法再次进行判断,功能键的功能无法执行,不知道有什么方法可以解决,代码如下,球球各位大神给指点一下

#include <IRremote.h>
#include <IRremoteInt.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,10,9,8,7,6);
#define RECV_PIN 13
IRrecv irrecv(RECV_PIN);
decode_results results;
void words();
void number();

void setup() 
{
  Serial.begin(9600);
  lcd.begin(16,2);
  Serial.println("Enabling IRin");
  irrecv.enableIRIn();
  Serial.println("Enabled IRin");
  lcd.clear();
  lcd.setCursor(0,0);
 }


void words()
{
   if (irrecv.decode(&results))
    {
      Serial.println(results.value, HEX); 
      if(results.value==0xFF30CF)
      {lcd.setCursor(2,0);lcd.print("Hello World!");delay(2000);lcd.clear();}
      else if(results.value==0xFF18E7)
      {lcd.setCursor(3,0);lcd.print("Tian Ji");delay(2000);lcd.clear();}
      else if(results.value==0xFF7A85)
      {lcd.setCursor(3,0);lcd.print("Da Xue");delay(2000);lcd.clear();}
      else if(results.value==0xFF10EF)
      {lcd.setCursor(3,0);lcd.print("Ren Ai");delay(2000);lcd.clear();}
      else if(results.value==0xFF38C7)
      {lcd.setCursor(3,0);lcd.print("Xue Yuan");delay(2000);lcd.clear();}
      else if(results.value==0xFF5AA5)
      {lcd.setCursor(3,0);lcd.print("Welcome!");delay(2000);lcd.clear();}
      else if(results.value==0xFF42BD)
      {lcd.setCursor(3,0);lcd.print("Ni Hao!");delay(2000);lcd.clear();}
      else if(results.value==0xFF4AB5)
      {lcd.write("Nice to meet you");delay(2000);lcd.clear();}
      else if(results.value==0xFF52AD)
      {lcd.setCursor(4,0);lcd.print("Bye-bye");delay(2000);lcd.clear();}
    }
}
void number()
{
    lcd.leftToRight();
    if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX); 
    if(results.value==0xFF30CF)
      {lcd.print("1");delay(100);}
    else if(results.value==0xFF18E7)
      {lcd.print("2");delay(100);}
    else if(results.value==0xFF7A85)
      {lcd.print("3");delay(100);}
    else if(results.value==0xFF10EF)
      {lcd.print("4");delay(100);}
    else if(results.value==0xFF38C7)
      {lcd.print("5");delay(100);}
    else if(results.value==0xFF5AA5)
      {lcd.print("6");delay(100);}
    else if(results.value==0xFF42BD)
      {lcd.print("7");delay(100);}
    else if(results.value==0xFF4AB5)
      {lcd.print("8");delay(100);}
    else if(results.value==0xFF52AD)
      {lcd.print("9");delay(100);}
    else if ( results.value==0xFF6897)
      {lcd.print("0");delay(100);}
    }
}

void loop() 
{
   if (irrecv.decode(&results)) 
   {
     Serial.println(results.value, HEX); 
    if  (results.value==0xFFE21D)
       {delay(1000);lcd.clear();lcd.print("screen opening...");delay(1000);lcd.clear();}
  else if (results.value==0xFFA25D)
       {lcd.setCursor(3,0);lcd.print("screen off");delay(1000);lcd.clear();}
  else if (results.value==0xFF629D)
       {lcd.clear();}
  else if (results.value==0xFF22DD)
       {lcd.setCursor(3,0);lcd.print("Input words:");delay(1000);lcd.clear();words();}
  else if (results.value==0xFF02FD)
       {lcd.setCursor(3,0);lcd.print("Input number:");delay(1000);lcd.clear();number();}
        irrecv.resume();
   } 
    delay(1000);
}
  • 写回答

1条回答

  • bobhuang 2019-11-21 16:37
    关注

    在lcd.print("Input words:");之后,delay之前,调用一下irrecv.resume(); ,使得irrecv开始接收下一个按键信息。

    补充一下,大致上是这个意思。我没有调试环境,所以只能把代码逻辑写出来。

    #include <IRremote.h>
    #include <IRremoteInt.h>
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11, 10, 9, 8, 7, 6);
    #define RECV_PIN 13
    
    enum menu_states { 
      TOP_MENU, 
      INPUT_WORDS, 
      INPUT_NUMBER 
    };
    
    int stat;
    
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void words();
    void number();
    void main_menu();
    
    void setup() {
      Serial.begin(9600);
      lcd.begin(16, 2);
      Serial.println("Enabling IRin");
      irrecv.enableIRIn();
      Serial.println("Enabled IRin");
      lcd.clear();
      lcd.setCursor(0, 0);
      stat = TOP_MENU;
    }
    
    void words() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        // 每个decode配一个resume
        irrecv.resume();
    
        if (results.value == 0xFF30CF) {
          lcd.setCursor(2, 0);
          lcd.print("Hello World!");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF18E7) {
          lcd.setCursor(3, 0);
          lcd.print("Tian Ji");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF7A85) {
          lcd.setCursor(3, 0);
          lcd.print("Da Xue");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF10EF) {
          lcd.setCursor(3, 0);
          lcd.print("Ren Ai");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF38C7) {
          lcd.setCursor(3, 0);
          lcd.print("Xue Yuan");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF5AA5) {
          lcd.setCursor(3, 0);
          lcd.print("Welcome!");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF42BD) {
          lcd.setCursor(3, 0);
          lcd.print("Ni Hao!");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF4AB5) {
          lcd.write("Nice to meet you");
          delay(2000);
          lcd.clear();
        } else if (results.value == 0xFF52AD) {
          lcd.setCursor(4, 0);
          lcd.print("Bye-bye");
          delay(2000);
          lcd.clear();
        }
      }
    
      // 每个decode配一个delay
      delay(100);
    
      stat = TOP_MENU;
    }
    
    void number() {
      lcd.leftToRight();
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        // 每个decode配一个resume
        irrecv.resume();
    
        if (results.value == 0xFF30CF) {
          lcd.print("1");
          delay(100);
        } else if (results.value == 0xFF18E7) {
          lcd.print("2");
          delay(100);
        } else if (results.value == 0xFF7A85) {
          lcd.print("3");
          delay(100);
        } else if (results.value == 0xFF10EF) {
          lcd.print("4");
          delay(100);
        } else if (results.value == 0xFF38C7) {
          lcd.print("5");
          delay(100);
        } else if (results.value == 0xFF5AA5) {
          lcd.print("6");
          delay(100);
        } else if (results.value == 0xFF42BD) {
          lcd.print("7");
          delay(100);
        } else if (results.value == 0xFF4AB5) {
          lcd.print("8");
          delay(100);
        } else if (results.value == 0xFF52AD) {
          lcd.print("9");
          delay(100);
        } else if (results.value == 0xFF6897) {
          lcd.print("0");
          delay(100);
        }
      }
    
      // 每个decode配一个delay
      delay(100);
    
      stat = TOP_MENU;
    }
    
    void main_menu() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume();
    
        if (results.value == 0xFFE21D) {
          delay(1000);
          lcd.clear();
          lcd.print("screen opening...");
          delay(1000);
          lcd.clear();
        } else if (results.value == 0xFFA25D) {
          lcd.setCursor(3, 0);
          lcd.print("screen off");
          delay(1000);
          lcd.clear();
        } else if (results.value == 0xFF629D) {
          lcd.clear();
        } else if (results.value == 0xFF22DD) {
          lcd.setCursor(3, 0);
          lcd.print("Input words:");
          delay(1000);
          lcd.clear();
          stat = INPUT_WORDS;
        } else if (results.value == 0xFF02FD) {
          lcd.setCursor(3, 0);
          lcd.print("Input number:");
          delay(1000);
          lcd.clear();
          stat = INPUT_NUMBER;
        }
      }
      delay(1000);
    }
    
    void loop() {
      if (TOP_MENU == stat) {
        main_menu();
      } else if (INPUT_NUMBER == stat) {
        number();
      } else if (INPUT_WORDS == stat) {
        words();
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?