// 导入红外库文件,该库提供了红外信号接收、解码等功能
#include <IRremote.h>

// 定义红灯连接的引脚,使用数字引脚 2
const int redLedPin = 2;
// 定义黄灯连接的引脚,使用数字引脚 4
const int yellowLedPin = 4;
// 定义红外接收模块连接的引脚,使用数字引脚 3
const int recvPin = 3;

// 创建一个红外接收对象 irrecv,并将其初始化为使用 recvPin 引脚进行红外信号接收
// 该对象提供了与红外接收、发送操作相关的函数
IRrecv irrecv(recvPin);

// 创建一个 decode_results 类型的对象 results,用于存放红外接收并解码后的结果
// 解码后的红外信号数据会存储在这个对象中
decode_results results;

// setup 函数在 Arduino 启动时仅运行一次,用于初始化硬件和设置初始状态
void setup() {
    // 初始化串口通信,设置波特率为 9600
    // 波特率表示数据传输的速度,这里用于通过串口监视器输出调试信息
    Serial.begin(9600);
    // 启用红外接收功能,让红外接收对象开始准备接收红外信号
    irrecv.enableIRIn();
    // 将红灯引脚设置为输出模式,这样 Arduino 可以控制该引脚的电平来点亮或熄灭红灯
    pinMode(redLedPin, OUTPUT);
    // 将黄灯引脚设置为输出模式,以便控制黄灯的亮灭
    pinMode(yellowLedPin, OUTPUT);
}

// loop 函数会不断循环执行,实现程序的主要功能逻辑
void loop() {
    // 使用 irrecv.decode(&results) 尝试对接收到的红外信号进行解码
    // 如果成功接收到并解码了红外信号,则将解码结果存储在 results 对象中,并返回 true
    if (irrecv.decode(&results)) { 
        // 下面注释掉的代码是清空缓存,准备接收下一个红外信号,暂时注释
        // irrecv.resume();
        // 将解码后的红外信号值以十六进制的形式通过串口输出到串口监视器
        // 方便我们查看接收到的红外信号对应的编码值
        Serial.println(results.value, 16); 
        // 下面注释掉的代码和上面功能相同,也是以十六进制输出解码结果
        // Serial.println(results.value, HEX);

        // 判断接收到的红外编码值是否为 0XFF30CF
        if (results.value == 0XFF30CF) { 
            // 如果是,则将红灯引脚电平设置为高电平,点亮红灯
            digitalWrite(redLedPin, HIGH);
            // 将黄灯引脚电平设置为低电平,熄灭黄灯
            digitalWrite(yellowLedPin, LOW);
        // 判断接收到的红外编码值是否为 0XFF18E7
        } else if (results.value == 0XFF18E7) {
            // 如果是,则将红灯引脚电平设置为低电平,熄灭红灯
            digitalWrite(redLedPin, LOW);
            // 将黄灯引脚电平设置为高电平,点亮黄灯
            digitalWrite(yellowLedPin, HIGH);
        // 判断接收到的红外编码值是否为 0XFF7A85
        } else if (results.value == 0XFF7A85) {
            // 如果是,则将红灯引脚电平设置为高电平,点亮红灯
            digitalWrite(redLedPin, HIGH);
            // 将黄灯引脚电平设置为高电平,点亮黄灯
            digitalWrite(yellowLedPin, HIGH);
        // 判断接收到的红外编码值是否为 0XFF10EF
        } else if (results.value == 0XFF10EF) {
            // 如果是,则将红灯引脚电平设置为低电平,熄灭红灯
            digitalWrite(redLedPin, LOW);
            // 将黄灯引脚电平设置为低电平,熄灭黄灯
            digitalWrite(yellowLedPin, LOW);
        }
        // 清空红外接收缓存,准备接收下一个红外信号
        // decode 和 resume 通常成对使用,否则只能读取到第一次接收到的红外编码值,后续不再接收新的编码值
        irrecv.resume();
    }
    // 延迟 50 毫秒,避免程序过于频繁地检查红外信号,降低 CPU 占用率
    delay(50);
}



3 条评论

  • @ 2025-5-31 18:05:58

    Arduino红外遥控器入门教程

    红外遥控器是一种常见的无线控制设备,通过发送红外信号来控制电子设备。在Arduino项目中,我们可以使用红外接收模块来解码遥控器的信号,实现无线控制功能。

    1. 所需材料

    • Arduino开发板(如UNO)
    • IR红外接收模块(如HS0038B)
    • 红外遥控器(任意家电遥控器均可)
    • 面包板与跳线

    2. 电路连接

    红外接收模块引脚说明

    1. VCC:接Arduino的5V
    2. GND:接Arduino的GND
    3. OUT:接Arduino的数字引脚(如D11)

    电路连接图

    Arduino         红外接收模块
    +5V   ─────────── VCC
    GND  ─────────── GND
    D11  ─────────── OUT
    

    3. 安装IRremote库

    在Arduino IDE中安装IRremote库:

    1. 打开Arduino IDE
    2. 点击「工具」→「管理库」
    3. 搜索「IRremote」并安装

    4. 红外信号解码程序

    下面是一个简单的程序,用于接收并解码红外遥控器的信号:

    #include <IRremote.h>  // 引入红外遥控库
    
    const int RECV_PIN = 11;  // 定义红外接收引脚
    IRrecv irrecv(RECV_PIN);  // 创建红外接收对象
    decode_results results;   // 用于存储解码结果的对象
    
    void setup() {
      Serial.begin(9600);     // 初始化串口通信
      irrecv.enableIRIn();    // 启用红外接收
      irrecv.blink13(true);   // 启用LED指示(可选)
      Serial.println("等待红外信号...");
    }
    
    void loop() {
      if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
        Serial.println(results.value, HEX);  // 以十六进制打印按键值
        irrecv.resume();  // 继续接收下一个信号
      }
      delay(100);  // 短暂延时
    }
    

    5. 代码解释

    1. 库和变量定义

      • IRremote.h:红外解码核心库
      • RECV_PIN:定义接收引脚为D11
      • irrecv:红外接收对象
      • results:存储解码结果的对象
    2. setup() 函数

      • 初始化串口通信
      • irrecv.enableIRIn():启用红外接收功能
      • irrecv.blink13(true):接收到信号时闪烁板载LED(可选)
    3. loop() 函数

      • irrecv.decode(&results):尝试解码接收到的信号
      • results.value:存储解码后的按键值
      • results.value, HEX:以十六进制格式打印按键值
      • irrecv.resume():继续接收下一个信号

    6. 获取遥控器按键值

    1. 上传代码到Arduino
    2. 打开串口监视器(波特率9600)
    3. 按下遥控器上的任意按键
    4. 串口监视器会显示对应的按键编码(如0xFFA25D

    7. 基于按键值控制LED

    下面是一个示例代码,根据不同的按键控制LED的开关:

    #include <IRremote.h>
    
    const int RECV_PIN = 11;
    const int LED_PIN = 13;  // 定义LED引脚
    
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    
    // 定义遥控器按键值(根据你的遥控器修改)
    const unsigned long POWER = 0xFFA25D;
    const unsigned long UP = 0xFFE01F;
    const unsigned long DOWN = 0xFFA857;
    
    void setup() {
      Serial.begin(9600);
      irrecv.enableIRIn();
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(LED_PIN, LOW);  // 初始关闭LED
    }
    
    void loop() {
      if (irrecv.decode(&results)) {
        // 根据不同按键执行不同操作
        if (results.value == POWER) {
          digitalWrite(LED_PIN, !digitalRead(LED_PIN));  // 切换LED状态
          Serial.println("切换LED");
        } else if (results.value == UP) {
          digitalWrite(LED_PIN, HIGH);  // 打开LED
          Serial.println("LED开启");
        } else if (results.value == DOWN) {
          digitalWrite(LED_PIN, LOW);  // 关闭LED
          Serial.println("LED关闭");
        } else {
          Serial.print("未知按键: ");
          Serial.println(results.value, HEX);
        }
        irrecv.resume();
      }
      delay(100);
    }
    

    8. 常见问题

    1. 无法接收信号

      • 检查引脚连接是否正确
      • 确认红外接收模块是否正常工作(遮挡模块时LED应亮起)
      • 尝试更换不同的数字引脚
    2. 按键值不稳定

      • 遥控器与接收模块距离过远
      • 环境光线过强(红外信号易受干扰)
      • 尝试在代码中添加防抖处理

    总结

    通过本教程,你学会了:

    1. 连接红外接收模块到Arduino
    2. 使用IRremote库解码红外信号
    3. 获取遥控器的按键编码
    4. 根据不同按键执行相应操作

    红外遥控是实现无线控制的简单有效方式,你可以进一步扩展这个项目,比如控制舵机、制作智能开关,甚至搭建一个完整的智能家居控制系统!

    • @ 2025-5-31 17:35:35

      • @ 2025-5-31 17:31:38
        #include <IRremote.h>//导入红外库文件
        const int recvPin = 11;//红外接受模块的连接引脚常量
        IRrecv irrecv(recvPin);//创建红外对象 同时初始化recvPin引脚//红外对象提供红外接受、发送操作的相关函数 
        decode_results results;//创建存放红外接受解码后结果的容器//用于保存接受解码后的数据
        void setup() {
          Serial.begin(9600);//初始化串口,设置波特率为9600
          irrecv.enableIRIn();//红外对象初始化//启动红外接受
        }
        void loop() {
          //decode对红外信号进行解码操作的函数
          if(irrecv.decode(&results)){//如果接受到红外数据,接受并解码成功则把解码后的结果存放到results
            //irrecv.resume();
            Serial.println(results.value,16);//将解码结果以16进制的形式输出
            //Serial.println(results.value,HEX);
            irrecv.resume();//清空缓存 准备接受下一个红外信号
            //decode和resume成对使用,否则只能读取到第一次接受的红外编码值,而不再接受新的编码值
          }
          delay(50);
        }
        
        
        • 1