• Arduino学习笔记 (五) -- 红外接收与解码


    实验原料:

      1、PC一台

      2、Arduino UNO R3 + type-b数据线

      3、红外遥控 + 红外接收模块

      4、发光led二极管

      5、杜邦线若干

      6、电阻(用作限流 100R ~ 1K)

    模块连接:

      红外接收器的signal接在数字引脚11上

      GND接控制板的GND

      VCC接控制板上+5V

      发光二极管正极引脚接在数字引脚4上,

      LED负极通过220欧姆电阻回到控制板的GND

    效果:

      红外遥控器按下按键时,电脑的串口监视器显示按键编码

      若按下数字键1,则LED点亮

      若按下数字键2,则LED熄灭

    下面上代码

    #include <IRremote.h>
    
    int RECV_PIN = 11;//定义红外接收器的引脚为11
    int LED_PIN = 4; //定义发光LED引脚数字4
    int a = 0;
    IRrecv irrecv(RECV_PIN);
    
    decode_results results;
    
    String jian[17] = {
      "1", "2", "3",
      "4", "5", "6",
      "7", "8", "9",
      "*", "0", "#",
      "",
      "", "OK", "",
      ""
    
    };
    String ma[17] = {
      "16753245", "16736925", "16769565",
      "16720605", "16712445", "16761405",
      "16769055", "16754775", "16748655",
      "16738455", "16750695", "16756815",
      "16718055",
      "16716015", "16726215", "16734885",
      "16730805"
    
    };
    void setup()
    {
      Serial.begin(9600);       //  串口波特率
      irrecv.enableIRIn();      //  初始化红外接收器
      pinMode(LED_PIN, OUTPUT); //  设置发光LED引脚数字4
    }
    String getjian(unsigned long mastr) {
      String result = "";
      for ( int i = 0; i < 17; ++i ) {
        if (String(mastr) == ma[i]) {
          result = jian[i];
          break;
        }
      }
      return result;
    }
    
    int val = 0 ;
    void loop() {
      if (irrecv.decode(&results)) {
        //    Serial.println(results.value);      // 输出按键值(未解码)
        if (results.value != 4294967295) {
          String zi = getjian(results.value);
          Serial.println(zi);
          if (zi == "1") {
            digitalWrite(LED_PIN, HIGH); //LED点亮
          }
          if (zi == "2") {
            digitalWrite(LED_PIN, LOW); //LED点亮
          }
          if (zi == "") {
            val += 30;
            if (val >= 1024) {
              val = 1024;
            }
            analogWrite(LED_PIN, val);//val 是 0~255 的整数值,对应电压从 0 到+5V
            int vvvv = analogRead(LED_PIN);
            Serial.println(vvvv);
            //        digitalWrite(LED_PIN,HIGH);//LED点亮
    
          }
          if (zi == "") {
            //        digitalWrite(LED_PIN,LOW);//LED点亮
            val -= 30;
            if (val <= 1) {
              val = 1;
            }
            analogWrite(LED_PIN, val);//val 是 0~255 的整数值,对应电压从 0 到+5V
            int vvvv = analogRead(LED_PIN);
            Serial.println(vvvv);
          }
        }
        irrecv.resume(); // 接收下一个值
      }
    }

    备注:

      代码需要提前安装IRremote库,用于接收红外

      因使用的是数字IO(只能输出高低电平),下一步计划使用模拟IO,通过上下按键来改变电压(PWM占空比)实现LED亮度的控制

      任意按键长按时,红外接收的16进制数据为0,可设置逻辑来判断长按的按键,后期可以通过红外来控制遥控车或者机械臂等硬件

  • 相关阅读:
    c#泛型的使用
    如何调试由于heap corruption导致的程序崩溃的简单示例
    Windows的SEH机理简要介绍
    利用定制行为扩展WCF之利用MessageInsepctor behaviourExtension扩展WCF行为(自定义消息头)
    欧拉函数
    JZOJ.1349 最小公约数
    关于扩展中国剩余定理(excrt)的证明与拙见
    【USACO 2021 US Open, Gold】United Cows of Farmer John & JZOJ7220
    线性求逆元
    【USACO 2021 January Contest, Platinum】Problem 1. Sum of Distances JZOJ.7241
  • 原文地址:https://www.cnblogs.com/luxd/p/12206480.html
Copyright © 2020-2023  润新知