基于Arduino与蓝牙模块的智能通知提醒灯DIY教程

发布时间:2026/7/29 8:18:19
基于Arduino与蓝牙模块的智能通知提醒灯DIY教程 1. 项目概述为什么我们需要一个物理通知提醒灯每天我们的手机屏幕会闪烁无数次微信消息、工作邮件、快递提醒、日程通知……这些数字信息洪流试图争夺我们有限的注意力。但问题也随之而来手机静音时我们可能错过重要来电手机放在包里或另一个房间我们可能对消息一无所知即便手机就在手边频繁解锁屏幕查看无关紧要的通知也是对专注力的巨大消耗。这个项目就是为了解决这个现代人的普遍痛点。它的核心思路是将虚拟的数字通知转化为一个直观、无干扰的物理光信号。我用一块最基础的Arduino开发板配合几个LED灯和一个蓝牙模块制作了一个可以放在桌面、书架或者任何你常待角落的“通知灯塔”。当手机收到特定应用的通知时这个灯塔就会亮起特定颜色和节奏的灯光比如微信是绿色呼吸邮件是蓝色闪烁紧急电话是红色快闪。你无需触碰手机抬眼一看便知轻重缓急。这不仅仅是一个极客玩具更是一种提升生活和工作效率的“环境交互”设计。它剥离了信息的繁杂载体手机屏幕上的图标、文字、声音只保留了最本质的“有通知”和“通知类型”这两个信号让你能更自主地决定何时中断手头工作去处理信息。对于需要深度工作的程序员、设计师、写作者或者单纯不想被手机“绑架”的任何人这个小装置都堪称神器。接下来我将完整拆解从构思到实现的每一个步骤包括硬件选型的考量、代码逻辑的梳理、手机端配置的细节以及我踩过的那些坑和最终打磨出的稳定方案。即使你只有最基础的Arduino入门知识也能跟着做出来。2. 硬件选型与电路设计解析工欲善其事必先利其器。硬件的选择直接决定了项目的可行性、稳定性和最终体验。我的核心设计目标是低成本、易实现、高可靠、可扩展。2.1 核心控制器为什么是Arduino Nano市面上Arduino板型众多Uno、Mega、Leonardo、Nano等等。我最终选择了Arduino Nano原因有三点尺寸与集成度Nano板子非常小巧自带USB转串口芯片CH340或FTDI可以直接通过Micro USB线供电和编程省去了Uno那样需要额外USB线或外部供电的麻烦成品可以做得更紧凑。引脚与性能它拥有和Uno几乎相同的ATmega328P核心与I/O引脚数量22个数字I/O8个模拟输入性能完全足够驱动多个LED和通信模块且价格通常比Uno更便宜。焊接友好Nano有两种版本一种是带排针的一种是只有焊盘的。我推荐选择带排针的方便用杜邦线连接也方便后续固定到洞洞板或定制PCB上。注意购买时请认准CH340芯片版本它在Mac和Windows上的驱动安装都比老旧的FTDI芯片更简单、更稳定。2.2 通信模块蓝牙HC-05 vs. HC-06 vs. 蓝牙BLE让Arduino和手机对话蓝牙是最无线、最便捷的方案。这里有几个关键选择经典蓝牙HC-05/HC-06这是最成熟、最通用的方案。HC-05和HC-06核心区别在于HC-05既可以作为主机主动连接其他设备也可以作为从机被连接而HC-06只能作为从机。在我们的场景里Arduino始终作为从机等待手机连接所以HC-06就足够了且通常更便宜。它的优点是连接稳定传输简单基于串口透传 Arduino代码编写极其容易。缺点是功耗相对BLE稍高但对我们这个一直插着USB供电的桌面设备来说可以忽略。低功耗蓝牙BLE如HM-10这是更新的技术功耗极低。但BLE的编程逻辑与经典蓝牙完全不同它基于服务和特征值Arduino端代码复杂得多手机端APP也需要专门支持BLE的库。对于我们这个只需要单向发送简单指令如“微信新消息”的项目来说杀鸡用牛刀增加了不必要的复杂度。结论优先选择HC-06蓝牙模块。它价格低廉约10元接线简单仅VCC、GND、TXD、RXD四根线通信稳定是性价比之王。2.3 执行单元LED灯与驱动灯光是信息的载体选择什么样的灯至关重要。普通LED单色、便宜但一个灯只能代表一种通知扩展性差。如果想表示多种APP就需要多个LED占用I/O口多电路杂乱。RGB LED共阴极这是本项目的最佳选择。一个RGB LED通过红、绿、蓝三个引脚PWM调光可以混合出几乎任何颜色。这意味着你可以用一个物理灯通过赋予不同颜色微信绿色邮件蓝色电话红色来代表多种通知类型。我选用的是常见的5mm共阴极RGB LED需要三个220Ω的限流电阻分别连接到红、绿、蓝引脚。WS2812B RGB灯带/灯珠这是更高级的选择每个灯珠内部集成了驱动芯片只需要一根数据线就能控制成百上千个灯且颜色更鲜艳控制更精准。但它的编程需要用到Adafruit_NeoPixel等专用库对于初学者稍有门槛。如果你未来想玩更复杂的灯光效果如彩虹流、进度条可以考虑。本项目为求简洁通用仍以单个RGB LED为例。电路连接示意图核心部分Arduino Nano -- HC-06蓝牙模块 5V/VIN ------------- VCC GND ------------- GND D2 (RX) ------------- TXD D3 (TX) ------------- RXD 注意Arduino的RX接模块的TXTX接模块的RX Arduino Nano -- 共阴极RGB LED D9 (PWM) --[220Ω电阻]-- Red引脚 D10 (PWM) --[220Ω电阻]-- Green引脚 D11 (PWM) --[220Ω电阻]-- Blue引脚 LED共阴极引脚 ------------- GND使用PWM引脚数字引脚旁带~符号的是为了实现呼吸灯等亮度渐变效果。2.4 电源与其他电源开发调试阶段直接用电脑USB口给Arduino Nano供电即可。成品阶段可以找一个5V/1A的手机充电头供电非常方便。外壳与散热建议用一个白色半透明的塑料小盒子做外壳既能柔化光线看起来也更美观。长时间点亮LED无需考虑散热问题。3. 软件逻辑与Arduino代码实现硬件是躯体软件是灵魂。Arduino端的代码需要完成两件核心任务稳定地与手机蓝牙通信以及根据指令驱动LED显示对应的灯光模式。3.1 通信协议设计简单至上手机APP和Arduino之间需要一种“语言”来沟通。我们设计一个极其简单的单字符指令协议W- 微信通知绿色呼吸灯E- 邮件通知蓝色闪烁C- 来电提醒红色快闪O- 其他/默认通知黄色亮起X- 清除/关闭所有灯光为什么用单字符因为通过蓝牙串口传输一个字符就是一个字节处理起来最快最可靠没有解析复杂字符串的负担和出错风险。3.2 Arduino核心代码拆解下面是我经过多次调试和优化的核心代码并附上详细注释。// 定义RGB LED引脚 const int redPin 9; const int greenPin 10; const int bluePin 11; // 定义当前灯光模式 char currentMode X; // 初始为关闭状态 unsigned long previousMillis 0; // 用于非阻塞定时 int blinkInterval 500; // 闪烁间隔毫秒 bool ledState LOW; // 闪烁状态标志 int breatheValue 0; // 呼吸灯亮度值 int breatheDirection 5; // 呼吸灯亮度变化步进 void setup() { // 初始化串口通信用于调试连接电脑 Serial.begin(9600); // 初始化软串口用于连接HC-06蓝牙模块 // 使用SoftwareSerial库可以避免占用硬件串口方便调试 // 注意将蓝牙模块的TX接D2(RX) RX接D3(TX) Serial.begin(9600); // 硬件串口仍可用于打印日志 // 实际项目中如果只用蓝牙可以直接用硬件串口Serial但会占用与电脑通信的端口 // 这里为演示清晰假设我们使用SoftwareSerial // #include SoftwareSerial.h // SoftwareSerial bluetooth(2, 3); // RX, TX // bluetooth.begin(9600); // 初始化LED引脚为输出模式 pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); // 初始关闭所有LED setColor(0, 0, 0); Serial.println(通知提醒灯已启动等待蓝牙指令...); } void loop() { // 1. 检查蓝牙串口是否有指令传入 // 这里用Serial模拟蓝牙串口实际替换为你的软串口对象如 bluetooth.available() if (Serial.available() 0) { char incomingByte Serial.read(); Serial.print(收到指令: ); Serial.println(incomingByte); // 过滤有效指令 if (incomingByte W || incomingByte E || incomingByte C || incomingByte O || incomingByte X) { currentMode incomingByte; // 切换模式时重置状态变量 previousMillis millis(); ledState LOW; breatheValue 0; breatheDirection 5; } } // 2. 根据当前模式执行对应的灯光效果非阻塞方式 unsigned long currentMillis millis(); switch (currentMode) { case W: // 微信绿色呼吸灯 // 呼吸灯效果亮度从0到255再到0循环 analogWrite(redPin, 0); analogWrite(bluePin, 0); analogWrite(greenPin, breatheValue); breatheValue breatheDirection; if (breatheValue 255 || breatheValue 0) { breatheDirection -breatheDirection; } delay(20); // 呼吸速度控制可调整 break; case E: // 邮件蓝色闪烁每秒一次 if (currentMillis - previousMillis blinkInterval) { previousMillis currentMillis; ledState !ledState; setColor(0, 0, ledState ? 255 : 0); // 蓝色全亮或全灭 } break; case C: // 来电红色快闪每秒四次 if (currentMillis - previousMillis 125) { // 1000ms / 8 125ms 一次状态切换 previousMillis currentMillis; ledState !ledState; setColor(ledState ? 255 : 0, 0, 0); // 红色全亮或全灭 } break; case O: // 其他黄色常亮 setColor(255, 100, 0); // 混合出黄色 break; case X: // 关闭 default: setColor(0, 0, 0); break; } } // 辅助函数一次性设置RGB颜色 void setColor(int red, int green, int blue) { analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }代码关键点解析非阻塞延时整个loop()函数的核心是使用millis()函数进行非阻塞定时。这是Arduino编程的黄金法则。绝对不要在loop里使用delay()来控制闪烁因为delay会冻结整个程序导致无法及时接收蓝牙指令。我们用currentMillis - previousMillis interval来判断是否该执行下一个动作这样主循环始终是流畅的。状态机模式用一个currentMode变量来记录当前应该执行哪种灯光效果。收到新指令就切换模式并重置相关的计时器和状态变量。这种结构清晰易于扩展新的灯光模式。PWM调光analogWrite(pin, value)中的value范围是0-255用于控制亮度。呼吸灯效果就是通过循环改变这个值来实现的。调试信息通过Serial.println()输出状态到串口监视器在调试阶段至关重要可以确认是否收到了正确的指令。实操心得在编写呼吸灯效果时delay(20)是放在case W内部的它确实会轻微阻塞但因为呼吸灯模式本身不需要高频响应指令且20ms很短可以接受。如果你追求极致的响应速度可以把呼吸灯的亮度计算也改造成基于millis()的非阻塞形式但这会稍微增加代码复杂度。对于这个项目当前的折中方案是实践中最稳定的。4. 手机端通知捕获与转发方案这是项目的另一个核心也是让很多初学者感到困惑的地方手机上的通知怎么才能自动发送到蓝牙模块我们需要一个“桥梁”APP。这里根据手机系统提供两种主流方案。4.1 Android方案Tasker Bluetooth Auto ConnectAndroid系统由于其开放性是实现此功能最灵活的平台。Tasker是一款强大的自动化神器几乎可以操控手机的任何设置和状态。配置步骤安装应用在Google Play商店购买安装Tasker需付费但绝对物超所值。同时安装插件应用“蓝牙自动连接” (Bluetooth Auto Connect)和“通知监听” (Notification Listener)。配对蓝牙在手机的系统设置中像连接普通蓝牙耳机一样搜索并配对你的HC-06模块默认配对码通常是1234或0000。Tasker配置概览我们需要创建两个“配置文件”(Profile)。一个用于触发收到通知一个用于连接确保蓝牙已连接。创建“通知触发”配置文件新建Profile - Event - Plugin - Notification Listener。配置在“通知事件”选择“已发布”在“应用程序”里勾选你关心的APP如微信、Gmail、电话。可以进一步在“标题/文本”里设置关键词过滤如包含“老板”的邮件才触发。链接到一个新的“任务”(Task)。创建“发送指令”任务在这个任务里添加动作网络-HTTP请求。这里是个关键技巧我们并不直接通过Tasker发蓝牙数据虽然可以但麻烦。更优雅的方式是利用一个叫**“Serial Bluetooth Terminal”** 的免费APP。我们让Tasker通过HTTP GET请求去触发这个APP发送预设的指令。在Serial Bluetooth Terminal里你可以创建多个“宏”(Macros)每个宏就是发送一个字符如W并指定发送到已配对的HC-06设备。然后在Tasker的HTTP请求动作中URL填写形如http://localhost:8080/macro/W具体URL需根据Serial Bluetooth Terminal提供的HTTP API接口来设置该APP内置了一个简单的Web服务器用于接收外部指令。这样当微信通知到来Tasker触发发送一个HTTP请求Serial Bluetooth Terminal收到后就自动通过蓝牙向Arduino发送字符W。创建“保持连接”配置文件可选但推荐新建Profile - State - Net - BT Connected。选择你的HC-06设备。链接到一个任务这个任务可以是一个等待Wait动作后接一个“蓝牙连接”动作用于在断线时尝试重连。这个方案看似步骤多但一旦配置好就一劳永逸稳定且强大可以精细控制每一个APP的每一种通知。4.2 iOS方案Shortcuts快捷指令的局限与变通iOS系统出于安全和隐私限制第三方APP无法实时、静默地监听所有通知。因此我们无法实现Android那样完全自动化的方案。但仍有变通方法虽然需要一次手动触发但后续可以半自动运行。变通方案使用“专注模式”触发配对蓝牙在iOS设置中配对HC-06。安装辅助APP在App Store搜索安装“BluTerm”或“Serial Tool”这类支持蓝牙串口的终端APP。在APP内连接到你的HC-06设备并测试发送W, E, C等字符能否控制Arduino灯。利用“快捷指令”自动化打开“快捷指令”APP创建个人自动化。触发器选择当“专注模式”打开时- 选择你为此项目新建的一个专注模式例如命名为“工作勿扰”。添加操作打开APP- 选择你安装的蓝牙串口APP如BluTerm。继续添加操作等待2秒钟给APP启动和连接蓝牙留出时间。继续添加操作通过URL运行快捷指令。这里需要一点技巧你需要先创建一个独立的“发送通知指令”的快捷指令。创建“发送通知指令”子快捷指令新建快捷指令添加文本操作内容就是单个字符如W。添加编码Base64操作因为某些传递方式需要。添加URL操作URL格式为bluterm://send?data[Base64编码后的文本]。这个URL Scheme因APP而异需要查阅你所用蓝牙终端APP的文档看是否支持通过URL Scheme发送数据。添加打开URL操作。回到自动化在“通过URL运行快捷指令”中选择你刚创建的那个子快捷指令。使用流程当你需要开启通知灯功能时手动在控制中心打开名为“工作勿扰”的专注模式。这会自动触发快捷指令打开蓝牙APP - 等待 - 发送连接指令如果需要- 发送灯光控制指令。你可以为不同专注模式设置不同的默认灯光状态。重要提示iOS方案无法实现真正的“通知到达即触发”这是系统限制。上述方案更像是一个手动开关的情景模式。如果追求全自动可能需要越狱或使用其他非标准手段这里不做讨论。5. 组装、调试与优化心得当代码写好手机端也配置完毕后就到了最激动人心的实体组装和调试阶段。这个过程会遇到很多预料之外的问题也是积累经验的关键。5.1 硬件组装与焊接在面包板上原型测试务必先在面包板上搭建整个电路并上传最基本的测试代码例如让RGB LED循环显示红绿蓝三色确保所有元件和连线都是好的。焊接与布局测试无误后可以转移到洞洞板进行焊接。布局原则是Arduino Nano放在中央。HC-06模块最好竖着插在排母上或者用排针焊接固定注意天线部分通常有陶瓷天线或PCB天线不要被金属大面积遮挡。RGB LED通过三条长导线引出方便后期调整灯的位置和朝向。电源正负极5V和GND走线要粗一些并在关键芯片附近加上0.1uF的瓷片电容进行电源滤波能极大提高蓝牙模块的稳定性。外壳设计找一个大小合适的塑料盒。在顶部开孔固定LED可以在LED上方加一小段热缩管或乳白色的塑料片作为柔光罩让光线更均匀柔和。在侧面开孔引出USB电源线。蓝牙模块的天线区域对应的外壳部分尽量避免使用金属材质。5.2 软件联调与故障排查这是问题高发区我整理了最常见的几个坑及其解决方案。问题1蓝牙连接不稳定频繁断开。可能原因A电源干扰。HC-06对电源质量敏感。如果和Arduino共用电脑USB口的5V当Arduino执行某些耗电操作时电压可能有微小波动。解决在HC-06的VCC和GND之间焊接一个100uF的电解电容进行储能滤波效果立竿见影。可能原因B串口波特率不匹配。HC-06默认波特率通常是9600但有些批次可能是38400或115200。解决用USB转TTL模块单独连接HC-06通过AT指令ATUART?查询并设置其波特率为9600。AT指令模式需要将HC-06的KEY或EN引脚接高电平再上电进入。可能原因C手机端APP或系统省电策略。解决在手机设置中将你使用的蓝牙串口APP如Serial Bluetooth Terminal的电池优化设置为“无限制”并允许其后台活动。问题2手机搜不到HC-06蓝牙信号。可能原因模块处于AT指令模式或者未进入配对状态。解决确保KEY引脚悬空或接低电平正常通信模式然后重新上电。此时模块上的LED应该呈现慢闪约每秒一次表示进入可配对状态。如果LED快闪说明已连接如果LED常亮说明在AT指令模式。问题3灯光效果卡顿或不流畅。可能原因loop函数中有阻塞性代码或者串口接收处理不当。解决再次检查代码确保所有延时和动画都基于millis()实现。串口读取使用Serial.read()而非Serial.readString()后者可能因等待字符串结束符而阻塞。确保loop循环一次的执行时间非常短。问题4不同颜色混合不准确比如黄色偏绿。可能原因RGB LED中红、绿、蓝三种芯片的发光效率不同。通常红色和蓝色需要更高的PWM值才能达到与绿色相同的视觉亮度。解决进行“白平衡”校准。写一个测试程序分别让红、绿、蓝单独以255亮度点亮观察哪个最刺眼。然后调整你的setColor函数为效率高的颜色通常是绿色乘以一个小于1的系数。例如setColor(r, g*0.7, b)。这需要你肉眼观察调整直到混合出的白色看起来最正。5.3 功能扩展与优化思路基础版本完成后你可以考虑以下升级让这个小工具更智能增加声音或震动反馈并联一个蜂鸣器或微型振动电机在重要通知如来电时增加声音或震动提示多感官提醒。网络化与远程通知将Arduino Nano替换为ESP8266如NodeMCU或ESP32。它们自带Wi-Fi可以通过MQTT协议连接到家中的路由器或互联网云服务如Blynk、IFTTT。这样即使你不在家手机收到通知后也可以通过互联网让家里的灯闪烁实现真正的远程感知。多灯与位置编码使用多个RGB LED或WS2812B灯带用灯光的位置来编码信息。例如一排8个灯第一个灯代表微信第二个代表钉钉……哪个APP来通知对应的灯就亮起。信息量更大。光强自适应加一个光敏电阻检测环境光亮度。晚上自动降低LED亮度白天或光线强时自动提高亮度既保证可见又不刺眼。物理交互在灯盒上装一个触摸传感器或按钮。轻触可以切换模式如常亮、呼吸、关闭或标记通知已读。这个项目从构思到实现贯穿了硬件连接、嵌入式编程、无线通信和手机自动化等多个有趣的知识点。它最吸引人的地方在于你用几十元的成本亲手创造了一个能真切改善日常数字生活体验的实体工具。当它第一次随着你的微信消息而缓缓呼吸时那种创造力和实用价值结合带来的满足感是单纯购买一个成品无法比拟的。希望这份详细的指南能帮你顺利点亮属于自己的那盏“通知灯塔”。