红外遥控模块——让 Arduino 接收遥控器信号
2026/9/6 9:04:37 网站建设 项目流程

前面我们学了蜂鸣器发声、继电器控制高压设备,现在给 Arduino 加一个"耳朵"——红外遥控模块,让它能接收遥控器的指令,实现无线控制。

学完这篇,你会完成:

  • 基础接收:读取遥控器按键的编码值
  • 红外控制 LED:用遥控器控制 LED 的开关
  • 综合项目:红外遥控继电器:用遥控器控制 220V 设备(如台灯)

一、红外遥控是什么?

红外遥控利用红外光(人眼不可见)传输控制信号。遥控器按下按键时,会发射一串编码的红外脉冲;Arduino 上的红外接收头接收到脉冲后,解码出对应的按键值。

核心组件
  • 红外遥控器:发射端,每个按键对应一个唯一的编码
  • 红外接收头:接收端(如 VS1838B),接收红外信号并输出解码后的电平信号
常见编码格式
格式特点
NEC最常见,32 位编码(地址 + 命令)
Sony12 位或 15 位编码
RC5/RC6飞利浦常用,曼彻斯特编码

我们使用IRremote 库,它支持多种编码格式,自动识别。


二、所需元件

  • Arduino Uno
  • 红外接收头(VS1838B 或类似)
  • 红外遥控器(任意品牌,通常随接收头附赠)
  • LED + 220Ω 电阻(实验二用)
  • 继电器模块(综合项目用)

三、安装 IRremote 库

  1. 打开 Arduino IDE
  2. 菜单:工具 → 管理库
  3. 搜索"IRremote"
  4. 安装IRremote by shirriff(或最新版本)

安装完成后,在代码中#include <IRremote.h>即可使用。


四、接线方式

红外接收头通常有 3 个引脚:

接收头引脚接到
VCCArduino 5V
GNDArduino GND
OUTArduino D11

不同接收头引脚顺序可能不同,查看模块上的标注。VS1838B 通常是OUT-GND-VCC(从左到右)。


五、实验一:读取遥控器按键编码

先让 Arduino 读取遥控器每个按键的编码值,方便后续编程。

#include <IRremote.h> #define IR_PIN 11 IRrecv irrecv(IR_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 启动红外接收 Serial.println("IR Receiver Ready!"); } void loop() { if (irrecv.decode(&results)) { // 打印解码结果 Serial.print("编码类型: "); Serial.print(results.decode_type); Serial.print(" | 编码值: "); Serial.println(results.value, HEX); // 以十六进制显示 irrecv.resume(); // 接收下一个值 } }
代码解读
  • IRrecv irrecv(IR_PIN):创建红外接收对象,指定接收引脚
  • irrecv.enableIRIn():启动红外接收
  • irrecv.decode(&results):尝试解码接收到的信号,成功返回 true
  • results.value:解码后的按键编码值(十六进制)
  • irrecv.resume():清空缓冲区,准备接收下一个信号
使用方法
  1. 上传代码,打开串口监视器(波特率 9600)
  2. 按下遥控器上的任意按键
  3. 串口会显示类似:编码值: FF6897
  4. 记录每个按键的编码值,后续编程用

不同遥控器的编码值不同,务必记录自己遥控器的编码。


六、实验二:红外控制 LED

用遥控器的某个按键控制 LED 的开关。

#include <IRremote.h> #define IR_PIN 11 #define LED_PIN 13 // 替换为你遥控器的编码值(十六进制) #define KEY_POWER 0xFF6897 // 电源键 #define KEY_UP 0xFF18E7 // 上键 #define KEY_DOWN 0xFF4AB5 // 下键 IRrecv irrecv(IR_PIN); decode_results results; bool ledState = false; void setup() { pinMode(LED_PIN, OUTPUT); irrecv.enableIRIn(); Serial.begin(9600); Serial.println("IR LED Control Ready!"); } void loop() { if (irrecv.decode(&results)) { unsigned long key = results.value; Serial.print("按键编码: "); Serial.println(key, HEX); if (key == KEY_POWER) { // 电源键:切换 LED 状态 ledState = !ledState; digitalWrite(LED_PIN, ledState ? HIGH : LOW); Serial.println(ledState ? "LED ON" : "LED OFF"); } else if (key == KEY_UP) { // 上键:强制开启 digitalWrite(LED_PIN, HIGH); ledState = true; Serial.println("LED ON (UP)"); } else if (key == KEY_DOWN) { // 下键:强制关闭 digitalWrite(LED_PIN, LOW); ledState = false; Serial.println("LED OFF (DOWN)"); } irrecv.resume(); } }
代码解读
  • #define KEY_POWER 0xFF6897:定义按键编码常量,替换为你自己的编码值
  • ledState标志位:记录 LED 当前状态
  • !ledState:逻辑非运算,实现状态翻转
  • digitalWrite(LED_PIN, ledState ? HIGH : LOW):根据状态设置 LED
效果
  • 按电源键 → LED 开/关切换
  • 按上键 → LED 强制开启
  • 按下键 → LED 强制关闭

七、综合项目:红外遥控继电器

用遥控器控制继电器,实现无线控制 220V 设备(如台灯、风扇)。

接线
元件引脚接到
红外接收头VCC5V
红外接收头GNDGND
红外接收头OUTD11
继电器模块IND7
继电器模块VCC5V
继电器模块GNDGND

继电器输出端(COM/NO)接 220V 设备,注意高压安全!

代码
#include <IRremote.h> #define IR_PIN 11 #define RELAY 7 // 替换为你遥控器的编码值 #define KEY_POWER 0xFF6897 // 电源键 #define KEY_1 0xFF30CF // 数字键 1 #define KEY_2 0xFF18E7 // 数字键 2 IRrecv irrecv(IR_PIN); decode_results results; bool relayState = false; void setup() { pinMode(RELAY, OUTPUT); digitalWrite(RELAY, HIGH); // 初始关闭(低电平触发) irrecv.enableIRIn(); Serial.begin(9600); Serial.println("IR Relay Control Ready!"); } void loop() { if (irrecv.decode(&results)) { unsigned long key = results.value; Serial.print("按键编码: "); Serial.println(key, HEX); if (key == KEY_POWER) { // 电源键:切换继电器状态 relayState = !relayState; digitalWrite(RELAY, relayState ? LOW : HIGH); // 低电平触发 Serial.println(relayState ? "Relay ON" : "Relay OFF"); } else if (key == KEY_1) { // 数字键 1:强制开启 digitalWrite(RELAY, LOW); relayState = true; Serial.println("Relay ON (KEY_1)"); } else if (key == KEY_2) { // 数字键 2:强制关闭 digitalWrite(RELAY, HIGH); relayState = false; Serial.println("Relay OFF (KEY_2)"); } irrecv.resume(); } }
代码解读
  • relayState标志位:记录继电器当前状态
  • digitalWrite(RELAY, relayState ? LOW : HIGH):低电平触发,状态为 true 时输出 LOW 开启
  • 按键功能
    • 电源键:切换开/关
    • 数字键 1:强制开启
    • 数字键 2:强制关闭
效果
  • 按电源键 → 继电器开/关切换(控制 220V 设备)
  • 按数字键 1 → 强制开启
  • 按数字键 2 → 强制关闭

八、进阶:红外遥控多路控制

如果需要控制多个设备(如灯 + 风扇),可以用不同按键控制不同继电器。

#include <IRremote.h> #define IR_PIN 11 #define RELAY1 7 #define RELAY2 8 #define KEY_1 0xFF30CF // 数字键 1 #define KEY_2 0xFF18E7 // 数字键 2 IRrecv irrecv(IR_PIN); decode_results results; void setup() { pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, HIGH); // 关闭 digitalWrite(RELAY2, HIGH); // 关闭 irrecv.enableIRIn(); Serial.begin(9600); } void loop() { if (irrecv.decode(&results)) { unsigned long key = results.value; if (key == KEY_1) { // 按键 1:切换继电器 1 digitalWrite(RELAY1, !digitalRead(RELAY1)); Serial.println("Relay 1 Toggled"); } else if (key == KEY_2) { // 按键 2:切换继电器 2 digitalWrite(RELAY2, !digitalRead(RELAY2)); Serial.println("Relay 2 Toggled"); } irrecv.resume(); } }

九、常见问题

问题解决方法
串口无输出检查接线,确认红外接收头方向(对准遥控器)
编码值全是 FFFFFFFF按键按住不放会重复发送,松开再按
编码值不稳定远离强光(阳光、白炽灯),红外干扰大
库函数报错确认安装的是 IRremote 库,而非其他同名库

十、本篇小结

回顾一下今天学到的核心知识:

  • 红外遥控原理:遥控器发射编码脉冲,接收头解码出按键值
  • IRremote 库IRrecv接收信号,decode()解码,results.value获取编码
  • 读取编码:先读取遥控器每个按键的编码值,后续编程用
  • 红外控制 LED:根据按键编码控制 LED 开关
  • 红外控制继电器:实现无线控制 220V 设备
  • 多路控制:不同按键控制不同继电器

红外遥控让 Arduino 项目摆脱了线缆束缚,可以制作遥控器控制的智能灯、无线开关、红外密码锁等有趣的项目。下一篇,我们学习超声波传感器——让 Arduino 测量距离!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询