Arduino篇—红外遥控

电子说

1.3w人已加入

描述

相关知识

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用。

组成:红外遥控器 + 红外接收器

基本原理:红外遥控的发射威廉希尔官方网站 是采用红外发光二极管来发出经过调制的红外光波;红外接收威廉希尔官方网站 由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。

接收器

发射部分:通过功率放大调制后的编码信号,再经由发射威廉希尔官方网站 向外发射调制后的指令编码。

接收部分:接收到已调制的编码信号并进行放大解调,还原出对应的编码信号。

接收器

威廉希尔官方网站 搭建

所需材料

ArduinoUNO * 1
红外接收模块 * 1
红外遥控器 * 1
红黄蓝绿LED各一
直流电机 * 1
杜邦线若干

接线方式

接收器引脚定义:
"-"接UNO的"GND"
"S"接UNO的信号端口
中间的引脚接UNO的5V

接收器

程序编写

练习一:读取红外遥控器的键值

编程实现通过串口读取红外遥控器各个键位对应的键值。

图形化方式:

接收器

打开串口监视器,按下红外遥控器上的按键,可以在监视器上读取到对应的键值。正确的键值模式为“FF”开头的6位十六进制数字。

接收器

键值对应列表:

接收器

  • 代码方式:
    /* 项目名称:红外键值读取
     * 项目时间:2022.02.23
     * 项目作者:MRX
     */
    #include < IRremote.h >
    
    
    int RECV_PIN = 3;
    
    
    IRrecv irrecv(RECV_PIN);// 设置红外接收器的引脚
    
    
    decode_results results;// 定义results变量为红外结果存放位置
    
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println("Enabling IRin");
      irrecv.enableIRIn(); // 启动红外解码
      Serial.println("Enabled IRin");
    }
    
    
    void loop() {
      if (irrecv.decode(&results)) {// 解码成功,把数据放入results变量中
        Serial.println(results.value, HEX); // 显示红外编码
        irrecv.resume(); // 继续等待接收下一组信号
      }
      delay(100);
    }
    

练习二:红外遥控灯

编程实现红外遥控开关不同颜色的灯。

威廉希尔官方网站 连接:

接收器

图形化方式:

接收器

代码方式:代码中的0x表示为16进制

/* 项目名称:红外控制LED
 * 项目时间:2022.02.23
 * 项目作者:MRX
 */
#include < IRremote.h >


int RECV_PIN = 3;
int red_Pin = 9;
int green_Pin = 10;
int yellow_Pin = 11;
int blue_Pin = 12;


IRrecv irrecv(RECV_PIN);// 设置红外接收器的引脚


decode_results results;// 定义results变量为红外结果存放位置


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // 启动红外解码
  for(int i = 9;i <= 12;i++){
    pinMode(i,OUTPUT);
  }
}


void loop() {
  if (irrecv.decode(&results)) {// 解码成功,把数据放入results变量中
    Serial.println(results.value, HEX); // 显示红外编码
    switch(results.value){
      case 0xFF6897:
      digitalWrite(9,HIGH);
      break;
     case 0xFF30CF:
      digitalWrite(10,HIGH);
      break;
     case 0xFF18E7:
      digitalWrite(11,HIGH);
      break;
     case 0xFF7A85:
      digitalWrite(12,HIGH);
      break;
     case 0xFF10EF:
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
      break;
    }
    irrecv.resume(); // 继续等待接收下一组信号
  }
}

switch...case...:

switch的用法是判断case后面的表达式和switch后面的表达式是否相匹配,一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分