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,可设置逻辑来判断长按的按键,后期可以通过红外来控制遥控车或者机械臂等硬件

posted @ 2020-01-17 16:35  对我有点小自信  阅读(2751)  评论(0编辑  收藏  举报