基于Seeeduino XIAO与红外遥控的旧风扇智能化改造实战
1. 项目概述用一块小小的开发板让传统风扇“听懂”遥控器家里那台老式落地扇按键按起来嘎吱响遥控器早就不知道丢哪儿去了每次想调个风速都得弯腰去按实在不方便。最近折腾智能家居手头正好有几块Seeeduino XIAO这板子小巧得跟大拇指指甲盖似的但功能一点不含糊。我就琢磨着能不能用它给这台“哑巴”风扇装个“大脑”让它重新听遥控器的话甚至未来还能接入更智能的系统。这个项目的核心就是利用Seeeduino XIAO作为主控通过一个红外接收头“学习”并“听懂”市面上通用红外遥控器的指令然后驱动一个继电器模块来模拟按压风扇机身上的实体按键从而实现遥控开关、调速等功能。听起来像是给旧家电做了一次“神经嫁接”手术。整个过程不涉及复杂的网络协议也不需要云端属于本地化、低成本的智能化改造特别适合对传统家电进行功能升级或者作为智能家居的入门练手项目。你需要准备的除了主角Seeeduino XIAO主要就是一个红外接收模块比如VS1838B、一个继电器模块建议用带光耦隔离的安全第一、一台带红外功能的遥控器电视、空调、机顶盒的都可以甚至旧风扇遥控器也行以及一些杜邦线。软件层面Arduino IDE是我们的主战场。这个项目非常适合刚接触单片机和控制的新手因为它逻辑清晰硬件接线简单代码量也不大但能完整地走通“信号输入-逻辑处理-控制输出”的经典物联网流程成就感十足。2. 核心思路与硬件选型解析2.1 为什么是Seeeduino XIAO市面上单片机那么多从经典的Arduino Uno到功能强大的ESP32为什么偏偏选Seeeduino XIAO这得从项目需求和实际体验说起。首先尺寸是决定性因素。XIAO的极致小巧23.5mm x 17.5mm意味着它可以被轻易地塞进大多数风扇的控制盒内部无需外挂实现真正的“内置式”改造外观上能做到毫无痕迹。相比之下Uno板子就显得太“占地”了。其次性能足够且功耗友好。XIAO基于ARM Cortex-M0内核主频48MHz内存和闪存对于处理红外解码和GPIO控制这种任务绰绰有余。更重要的是它在深度睡眠模式下的功耗可以降到微安级别虽然我们这个项目风扇一开就得持续供电但低功耗特性为未来增加定时关闭、人体感应等省电功能预留了空间。再者接口与生态。XIAO兼容Arduino IDE对于广大开发者来说几乎没有学习成本。它提供了足够的数字I/O口本项目仅需占用2-3个并且支持模拟输入万一你想加个温湿度传感器实现自动调速呢它的Type-C接口也让供电和编程无比方便。最后性价比。在拥有上述优点的同时它的价格非常亲民作为一次性改造的“心脏”成本可控。注意选择继电器模块时务必确认其控制电压与XIAO的GPIO输出电平3.3V匹配。最好选择支持3.3V控制信号的“低电平触发”型继电器模块这样连接和代码控制都更简单安全。2.2 系统工作流程拆解整个系统的工作链条非常清晰我们可以把它想象成一个条件反射弧感知信号输入红外接收头持续监听空间中的红外信号。当用户按下遥控器按键时接收头将接收到一串调制好的红外光脉冲并将其转换为电信号送入XIAO的指定引脚。解码与识别处理XIAO调用IRremote库对这串电信号进行解码。解码成功后会得到一个具体的数值通常是一个16进制或32进制数这个数值唯一对应遥控器上的一个按键。逻辑判断决策我们在代码中预设一个“键值映射表”。例如我们规定遥控器上的“电源键”对应的解码值是0xFFA25D这是NEC编码中一个常见值。XIAO将当前解码得到的值与映射表进行比对。执行动作输出一旦匹配成功XIAO就向连接继电器的GPIO引脚发出一个控制信号。例如发送一个短暂的“低电平”脉冲驱动继电器吸合一下再断开模拟“按一下”风扇电源键的动作。对于调速则可以按顺序触发连接不同风速档位的继电器。这个流程的关键在于“模拟按键”。我们并没有去破解风扇内部的电机驱动电路而是用一种非侵入式的方式通过继电器“替手”去按原有的机械按键。这样做的好处是绝对安全、完全无损、通用性强几乎适用于任何带实体按键的电器改造。3. 硬件连接与电路详解3.1 元器件清单与接口说明动手之前请清点你的“手术器械包”主控板Seeeduino XIAO x1红外接收模块VS1838B 或类似38kHz红外接收头 x1。它通常有三只引脚VCC接3.3V、GND接地、OUT信号输出。继电器模块1路或2路继电器模块根据你的风扇按键数量决定。通常电源开关和调速开关是分开的可能需要2路x1。注意是“低电平触发”型。遥控器任意一个你不常用的红外遥控器电视、机顶盒、空调等。连接线母对母杜邦线若干。风扇你的改造对象。电源一个能给XIAO供电的5V USB电源如手机充电器和线。关于继电器模块这里需要多解释两句。继电器本质上是一个电控开关。我们用小电流来自XIAO的GPIO去控制一个线圈线圈产生磁力吸合内部的机械触点从而接通或断开一个大电流电路比如风扇的220V电路。但是在本项目中我们绝对不直接用继电器去控制220V强电我们的继电器触点只连接风扇内部按键的两端模拟手指的按压控制的仍然是风扇原有的低压控制电路。这是安全底线。3.2 接线图与安全要点接线是项目的物理基础务必仔细给XIAO供电用USB线连接XIAO和电脑或5V电源适配器。连接红外接收头红外接收头的VCC引脚 → XIAO的3.3V引脚。红外接收头的GND引脚 → XIAO的GND引脚。红外接收头的OUT或DAT引脚 → XIAO的D0引脚或其他任意数字引脚代码中需对应修改。连接继电器模块继电器模块的VCC引脚 → XIAO的5V引脚如果继电器模块支持3.3V逻辑接3.3V更佳。继电器模块的GND引脚 → XIAO的GND引脚。继电器模块的IN或SIG控制引脚 → XIAO的D1引脚用于控制电源开关。如果有多路第二路继电器的IN引脚 → XIAO的D2引脚用于控制调速。至关重要的安全警告在进行任何与风扇内部线路的连接前必须确保风扇已完全断电并拔掉电源插头。使用万用表确认你要连接的两个按键触点是不带电的。通常轻触开关的两个焊点就是我们的目标。将继电器模块的COM公共端和NO常开端触点分别用导线焊接或紧密连接到轻触开关的两个焊点上。这样当继电器吸合时COM和NO接通就相当于按下了开关。4. 软件环境搭建与核心代码解析4.1 Arduino IDE配置与库安装软件部分的第一步是搭建环境。去Arduino官网下载并安装最新版的Arduino IDE。安装完成后我们需要让IDE认识Seeeduino XIAO这块板子。添加开发板支持打开Arduino IDE点击文件-首选项。在“附加开发板管理器网址”中填入以下URLhttps://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json点击“好”。然后点击工具-开发板-开发板管理器...在搜索框中输入“Seeed SAMD”找到“Seeed SAMD Boards”点击安装。安装完成后你就可以在工具-开发板的下拉菜单中找到“Seeeduino XIAO”了。安装红外库点击项目-加载库-管理库...搜索“IRremote”。你会看到几个相关的库。我强烈推荐使用IRremote by shirriff, z3t0, ArminJo这个版本它对多种编码格式的支持非常完善且与SAMD架构XIAO的核心兼容性好。找到后点击安装。4.2 核心代码逻辑与键值学习代码是整个项目的灵魂。我们分块来理解。首先必不可少的头文件和引脚定义#include IRremote.h // 引入红外库 // 引脚定义 const int RECV_PIN 0; // 红外接收头接在XIAO的D0 const int RELAY_POWER_PIN 1; // 电源继电器控制引脚 D1 const int RELAY_SPEED_PIN 2; // 调速继电器控制引脚 D2 (如果有时) IRrecv irrecv(RECV_PIN); // 创建红外接收对象 decode_results results; // 用于存储解码结果的结构体 // 定义你的遥控器键值这里需要通过学习获得 unsigned long KEY_POWER 0xFFA25D; // 示例NEC编码的电源键值 unsigned long KEY_SPEED_UP 0xFF906F; // 示例风速 unsigned long KEY_SPEED_DOWN 0xFFE01F; // 示例风速-如何获得KEY_POWER这些具体的值这就需要一段“学习代码”。你可以先上传下面这个简单的代码到XIAO然后打开串口监视器波特率设为115200对着红外接收头按下遥控器上的键串口就会打印出对应的十六进制数值。#include IRremote.h const int RECV_PIN 0; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(115200); irrecv.enableIRIn(); // 启动红外接收 Serial.println(红外接收就绪请按下遥控器按键...); } void loop() { if (irrecv.decode(results)) { // 以十六进制格式打印解码值 Serial.print(收到红外信号解码值: 0x); Serial.println(results.value, HEX); irrecv.resume(); // 准备接收下一个信号 } }把你想用的按键值比如电源、风速、风速-记录下来替换掉上面主代码中的示例值。4.3 主循环逻辑与状态控制接下来是主逻辑部分。我们不仅要点动控制最好还能让风扇记住当前的状态比如当前是几档风。这就需要引入状态变量。// 状态变量 int fanSpeed 0; // 0表示关闭1、2、3表示档位 bool powerState false; // 风扇电源状态 void setup() { Serial.begin(115200); pinMode(RELAY_POWER_PIN, OUTPUT); pinMode(RELAY_SPEED_PIN, OUTPUT); digitalWrite(RELAY_POWER_PIN, HIGH); // 初始化继电器为断开状态低电平触发型HIGH为断开 digitalWrite(RELAY_SPEED_PIN, HIGH); irrecv.enableIRIn(); Serial.println(智能风扇遥控系统启动); } void loop() { if (irrecv.decode(results)) { Serial.print(收到红外码: 0x); Serial.println(results.value, HEX); // 判断接收到的键值并执行相应操作 if (results.value KEY_POWER) { togglePower(); // 切换电源 } else if (results.value KEY_SPEED_UP) { increaseSpeed(); // 增加风速 } else if (results.value KEY_SPEED_DOWN) { decreaseSpeed(); // 降低风速 } else { Serial.println(未识别的按键); } irrecv.resume(); // 继续接收 } // 这里可以添加其他非阻塞任务如传感器读取 }上面的代码框架中togglePower(),increaseSpeed()这些函数就是具体的执行函数。以togglePower()为例它的内部逻辑是void togglePower() { if (!powerState) { // 如果当前是关闭状态则开机 pulseRelay(RELAY_POWER_PIN); // 模拟按一下电源键 powerState true; fanSpeed 1; // 开机后默认1档 Serial.println(风扇已开启当前1档); } else { // 如果当前是开启状态则关机 pulseRelay(RELAY_POWER_PIN); powerState false; fanSpeed 0; Serial.println(风扇已关闭); } }而pulseRelay函数则是模拟短按动作的精髓void pulseRelay(int pin) { digitalWrite(pin, LOW); // 给继电器低电平使其吸合 delay(150); // 保持吸合150毫秒模拟人手按压时间 digitalWrite(pin, HIGH); // 恢复高电平继电器断开 }这个delay(150)是关键时间太短如50ms可能风扇控制电路识别不到时间太长如500ms则可能被误认为是长按。150-200ms是一个比较通用的经验值具体可以根据你的风扇反应微调。5. 进阶功能与调试技巧5.1 增加风速档位记忆与循环基础的开关键控实现了但风速调节如果只是简单的“按一下调速键”可能会和风扇本身的档位逻辑不同步。一个更鲁棒的方法是用XIAO来主动管理档位状态。我们假设风扇有3个档位且每次开机都从1档开始。我们可以让XIAO内部维护一个fanSpeed变量1,2,3。当收到“风速”指令时fanSpeed加1如果到3了就循环回1然后根据目标档位计算出需要按几次调速键。例如当前是1档要调到3档就需要让继电器模拟“按两下”调速键。void increaseSpeed() { if (!powerState) return; // 关机状态下不响应调速 int targetSpeed fanSpeed 1; if (targetSpeed 3) targetSpeed 1; // 循环 int pressesNeeded targetSpeed - fanSpeed; if (pressesNeeded 0) pressesNeeded 3; // 处理循环 for (int i 0; i pressesNeeded; i) { pulseRelay(RELAY_SPEED_PIN); delay(300); // 两次按键之间稍作延迟确保风扇电路能识别 } fanSpeed targetSpeed; Serial.print(风速已调整至: ); Serial.println(fanSpeed); }这种方法的好处是无论风扇实际处于什么状态比如被人手动按过XIAO内部都有一套自己的“逻辑状态”并通过主动发送多次脉冲来确保风扇物理状态与逻辑状态同步。虽然不能100%保证比如中途断电但可靠性比简单的点动高很多。5.2 红外信号接收不稳定的排查在实际调试中最常见的问题就是红外信号时灵时不灵。别慌按以下步骤排查检查供电红外接收头对电压稳定比较敏感。确保其VCC接的是稳定的3.3V并且GND连接良好。可以尝试在VCC和GND之间并联一个10uF~100uF的电解电容用于滤波。确认引脚与代码一致检查硬件连接的接收头OUT引脚是否与代码中RECV_PIN定义的引脚号一致。避免红外干扰强烈的环境光特别是日光灯、太阳光可能包含红外成分干扰接收。可以给接收头套上一小段黑色热缩管或使用不透明的外壳遮挡只留出接收窗。调整接收距离与角度遥控器要对准接收头初期测试距离在1-3米内最佳。某些接收头指向性较强需要稍微正对。利用串口调试确保打开了串口监视器并观察按下遥控器时是否有任何解码信息输出。如果完全没有输出检查接线和库是否安装正确。如果输出的是0xFFFFFFFFNEC编码的重复码这是正常的表示你一直按着同一个键。尝试不同的NEC解码有些遥控器虽然使用NEC协议但地址码和命令码是反的。IRremote库的decode_results结构体中results.decode_type可以查看解码类型results.address和results.command有时比results.value更可靠。你可以尝试打印这些值来匹配按键。5.3 继电器模块的选型与使用心得继电器模块看着简单选用不当也会导致问题。触发电平务必确认是高电平触发还是低电平触发。模块上通常会有标注如HIGH/LOW或H/L。XIAO的GPIO在输出低电平时驱动能力更强因此优先选择低电平触发Active LOW的模块。这样代码里digitalWrite(pin, LOW)是吸合HIGH是断开符合直觉且稳定。继电器触点类型我们只用到了常开NO触点。COM和NO在继电器线圈未通电时是断开的通电后闭合。千万不要接错成常闭NC触点。消除继电器动作干扰继电器线圈在通断瞬间会产生一个很高的反向电动势可能干扰单片机导致复位。模块本身应该集成有续流二极管通常是一个1N4007来消除这个干扰。如果你的模块没有或者为了更稳定可以在XIAO的5V和GND之间并联一个100uF的电解电容以及在3.3V和GND之间并联一个0.1uF的瓷片电容。实测技巧在连接到风扇内部线路前先用继电器模块控制一个LED灯或万用表通断档来测试。观察pulseRelay函数发出的150ms脉冲是否能稳定地让继电器“咔哒”响一声LED亮一下随即熄灭。这是验证代码逻辑和硬件连接是否正确的最安全方法。6. 项目优化与扩展思路一个基础可用的遥控风扇已经完成了但作为创客我们总想让它更“聪明”一点。这里有几个不增加太多复杂度的优化和扩展方向。6.1 增加状态反馈与指示目前我们通过串口打印知道风扇状态但普通用户看不到。可以增加一个RGB LED或OLED小屏幕。RGB LED用一颗WS2812灯珠即可。定义不同颜色红色常亮表示关机蓝色常亮表示开机绿色闪烁表示正在接收信号蓝色呼吸灯效果表示当前档位亮度或闪烁频率代表档位。这能极大提升交互体验。OLED屏幕使用I2C接口的0.96寸OLED可以显示更丰富的文字信息如“Power: ON”、“Speed: 2”、“Temp: 28°C”等。需要引入Adafruit_SSD1306和Adafruit_GFX库。6.2 引入环境传感器实现自动化这是让项目从“遥控”升级到“智能”的关键一步。添加一个DHT11或DHT22温湿度传感器。逻辑设计在loop()函数中定期比如每10秒读取温湿度。你可以设置一个温度阈值例如28°C。当温度高于阈值且风扇处于关闭状态时自动执行togglePower()开机并设置到合适档位。当温度低于阈值时自动关机。这样风扇就具备了基础的“环境感知”能力。注意事项自动控制逻辑和红外遥控手动控制之间要做好状态同步避免冲突。通常以最后一次手动指令为最高优先级。6.3 探索无线化与网络化Seeeduino XIAO本身没有Wi-Fi但你可以用极低的成本升级到Seeeduino XIAO ESP32C3或XIAO ESP32S3它们引脚兼容但内置了Wi-Fi和蓝牙。手机APP控制通过ESP32的蓝牙你可以编写一个简单的手机APP用MIT App Inventor或Blynk等平台用手机直接连接和控制风扇摆脱实体遥控器。接入智能家居平台通过ESP32的Wi-Fi可以接入Home Assistant、米家需破解或自己搭建的MQTT服务器。这样你就可以用智能音箱语音控制“小爱同学打开风扇”或者设置更复杂的自动化场景“如果室内温度高于30度且有人在家则打开风扇到2档”。6.4 电源管理的考量目前项目通过USB持续供电。如果想做得更独立可以考虑电池供电对于便携小风扇改造可行但对于落地扇电池方案不现实。从风扇内部取电这是高阶操作涉及强电必须有专业电工知识或指导理论上可以从风扇电机或控制板的低压侧比如经过变压器和整流稳压后的5V或12V电路引出电源经过一个降压模块如LM2596为XIAO提供稳定的5V或3.3V电源。这样只需要插一个风扇插头整个系统就供电了。但再次强调强电危险操作务必谨慎确保绝缘和隔离。这个项目麻雀虽小五脏俱全。它从最基础的信号输入输出讲起贯穿了硬件连接、库的使用、状态机逻辑、调试排错等多个嵌入式开发的核心环节。完成它你收获的不仅仅是一个能遥控的风扇更是一套解决类似“旧设备智能化”问题的通用方法论。下次遇到无法遥控的灯、窗帘、咖啡机你都知道该从哪里下手了。动手试试吧把想法变成现实的过程才是最有趣的。

相关新闻