Arduino篇—红外遥控

电子说

1.2w人已加入

描述

相关知识

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

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

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

编码器

发射部分:通过功率放大调制后的编码信号,再经由发射电路向外发射调制后的指令编码。

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

编码器

电路搭建

所需材料

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
完善资料,
赚取积分