news 2026/5/17 2:24:16

基于Circuit Playground Express的红外通信实践:从解码到发射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Circuit Playground Express的红外通信实践:从解码到发射

1. 项目概述

红外遥控器,这东西我们几乎天天用,从电视、空调到风扇,它无处不在。但你是否想过,这个不起眼的小玩意儿背后,其实藏着一套相当精巧的无线通信系统?更酷的是,我们完全可以自己动手,用一块小小的开发板来“窃听”甚至“伪造”这些红外指令,实现各种自动化控制。今天,我就以 Adafruit 的 Circuit Playground Express(后面简称 CPX)这块板子为例,带你从零开始,深入红外通信的腹地,用 C++ 玩转红外信号的收发与解码。

CPX 是一块非常适合教育和原型的开发板,它集成了加速度计、光线传感器、麦克风、电容触摸,当然,还有我们今天的主角——一个红外发射 LED 和一个红外接收器。这意味着它天生就具备了“看”和“说”红外光的能力。我们将借助 Adafruit 官方提供的Adafruit_CircuitPlayground库,这个库内部封装了一个精简版的IRLib2库,它能帮我们处理红外通信中最繁琐的部分:协议编解码。你不用再去纠结那些微秒级的脉冲宽度,库函数会帮你把接收到的光脉冲翻译成一个个有意义的数字代码,也能把数字代码变回标准的光脉冲发出去。

整个实践过程,我们会从最基础的信号接收和解码开始,逐步深入到用遥控器控制板载的 NeoPixel 灯环,再到主动发射信号控制其他设备,最后实现一个简单的红外信号“学习与重放”功能。无论你是想做一个自定义的万能遥控器,还是想让你的创客项目响应家里的电视遥控器,这篇文章都能给你一套完整、可落地的方案。我会把每一步的原理、代码细节、可能遇到的坑以及我的调试心得都摊开来讲,让你不仅能照着做出来,更能明白为什么要这么做。

2. 红外通信核心原理与硬件基础

在动手写代码之前,我们得先搞清楚红外通信到底是怎么一回事。这能帮你理解后面代码里每一个函数调用背后的意义,当出现问题时,你也能更快地定位。

2.1 红外信号的物理本质

红外通信,说白了就是用一种人眼看不见的光——红外光——来传递信息。发射端(比如遥控器)的核心是一个红外发光二极管(IR LED),它就像个特殊的“手电筒”,只不过发出的光波长在 850nm 到 950nm 左右,超出了人眼的可视范围。接收端则是一个红外接收头,内部集成了光电二极管、前置放大器和解调电路。

这里有个关键点:调制。红外 LED 并不是简单地亮灭来代表 0 和 1。如果那样做,环境光(比如太阳光、白炽灯)中大量的红外成分会瞬间把信号淹没,造成误触发。为了解决这个问题,工程师们想出了一个巧妙的办法:载波调制

以最常见的 38kHz 载波为例。当要发送一个逻辑“1”(或者说“Mark”状态)时,红外 LED 会以 38kHz 的频率高速闪烁(亮-灭-亮-灭),而不是常亮。这个频率是接收头预先设定好并能够识别的。接收头内部的电路就像一个非常挑剔的“门卫”,它只对以 38kHz 频率闪烁的红外光敏感,并将其解调为一个持续的低电平或高电平信号。环境光虽然也含有红外线,但其强度变化频率远低于 38kHz,因此被接收头内部的滤波电路无情地过滤掉了。这就好比在嘈杂的菜市场里,你只听得懂那个用特定哨音频率叫你名字的人。

2.2 协议:红外世界的“语言”

解决了抗干扰问题,接下来就是编码信息。不同的设备制造商(索尼、松下、NEC 等)定义了不同的“语言”来组织这些经过调制的脉冲,这就是红外协议。协议规定了信号的完整结构,主要包括:

  1. 引导码:一个长长的 Mark 和 Space 组合,用来告诉接收器“注意,我要开始发送数据了!”。它有两个作用:一是让接收器的自动增益控制电路调整到合适的灵敏度;二是帮助接收器识别这是哪个协议家族发来的信号。
  2. 数据码:真正要传递的命令信息,比如“开机”、“音量加”。数据由一系列的 Mark 和 Space 组成,不同的协议用不同的方式来区分 0 和 1。
    • 脉冲宽度编码:Mark 的时长固定,通过 Space 的时长长短来区分 0 和 1(例如 NEC 协议)。
    • 脉冲位置编码:通过脉冲(Mark)出现的位置来编码(例如 Philips RC-5 协议)。
    • 脉冲距离编码:通过两个脉冲之间的间隔来编码。
  3. 结束码/重复码:标示一帧数据发送完毕。很多遥控器在按键按住时,不会重复发送完整的数据帧,而是发送一个特殊的、很短的“重复码”,以节省电力并提高响应速度。

IRLib2库的强大之处在于,它内置了对十几种主流协议(NEC, Sony, RC5, RC6, Samsung 等)的解码和编码支持。对于 CPX,Adafruit_CircuitPlayground库已经集成了这个功能,我们只需要调用简单的接口,就能拿到解码后的协议类型和一个 32 位的整数值,这个值就对应遥控器上那个按键的唯一“身份证”。

2.3 Circuit Playground Express 的红外硬件

CPX 板载的红外硬件是开箱即用的:

  • 红外接收器:位于板子中央,靠近麦克风。它已经连接到了微控制器的一个支持外部中断的引脚上,这使得库能够精确地测量每个脉冲的时长。
  • 红外发射 LED:位于板子边缘,靠近电源开关。它是一个高输出型的 LED,需要由晶体管驱动,库函数已经处理好了驱动逻辑。

注意:红外光的传播是定向的,且容易被障碍物阻挡。在测试时,尽量让发射端和接收端“面对面”,距离在几米内效果最佳。深色、特别是黑色的表面会吸收红外光,而浅色表面可能会反射,但反射信号通常很弱且不稳定。

3. 开发环境搭建与库安装

工欲善其事,必先利其器。要让 CPX 跑起我们的红外程序,需要先搭建好 Arduino IDE 环境并安装必要的支持包和库。

3.1 安装 Arduino IDE 与 CPX 支持包

首先,确保你安装了最新版的 Arduino IDE(1.8.x 或 2.x 均可)。打开 IDE 后,我们需要添加 Adafruit 的板卡支持。

  1. 打开文件 -> 首选项
  2. 在“附加开发板管理器网址”一栏中,填入以下 URL(如果已有其他,用逗号隔开):https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
  3. 点击“好”保存。
  4. 打开工具 -> 开发板 -> 开发板管理器
  5. 在搜索框中输入“Adafruit SAMD”,找到Adafruit SAMD Boards并安装。这个包包含了 CPX 所需的芯片支持。
  6. 安装完成后,在工具 -> 开发板菜单下,你就能找到Adafruit Circuit Playground Express,选中它。

3.2 安装 Adafruit_CircuitPlayground 库

CPX 的红外功能集成在Adafruit_CircuitPlayground这个综合库中。安装它有两种方法,推荐使用库管理器,最简单。

  1. 打开工具 -> 管理库...
  2. 在搜索框中输入“Adafruit CircuitPlayground”。关键点:务必在“Circuit”和“Playground”之间加一个空格,否则可能搜不到。
  3. 找到Adafruit CircuitPlayground库,点击安装。安装时会自动安装其依赖的其他库(如 Adafruit NeoPixel 等),一并确认即可。

3.3 连接板卡与端口选择

用 Micro-USB 数据线将 CPX 连接到电脑。第一次连接时,电脑可能需要一点时间来安装驱动程序(Windows 用户可能会弹出驱动安装提示,通常会自动完成)。

在 Arduino IDE 中:

  1. 工具 -> 开发板:确认已选择Adafruit Circuit Playground Express
  2. 工具 -> 端口:选择新出现的端口,在 Windows 上通常是COMx(如COM3),在 Mac 上通常是/dev/cu.usbmodemxxxx。端口名里通常会带有“Circuit Playground”字样,这是最可靠的识别标志。

实操心得:如果你连接后找不到正确的端口,或者上传时总是失败,可以尝试以下步骤:

  1. 拔掉 USB 线,按一下 CPX 上的复位按钮(RESET),然后迅速双击它。这时,板载的 NeoPixel 灯环会变成绿色,并且电脑会识别出一个名为“CPLAYBOOT”的U盘。这表示板子进入了引导加载模式。
  2. 在 Arduino IDE 的端口列表中,你可能会看到一个新的串口出现,选择它进行上传。
  3. 上传完成后,CPX 会自动复位并运行新程序。这个“双击复位”大法是解决 SAMD21 系列板卡上传问题的万能钥匙,务必记住。

4. 红外信号接收与解码实战

环境准备好了,让我们从最简单的开始:让 CPX 成为一个红外信号的“监听者”。

4.1 Infrared_Read 程序详解

打开 Arduino IDE,依次点击文件 -> 示例 -> Adafruit CircuitPlayground -> Infrared_Read。这个示例程序展示了如何接收并解码红外信号。

我们先完整地看一遍代码,并逐段解析:

#include <Adafruit_CircuitPlayground.h> #if !defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) #error "Infrared support is only for the Circuit Playground Express, it doesn't work with the Classic version" #endif void setup() { CircuitPlayground.begin(); Serial.begin(9600); while (!Serial); // Wait until serial console is opened CircuitPlayground.irReceiver.enableIRIn(); // Start the receiver Serial.println("Ready to receive IR signals"); } void loop() { //Continue looping until you get a complete signal received if (CircuitPlayground.irReceiver.getResults()) { CircuitPlayground.irDecoder.decode(); //Decode it CircuitPlayground.irDecoder.dumpResults(false); //Now print results. Use false for less detail CircuitPlayground.irReceiver.enableIRIn(); //Restart receiver } }
  • 头文件与版本检查#include <Adafruit_CircuitPlayground.h>引入了所有必要的功能。#if !defined...#error这行是一个编译时检查,确保你编译的目标是 CPX(M0内核),而不是旧版的 Circuit Playground Classic(ATmega32u4),因为 Classic 版没有红外硬件。
  • setup()函数
    • CircuitPlayground.begin():初始化板子的所有功能,包括红外。
    • Serial.begin(9600):启动串口通信,用于在电脑的串口监视器上打印信息。
    • while (!Serial);:这行代码会阻塞程序,直到你打开 Arduino IDE 的串口监视器。在实际产品中要删掉它,但调试时非常有用,能确保你不会错过最初的打印信息。
    • CircuitPlayground.irReceiver.enableIRIn():这是关键!它启动红外接收器,并配置相关的中断,开始监听红外信号。
  • loop()函数
    • if (CircuitPlayground.irReceiver.getResults()):这个函数检查是否已经接收完一帧完整的红外信号。它内部通过中断记录脉冲时间,当检测到一段足够长的空闲时间(表示一帧结束)后,返回true
    • CircuitPlayground.irDecoder.decode():如果收到了完整信号,就调用解码器尝试解码。它会分析脉冲时序,匹配已知的协议。
    • CircuitPlayground.irDecoder.dumpResults(false):将解码结果以可读格式打印到串口。参数false表示简洁模式,只输出最关键的信息。
    • CircuitPlayground.irReceiver.enableIRIn():解码并处理完后,必须重新启用接收器,准备接收下一个信号。这是一个容易忘记但至关重要的步骤,如果不调用,接收器将“聋掉”。

4.2 运行与结果分析

将代码上传到 CPX,然后打开工具 -> 串口监视器,确保波特率设置为 9600。你会看到“Ready to receive IR signals”的提示。

现在,拿起任何一个红外遥控器(电视、空调、机顶盒或者 Adafruit 的迷你遥控器),对准 CPX 板子中央的红外接收器,按下一个按钮。串口监视器会立即打印出类似这样的信息:

Ready to receive IR signals Decoded NEC(1): Value:FD807F Adrs:0 (32 bits)

这行信息是宝藏,它告诉我们:

  • Decoded NEC(1):成功解码,协议是 NEC,协议编号是 1。
  • Value:FD807F:解码得到的 32 位数据值是0xFD807F(十六进制)。这个值唯一对应你刚才按下的那个按键。
  • Adrs:0:地址码为 0。某些协议(如 Samsung36)会将数据分为地址和命令两部分,NEC 协议通常不使用这个字段。
  • (32 bits):该协议的数据长度为 32 位。

如果指向一个不被支持的设备,或者信号太差,你可能会看到:

Decoded Unknown(0): Value:0 Adrs:0 (0 bits)

这表示库无法识别该信号的协议。

4.3 深入信号细节:Verbose 模式

如果你对底层时序感兴趣,想看看原始的脉冲宽度数据,可以修改dumpResults的参数为trueCircuitPlayground.irDecoder.dumpResults(true);

重新上传后,按同一个按键,你会得到一份非常详细的报告:

Ready to receive IR signals Decoded NEC(1): Value:FD807F Adrs:0 (32 bits) Raw samples(68): Gap:52026 Head: m9014 s4560 0:m538 s602 1:m567 s574 2:m565 s577 3:m563 s577 ... Extent=67563 Mark min:533 max:569 Space min:573 max:1737
  • Raw samples(68):这一帧信号总共由 68 个 Mark(m)和 Space(s)间隔组成。
  • Gap:52026:从开始监听到信号到来之间的空闲时间,单位是微秒。
  • Head: m9014 s4560:引导码,一个 9014 微秒的 Mark 和一个 4560 微秒的 Space。这是 NEC 协议的典型特征。
  • 0:m538 s602 ...:后续是 32 对 Mark/Space,代表 32 个数据位。可以看到 Mark 的时长都在 538 微秒左右,而 Space 的时长有两种:短的约 600 微秒,长的约 1700 微秒。在 NEC 协议中,短 Space 代表逻辑 0,长 Space 代表逻辑 1。
  • Extent:整帧信号的总时长。
  • Mark/Space min/max:统计了所有 Mark 和 Space 的最小、最大值,用于协议分析。

这份数据对于逆向工程一个未知协议极其有用。但在绝大多数应用场景下,我们只需要关注解码出的协议类型和数值就够了。

5. 红外控制 NeoPixel 灯环项目

理解了如何接收信号,我们就可以做点有趣的了:用遥控器来控制 CPX 上那圈炫酷的 NeoPixel LED。Infrared_NeoPixel示例程序就是一个很好的起点。

5.1 程序工作机制剖析

打开示例文件 -> 示例 -> Adafruit CircuitPlayground -> Infrared_NeoPixel。这个程序逻辑比Infrared_Read复杂一些,因为它要持续显示动画,同时还要响应红外信号。

程序的核心是一个状态机,它维护着几个控制动画的变量:pattern(当前图案编号)、direction(旋转方向)、brightness(亮度)、speedDelay(速度延迟)。loop()函数的主要流程如下:

  1. 渲染显示:调用Show_Pattern()函数,根据当前状态变量的值,计算出每一颗 NeoPixel 应该显示的颜色并刷新。
  2. 更新动画相位:增加phase变量,实现动画的连续运动。
  3. 检查红外信号:调用CircuitPlayground.irReceiver.getResults()检查是否有新信号。
  4. 解码与响应:如果有信号,则尝试解码。如果解码成功且协议是 NEC(对应 Adafruit 迷你遥控器),就进入一个switch语句,根据解码出的数值(即按键码)来改变状态变量(pattern,direction,brightness,speedDelay)。
  5. 重启接收器:处理完信号后,调用enableIRIn()重启接收。

这种设计模式(非阻塞式检查 + 状态机)在嵌入式开发中非常经典。它确保了动画的流畅性,不会因为等待红外信号而卡住。

5.2 适配你自己的遥控器

这个示例默认是为 Adafruit 迷你遥控器(使用 NEC 协议)编写的。如果你用的是其他遥控器(比如你家电视的),就需要修改代码。步骤如下:

  1. 识别你的遥控器协议和键值

    • 运行之前的Infrared_Read程序。
    • 用你的遥控器对准 CPX,按下你打算使用的按键(例如音量+、播放、数字1等)。
    • 在串口监视器中记录下每个按键对应的协议名称(或编号)Value(十六进制值)。例如:Decoded SONY(2): Value:4AB Adrs:0 (12 bits)
  2. 修改Infrared_NeoPixel程序

    • 修改协议检查:在代码中找到if (! CircuitPlayground.irDecoder.protocolNum == NEC) {这一行。如果你的遥控器是 Sony,就需要把NEC改成SONYNEC,SONY这些是库中定义的常量,你可以在Adafruit_CircuitPlayground/utility/IRLibProtocols.h文件中找到完整的列表(如#define NEC 1,#define SONY 2)。更稳妥的写法是直接使用数字:if (CircuitPlayground.irDecoder.protocolNum != 2) { // 2 代表 SONY
    • 修改按键映射:找到switch (CircuitPlayground.irDecoder.value)语句。里面的每个case对应一个功能。例如case ADAF_MINI_VOLUME_UP:对应音量加键。你需要把这些ADAF_MINI_XXX替换成你记录下来的十六进制值。
      • 方法一(推荐,清晰):在程序开头用#define定义你自己的常量。
      #define MY_REMOTE_VOL_UP 0x4AB // 假设这是你 Sony 遥控器音量+的键值
      然后将case ADAF_MINI_VOLUME_UP:改为case MY_REMOTE_VOL_UP:
      • 方法二(直接):直接写数值case 0x4AB:

注意事项:不同协议的数值范围和数据长度可能不同。NEC 是 32 位,Sony 可能是 12、15 或 20 位。IRLib2库会统一返回一个uint32_t类型的值,对于位数不足 32 位的协议,数据存放在低位,高位补零。所以直接比较value是没问题的。但要注意,有些遥控器在长按时会发送特殊的“重复码”,其值与单次按键不同,如果你的应用需要处理长按,就要额外判断。

5.3 功能扩展思路

这个示例给了我们一个框架,你可以在此基础上大展拳脚:

  • 更多动画模式:在Show_Pattern()函数里添加新的case,实现彩虹渐变、呼吸灯、频谱可视化(结合麦克风)等效果。
  • 控制其他传感器:不局限于 NeoPixel。你可以用红外信号控制板载扬声器播放不同音调,或者根据信号改变电容触摸的灵敏度。
  • 创建宏命令:定义一个特殊的按键(如“*”键),按下后依次执行一系列操作,比如先切换灯光模式,再播放一段声音。

6. 红外信号发送与“学习型遥控”实现

CPX 不仅能接收,还能发射红外信号,这就让它从一个“监听者”变成了一个“控制者”。

6.1 Infrared_Send 程序解析

打开文件 -> 示例 -> Adafruit CircuitPlayground -> Infrared_Send。这个示例非常简单,它演示了如何通过按下板载的左右按键来发送特定的红外指令。

//Defines for a Samsung TV using NECx protocol #define MY_PROTOCOL NECX #define MY_BITS 32 #define MY_MUTE 0xE0E0F00F #define MY_POWER 0xE0E040BF void loop() { // If the left button is pressed send a mute code. if (CircuitPlayground.leftButton()) { CircuitPlayground.irSend.send(MY_PROTOCOL,MY_MUTE,MY_BITS); while (CircuitPlayground.leftButton()) {}//wait until button released } // If the right button is pressed send a power code. if (CircuitPlayground.rightButton()) { CircuitPlayground.irSend.send(MY_PROTOCOL,MY_POWER,MY_BITS); while (CircuitPlayground.rightButton()) {}//wait until button released } }

核心发送函数是CircuitPlayground.irSend.send(protocol, value, bits)。你需要提供三个参数:

  1. protocol:协议类型,使用IRLibProtocols.h中定义的常量,如NEC,SONY,RC5等。
  2. value:要发送的指令值,就是你用Infrared_Read读出来的那个十六进制数。
  3. bits:该协议的数据位数,对于 NEC 是 32,对于 Sony 可能是 12、15 或 20。

while (CircuitPlayground.leftButton()) {}这行代码实现了按键释放检测,防止在按住按键期间连续不断地发射信号,这既耗电也可能导致接收设备处理异常。

6.2 Infrared_Record:实现信号学习与重放

这是最有趣的一个应用——制作一个简易的“学习型遥控器”。文件 -> 示例 -> Adafruit CircuitPlayground -> Infrared_Record展示了如何实现。

程序逻辑清晰分为两部分:

  1. 学习阶段:在loop()中,持续检查红外接收器。一旦收到并成功解码一个信号,就将解码得到的protocolNumvaluebits保存到三个全局变量中。
  2. 重放阶段:同时,在loop()中也检查左按键是否被按下。如果被按下,并且之前已经成功学习过一个信号(IR_protocol != 0),就调用irSend.send()函数,将保存的信号原样发送出去。

这个简单的程序揭示了一个万能遥控器的基本原理。你可以扩展它,比如:

  • 增加存储:使用 CPX 的 EEPROM(非易失性存储)来保存多个学习到的信号,即使断电也不会丢失。
  • 增加触发方式:不限于按键,可以用电容触摸、拍手(声音传感器)、特定的手势(加速度计)来触发发送不同的红外指令。
  • 逻辑组合:实现一个“宏”,按一个键,依次发送“电视开机”、“切换到 HDMI1”、“音响开机”三个指令。

6.3 发送实战与调试技巧

当你写好发送程序后,如何验证它是否工作正常?

  1. 最直接的测试:将 CPX 的红外发射 LED 对准你的目标设备(如电视),按下触发按钮,看设备是否有反应。注意对准,距离在 1-3 米内。
  2. 使用另一块 CPX 接收验证:这是最可靠的调试方法。让另一块运行着Infrared_Read程序的 CPX(或任何支持IRLib2的 Arduino)作为接收端,放置在发射端旁边。当主 CPX 发送信号时,在接收端的串口监视器上观察解码结果。这能精确验证你发送的协议、数值是否正确。
  3. 使用手机摄像头辅助观察:大多数手机摄像头的 CMOS 传感器对红外光敏感。在昏暗环境下,用手机摄像头对准 CPX 的红外发射 LED,当你触发发送时,你应该能在手机屏幕上看到发射 LED 发出微弱的白光或紫光(这是红外光在传感器上的成像)。这只能证明 LED 在闪烁,不能证明信号正确,但可以用于快速排查硬件连接问题。

常见问题排查

  • 设备无反应
    • 协议或地址不对:确保发送的协议和数值与设备原装遥控器完全一致。有些设备(如某些品牌的空调)有复杂的地址码,需要一并发送。
    • 发射功率不足:CPX 板载的 IR LED 功率有限,距离太远或角度偏差太大可能导致信号太弱。尝试靠近并对准。
    • 电池电量低:USB 供电一般没问题,但如果使用电池,电量不足会导致发射功率下降。
  • 接收端解码为 Unknown
    • 载波频率不匹配:绝大多数设备使用 38kHz,但极少数可能使用 36kHz, 40kHz 等。IRLib2库发送时默认使用 38kHz。目前 CPX 库的发送部分可能不支持修改频率,这是一个限制。
    • 信号格式错误:确保bits参数设置正确。一个 20 位的 Sony 信号如果按 32 位发送,接收端是无法解码的。

7. 高级应用与自定义协议处理

虽然IRLib2库已经支持了十几种主流协议,但世界上的红外设备千千万,你仍然有可能遇到一个“非主流”的遥控器。这时,你就需要了解如何分析和支持自定义协议。

7.1 使用 Infrared_Testpattern 进行协议测试

Infrared_Testpattern这个示例程序是一个强大的调试和教学工具。它允许你手动选择或遍历所有IRLib2支持的协议,并发送一个特定的测试码。

运行这个程序,并打开串口监视器。它会提示你输入 1 到 12 的数字来选择协议,或者输入 -1 来遍历所有协议。同时,用另一块运行Infrared_Read的板子接收。通过对比发送和接收到的协议编号、数值,你可以:

  1. 验证你的发射/接收链路是否正常工作
  2. 直观感受不同协议的数据格式差异。例如,你会看到 Sony 协议有 12/15/20 位变种,RC6 协议有特殊的引导头等。

7.2 分析未知协议

如果你遇到了一个库不支持的遥控器,Infrared_Read的详细输出模式(dumpResults(true))就是你最好的武器。你需要收集多个按键(至少包括 0, 1 这样能产生明显 0/1 序列的键)的原始时序数据。

分析步骤通常包括:

  1. 识别引导码:找到最开始的那个超长的 Mark 和 Space,记录它们的时长。这是协议的“指纹”。
  2. 确定逻辑表示法:观察后续的 Mark/Space 对。是 Mark 固定、Space 变化(脉宽编码)?还是脉冲位置变化?对比按“0”键和“1”键的原始数据,找出区别在哪里。
  3. 计算时钟基准:测量最短的 Mark 或 Space 的时长,这通常是协议的“单位时间”或“时钟周期”。
  4. 推断数据结构和位数:数一列引导码之后有多少对 Mark/Space,这很可能就是数据位的数量。看看是否有明显的分隔符(如一个较长的 Space)来区分地址码和命令码。

这个过程需要耐心和一些经验。IRLib2的手册(在其 GitHub 仓库的manuals文件夹中)提供了编写自定义编解码器的详细指南。对于 CPX 项目,由于使用的是集成库,添加自定义协议需要修改底层库文件,难度较高。一个更可行的方案是,如果你确定要用某个特殊协议,可以尝试在标准的 Arduino 环境中使用完整的IRLib2库,它提供了更灵活的自定义接口。

7.3 项目集成与优化建议

当你把红外功能集成到一个更大的项目中时,以下几点经验可能对你有帮助:

  • 电源管理:红外发射 LED 工作时电流较大。如果项目是电池供电,要避免频繁或长时间发射。可以在发送代码前后加入低功耗模式的切换。
  • 防信号冲突:如果你的项目同时需要接收和发送,要处理好时序,避免自己发射的信号被自己接收误判。通常的做法是在发送期间短暂关闭接收中断,发送完成后再开启。
  • 代码结构化:将红外相关的操作(如解码、发送、协议映射)封装成独立的函数或类,使主程序逻辑更清晰。例如,可以创建一个RemoteController类,内部维护一个按键值到功能函数的映射表。
  • 用户体验:提供反馈。当 CPX 接收到一个有效信号时,可以让 NeoPixel 闪烁一下绿色;当学习到一个新信号时,闪烁蓝色;发送信号时,闪烁白色。这样用户就能直观地知道设备的状态。

红外通信是一个看似简单但内涵丰富的领域。通过 Circuit Playground Express 和Adafruit_CircuitPlayground库,我们获得了一个绝佳的实验平台,能够以很低的门槛探索从信号解码、设备控制到简单协议分析的完整流程。从“读懂”遥控器开始,到创造出能控制周围设备的智能小工具,这个过程充满了动手的乐趣和解决问题的成就感。希望这篇详细的实践指南能成为你红外探索之路上的得力助手,当你看到自己编写的代码成功让一排灯光随着遥控器起舞,或者让旧电器焕发新的智能生命时,那种感觉,正是创客精神的魅力所在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/17 2:24:14

CircuitPython按键扫描模块keypad:从原理到实战的嵌入式输入解决方案

1. 项目概述&#xff1a;CircuitPython按键扫描模块的深度解析在嵌入式开发中&#xff0c;处理用户输入&#xff0c;尤其是多个按键&#xff0c;一直是个既基础又容易踩坑的环节。无论是做一个自定义的游戏手柄、一个带实体按键的智能家居面板&#xff0c;还是一个简单的仪器控…

作者头像 李华
网站建设 2026/5/17 2:23:29

Redis 事务

Redis 事务&#xff1a;从命令队列到 WATCH 乐观锁 在学习 Redis 的时候&#xff0c;很多人会自然地把 Redis 事务和 MySQL 事务放在一起理解。它们确实有相似的地方&#xff1a;都是把一组操作组织起来&#xff0c;作为一个整体批量提交。但 Redis 的事务能力要轻很多&#xf…

作者头像 李华
网站建设 2026/5/17 2:22:06

开源隐私保险库:构建安全的密钥管理与敏感数据存储方案

1. 项目概述&#xff1a;一个面向开发者的隐私数据管理工具最近在整理个人项目和公司内部的一些小型应用时&#xff0c;我反复遇到一个头疼的问题&#xff1a;各种API密钥、数据库连接字符串、第三方服务的访问令牌&#xff0c;这些敏感信息到底该怎么管理&#xff1f;直接硬编…

作者头像 李华
网站建设 2026/5/17 2:16:00

FlowCue:基于NLP流水线与图算法的文本逻辑流提取工具

1. 项目概述&#xff1a;FlowCue是什么&#xff0c;以及它为何值得关注 如果你正在寻找一个能帮你从海量、混乱的文本数据中&#xff0c;自动梳理出清晰逻辑脉络和关键信息的工具&#xff0c;那么 gcryptonlabs/FlowCue 这个项目很可能就是你需要的。简单来说&#xff0c;Fl…

作者头像 李华
网站建设 2026/5/17 2:16:00

Linux光标异常修复指南:x-cursor-help工具原理与实战

1. 项目概述&#xff1a;一个被低估的鼠标光标修复工具如果你是一名Linux桌面用户&#xff0c;尤其是那些喜欢尝试各种桌面环境、主题和图标包的朋友&#xff0c;那么你大概率遇到过鼠标光标“消失”或者“变丑”的尴尬情况。比如&#xff0c;从GNOME切换到KDE Plasma&#xff…

作者头像 李华