1. 项目概述为听障人士设计的智能房间控制器最近在捣鼓一个挺有意义的项目叫“Smart Room Controller for the Hearing Impaired”直译过来就是“面向听障人士的智能房间控制器”。这个项目的核心想法其实很简单但做起来却充满了细节和挑战我们如何让一个听不到声音的人也能自如地、甚至更便捷地掌控他/她所处的物理环境比如门铃响了、水烧开了、婴儿在隔壁哭了或者烟雾报警器在尖叫——这些对常人而言靠听觉就能瞬间捕捉的信息对听障朋友来说却是空白。我最初接触这个需求是源于一位朋友的家庭。他家里有长辈听力严重受损传统的声光报警器光太弱常常错过重要提醒。市面上的一些智能家居产品要么太贵要么集成度太高、不够灵活无法针对听障人士的特殊感知方式进行定制化反馈。于是我就琢磨着能不能用我们手头常见的开源硬件比如Arduino或者功能更强的Teensy配合C写点代码自己攒一个出来这不只是一个电子制作更是一次将技术转化为无障碍关怀的实践。这个控制器本质上是一个多通道的环境信息感知与触觉/视觉反馈中枢。它通过连接各种传感器如震动传感器、红外感应、按钮来捕捉“事件”然后将这些事件转化为强烈的、不容忽视的视觉信号如特定频率闪烁的RGB LED灯带、OLED屏幕上的大图标和触觉信号如不同模式的震动马达。整个系统的“大脑”我选择了Teensy 4.0因为它性能强悍能轻松处理多路输入输出和复杂的逻辑判断而且其Arduino兼容的生态让开发变得友好。编程语言自然是C在Arduino IDE或VSCode里都能写我们需要用它来定义事件、编排反馈逻辑、管理外设驱动。无论你是对嵌入式开发感兴趣的初学者想做一个有温度的项目还是有一定经验的开发者希望深入理解如何为特殊需求设计交互系统亦或是关心无障碍科技的朋友这个项目都能给你带来从硬件选型、电路设计、到固件编程、用户体验设计的一整套实战经验。接下来我就把这几个月从构思、踩坑到调试成功的过程掰开揉碎了和大家聊聊。2. 核心系统架构与设计思路做一个系统最怕一开始就埋头焊电路、写代码结果发现架构不合理后期改起来伤筋动骨。对于这个听障人士控制器我花了相当多的时间在前期设计上核心思路就八个字感知替代反馈增强。2.1 需求分析与设计原则听障人士并非失去所有感知他们的视觉、触觉往往更加敏锐。因此我们的设计必须遵循几个关键原则冗余与多重反馈重要事件必须同时提供视觉和触觉两种反馈确保在任何环境如强光下触觉更有效黑暗中视觉更突出下都能被可靠感知。差异化与优先级不同事件如火警、门铃、定时提醒的紧急程度不同反馈必须有明显差异。比如火警需要最高优先级的全红光闪烁最强震动而水烧开可能只是温和的蓝光闪烁短促震动。低学习成本与直觉化反馈模式要直观。比如门铃的反馈可以模拟“敲门”的震动节奏来自左侧传感器的报警左侧的LED灯带就亮起。系统可靠性与低功耗这很可能是一个需要7x24小时工作的设备稳定性和功耗必须考虑。基于这些原则我画出了系统的核心架构图在脑子里这里用文字描述一个以Teensy 4.0为核心的主控板它身上挂载了多路数字/模拟输入接口用于连接传感器以及多路PWM和数字输出用于驱动反馈设备。整个系统的逻辑由C固件控制它不断轮询或中断监听输入状态根据预定义的事件映射表触发相应的输出组合。2.2 硬件平台选型为什么是Teensy 4.0很多人第一反应可能是用Arduino Uno。Uno确实经典、易上手但对于我们这个项目它有几个硬伤处理能力有限ATmega328P主频16MHz、内存小2KB RAM、引脚数量勉强够用。当我们需要同时处理多个传感器输入、驱动RGB LED灯带这很耗内存和CPU、控制多个震动马达并管理一块OLED屏时Uno会非常吃力程序容易卡顿或崩溃。Teensy 4.0几乎是碾压级的选择性能怪兽ARM Cortex-M7处理器主频600MHz是Uno的37.5倍拥有1024KB RAM和2048KB Flash。这意味着我们可以写更复杂的逻辑使用更大的缓冲区来处理LED动画和屏幕刷新毫无压力。丰富的IO提供了大量的数字IO、模拟输入、硬件串口和PWM引脚扩展性极佳。完美的Arduino兼容性它可以通过Teensyduino插件在Arduino IDE中使用库生态丰富学习曲线平缓。对于熟悉Arduino的开发者来说迁移到Teensy几乎没有障碍。原生USB支持可以模拟键盘、鼠标、串口等方便后期调试和扩展比如连接电脑发送通知。当然它的价格比Uno高但对于一个追求稳定、高效和扩展性的项目来说这笔投资非常值得。如果你预算极其有限且需求非常简单比如只控制一两个反馈Arduino Nano或ESP32自带Wi-Fi/蓝牙也是备选但ESP32在纯本地控制、实时性要求极高的场景下其复杂的两核调度和无线功能可能带来不必要的复杂性。2.3 传感器与反馈执行器选型输入感知和输出反馈是系统的四肢。输入侧传感器门铃按钮最普通的常开按钮即可。我们通过Teensy的数字输入引脚检测按钮是否被按下电平从高到低的变化。震动传感器SW-420用于感知敲门或物品掉落引起的震动。它输出开关量信号连接数字输入引脚。需要注意调整其灵敏度电位器避免因正常走路等微弱震动误触发。红外热释电传感器HC-SR501检测人体移动。可以用于实现“有人进入房间时自动点亮主照明灯带”的功能作为环境辅助。烟雾传感器MQ-2模拟量输出需要连接Teensy的模拟输入引脚。通过测量其输出电压判断烟雾浓度是否超过阈值。注意本项目中的烟雾传感器仅用于学习原型验证绝对不能替代符合国家标准的专业烟雾报警器实际家居安全请务必安装认证产品。水沸报警器可以用一个简单的温度传感器如DS18B20靠近水壶或者用一个麦克风模块捕捉水沸腾时特定的声音频率这对听障设备是个有趣的挑战我们用设备“听”。输出侧反馈器RGB LED灯带WS2812B视觉反馈的主力。只需一根数据线连接Teensy的一个数字引脚就能控制上百个LED。我们可以编程实现任何颜色、任何闪烁模式。例如用红色快速闪烁表示火警用绿色波浪效果表示有人敲门。震动马达硬币型触觉反馈的核心。需要连接一个晶体管如MOSFET或电机驱动模块如L298N来驱动因为Teensy的引脚驱动电流有限。通过PWM可以控制震动的强度。OLED显示屏SSD1306, 0.96英寸用于显示清晰的文字或图标信息比如“Front Door”、“Smoke Alert”、“Timer Done”。通过I2C接口与Teensy连接占用引脚少。高亮度LED作为强化的定点光源提示比如在门口安装一个高亮红色LED门铃触发时它常亮。整个系统的供电需要仔细计算。Teensy 4.0本身耗电不大约100mA但LED灯带全亮时电流惊人每颗LED约60mA10颗就是600mA。因此必须选择一个能提供至少5V/2A的稳压电源并确保电源线径足够粗避免发热。3. 电路设计与核心模块连接详解有了设计图下一步就是动手把各个模块“攒”到一起。电路连接是项目的骨架连接不当轻则功能失常重则烧毁芯片。这里我详细拆解几个关键部分的连接方法和原理。3.1 主控板供电与基础电路Teensy 4.0的供电相对灵活可以通过USB口5V或VIN引脚3.6V-5.5V供电。为了系统稳定我选择使用一个5V/2.5A的直流电源适配器正极接VIN负极接GND。非常重要的一点整个系统必须共地也就是说电源的GND、Teensy的GND、所有传感器和驱动模块的GND都必须用导线连接在一起形成一个统一的参考零电位。否则信号会乱飘无法正常读取。在VIN和GND之间我并联了一个100μF的电解电容和一个0.1μF的陶瓷电容靠近Teensy放置。这叫去耦电容大电容负责应对负载突变如LED灯带突然全亮引起的电压跌落小电容负责滤除高频噪声。这是保证数字电路稳定工作的标准操作。3.2 数字输入模块连接以按钮和震动传感器为例按钮和SW-420震动传感器都是开关量输入。连接方式采用经典的“上拉电阻”接法。传感器信号线S接Teensy的某个数字引脚如引脚2。该引脚通过一个10kΩ的电阻Teensy内部已具备上拉电阻可通过软件启用但外部上拉更可靠连接到3.3VTeensy的逻辑高电平是3.3V注意不是5V。传感器的GND接系统GND。对于按钮另一端接GND对于SW-420其VCC接5V或3.3V看模块支持。这样当传感器未被触发开关断开时输入引脚被上拉电阻拉到高电平3.3V代码中读到HIGH。当按钮被按下或震动触发开关闭合时引脚直接连接到GND电平被拉低至0V代码中读到LOW。我们通过检测这个从HIGH到LOW的下降沿来判定事件发生。注意Teensy 4.0的IO引脚是3.3V耐受的绝对不能直接接入5V信号如果传感器模块输出是5V电平很多模块是需要使用电平转换模块或者选择支持3.3V逻辑的传感器版本。3.3 模拟输入模块连接以MQ-2烟雾传感器为例MQ-2有4个引脚VCC接5V、GND、DO数字输出本例不用、AO模拟输出。VCC接5V电源正极。GND接系统GND。AO引脚接Teensy的某个模拟输入引脚如A0。 MQ-2的AO引脚会输出一个0-5V之间的电压浓度越高电压越高。由于Teensy的模拟输入引脚只能接受0-3.3V的电压直接连接会烧毁Teensy必须进行分压。我使用两个电阻组成分压电路将AO接到一个10kΩ电阻的一端该电阻另一端接Teensy的A0引脚和另一个20kΩ电阻的一端20kΩ电阻的另一端接GND。这样AO的5V电压经过分压到A0引脚就变成了大约5V * (20k / (10k20k)) ≈ 3.33V处于安全范围内。在代码中我们使用analogRead(A0)读取一个0-1023的值对应0-3.3V再通过阈值判断是否报警。3.4 输出驱动模块连接以RGB LED灯带和震动马达为例WS2812B RGB LED灯带的连接非常简单灯带的5V和GND分别接外部5V/2A电源的正负极切勿仅用Teensy的USB供电电流绝对不够。灯带的Data In接Teensy的某个数字引脚如引脚6。最好在数据线靠近Teensy的一端串联一个220Ω-470Ω的电阻用于阻尼可能的数据反射提高信号稳定性。在数据线引脚和Teensy GND之间再并联一个0.1μF电容滤除噪声。震动马达的驱动需要小心因为马达是感性负载工作时会产生反向电动势。驱动电路如下震动马达的正极接一个MOSFET如IRF520N的漏极D。MOSFET的源极S接GND。MOSFET的栅极G通过一个220Ω电阻连接到Teensy的一个PWM引脚如引脚3。这个电阻限制栅极充电电流保护Teensy引脚。在震动马达两端正负极之间反向并联一个续流二极管如1N4007阴极接马达正极阳极接负极。这个二极管至关重要它为马达断电时产生的反向电动势提供泄放回路防止高压尖峰击穿MOSFET或干扰Teensy。最后将马达的电源正极通过MOSFET前接到5V电源。当Teensy的PWM引脚输出高电平时MOSFET导通马达通电震动输出低电平时MOSFET关闭马达停止。通过调节PWM的占空比可以控制震动的强度。4. 固件编程C逻辑与状态机实现硬件搭好了接下来就是赋予它灵魂的代码部分。我们用C在Arduino IDE里为Teensy编程。整个程序的核心是一个状态机State Machine它清晰地管理着各种事件和反馈状态。4.1 开发环境搭建与库管理首先去PJRC官网下载并安装Teensyduino插件到你的Arduino IDE。安装后在“工具”-“开发板”里就能选择“Teensy 4.0”。串口选择也会自动识别。我们需要用到几个关键的库FastLED用于驱动WS2812B灯带比Adafruit_NeoPixel库性能更高效果更流畅。Adafruit_GFXAdafruit_SSD1306用于驱动OLED显示屏。Bounce2用于处理按钮等机械开关的消抖。机械开关在按下瞬间会产生一连串抖动的电信号这个库能帮我们滤除抖动确保一次按压只触发一次事件。在Arduino IDE中通过“项目”-“加载库”-“管理库”来搜索并安装这些库。4.2 核心数据结构与事件定义在程序开头我们先定义系统中所用的所有事件和反馈类型用枚举enum来让代码更清晰。// 事件类型枚举 enum EventType { EVENT_NONE 0, EVENT_DOORBELL, // 门铃 EVENT_KNOCK, // 敲门 EVENT_SMOKE_ALERT, // 烟雾报警 EVENT_WATER_BOILED, // 水沸 EVENT_MOTION_DETECTED, // 移动检测 EVENT_TIMER_1, // 定时器1 EVENT_TIMER_2 // 定时器2 }; // 反馈类型枚举 enum FeedbackType { FEEDBACK_VISUAL_LED 0, FEEDBACK_VISUAL_OLED, FEEDBACK_TACTILE }; // 事件结构体 struct SystemEvent { EventType type; unsigned long startTime; // 事件发生的时间戳millis() int priority; // 优先级数字越小优先级越高 bool isActive; // 事件是否仍处于激活状态如长报警 };然后我们定义一个EventFeedbackMap结构体数组用来建立事件到反馈的映射关系。这就是系统的“行为配置表”。struct EventFeedbackMap { EventType event; struct { uint32_t ledColor; // LED颜色 (FastLED的CRGB格式) uint8_t ledPattern; // 闪烁模式 (0:常亮, 1:快闪, 2:慢闪, 3:呼吸...) const char* oledText; // OLED显示文本 uint16_t vibeIntensity; // 震动强度 (0-255 PWM值) uint8_t vibePattern; // 震动模式 (0:单次, 1:脉冲, 2:持续) unsigned long duration; // 反馈持续时间(ms)0表示持续到事件解除 } feedback; }; // 实例化配置表 EventFeedbackMap feedbackMap[] { {EVENT_DOORBELL, {CRGB::Green, 1, Doorbell, 200, 1, 5000}}, {EVENT_SMOKE_ALERT, {CRGB::Red, 1, FIRE! SMOKE!, 255, 2, 0}}, // 持续报警直到手动解除 {EVENT_WATER_BOILED,{CRGB::Blue, 3, Water Boiled, 150, 0, 3000}}, // ... 其他事件映射 };4.3 主循环与状态机逻辑setup()函数中我们初始化所有硬件串口、引脚模式、LED灯带、OLED屏、加载配置等。loop()函数是核心它应该尽可能快地循环执行。我们实现一个非阻塞式的状态机避免使用delay()这样才能及时响应多个事件。void loop() { unsigned long currentMillis millis(); // 获取当前时间 // 1. 检测输入事件采集 checkInputs(currentMillis); // 2. 更新事件状态机 updateEventStateMachine(currentMillis); // 3. 根据活跃事件执行反馈输出 applyFeedback(currentMillis); // 4. 其他后台任务如OLED刷新可以放在定时中断里 updateDisplay(); }checkInputs函数负责轮询或中断检测所有传感器。对于按钮使用Bounce库更新状态并检测下降沿。对于模拟传感器如MQ-2读取模拟值并与阈值比较如果连续几次超过阈值则判定为有效事件防止误报。updateEventStateMachine函数是大脑中的决策层。它维护一个SystemEvent activeEvents[MAX_EVENTS]数组。当checkInputs检测到新事件时就将其添加到数组如果优先级高于已存在的事件可能还需要打断或合并当前反馈。同时它检查每个活跃事件的持续时间是否到期如果到期则将其标记为isActive false。applyFeedback函数是执行层。它遍历activeEvents数组找出当前优先级最高的事件或按某种策略混合多个事件然后根据feedbackMap中的配置去控制LED灯带、震动马达和OLED屏。对于LED可能调用FastLED库的函数根据ledPattern生成动画。对于震动马达根据vibePattern和vibeIntensity使用analogWrite()输出PWM波。对于OLED显示对应的oledText。这种状态机设计使得系统能够优雅地处理事件冲突比如火警和门铃同时发生火警优先、反馈叠加在非冲突情况下LED显示一种模式震动执行另一种和超时管理。4.4 关键代码片段解析消抖与中断处理以门铃按钮为例展示如何使用Bounce2库实现可靠的检测#include Bounce2.h Bounce doorbellButton Bounce(); // 创建Bounce对象 void setup() { pinMode(DOORBELL_PIN, INPUT_PULLUP); // 启用内部上拉电阻 doorbellButton.attach(DOORBELL_PIN); doorbellButton.interval(25); // 设置消抖间隔为25毫秒 } void checkInputs(unsigned long currentMillis) { doorbellButton.update(); // 必须定期调用update() if (doorbellButton.fell()) { // 检测到下降沿按钮被按下 triggerEvent(EVENT_DOORBELL, currentMillis, HIGH_PRIORITY); } }对于需要快速响应的传感器如震动可以考虑使用硬件中断。Teensy 4.0几乎所有引脚都支持中断。volatile bool knockDetected false; // 在中断中修改的变量必须声明为volatile void setup() { pinMode(KNOCK_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(KNOCK_PIN), knockISR, FALLING); } void knockISR() { // 中断服务程序尽量短快 knockDetected true; } void checkInputs(unsigned long currentMillis) { if (knockDetected) { knockDetected false; // 清除标志 // 可以在这里加一个简单的软件去抖比如判断上次触发时间 if (currentMillis - lastKnockTime DEBOUNCE_DELAY) { triggerEvent(EVENT_KNOCK, currentMillis, MEDIUM_PRIORITY); lastKnockTime currentMillis; } } }5. 反馈模式设计与用户体验优化硬件和代码是基础但真正让这个设备好用的是精心设计的反馈模式。这涉及到一些简单的交互设计心理学。5.1 视觉反馈设计LED灯带的“语言”WS2812B灯带可以显示1600万种颜色和无数种动态效果。我们不能滥用这种能力反馈必须一致、可学习、不刺眼。颜色编码建立固定的颜色语义。例如红色紧急、危险火警、严重警报。黄色/琥珀色警告、注意电池电量低、传感器故障。绿色安全、确认、日常通知门铃、消息送达。蓝色信息、状态水烧开、定时器到点。白色环境照明或系统待机。动态模式编码快速闪烁3Hz最高紧急度需要立即关注。慢速闪烁1-2Hz一般提醒需要尽快查看。呼吸效果平和的状态指示或等待中。追逐/波浪效果指向性提示如从左侧亮到右侧表示事件来自左边。常亮持续状态如设备运行中。在我的实现中火警是红色全灯带高速同步闪烁门铃是绿色灯带从中心向两侧扩散的波浪效果模拟声波扩散水烧开是蓝色灯带温和的呼吸效果。5.2 触觉反馈设计让震动“说话”触觉反馈更私密但设计难度也更大。不同的震动模式能传达不同信息。强度紧急事件用强震普通通知用弱震。节奏短促单次震动“嘀”一声表示操作确认或简单通知。长短-长短莫尔斯码式可以编码特定信息比如“..-.”代表水。持续震动最高警报要求立即行动。脉冲震动有规律的强弱变化表示进行中或等待。位置如果配备多个震动马达如手腕和脚踝可以实现空间定位提示。我目前只使用了一个震动马达所以主要通过节奏和强度区分。火警是持续最强震动门铃是“强-弱-强”三下脉冲模拟“咚-咚-咚”的敲门声定时提醒是两次短促震动。5.3 OLED信息显示设计OLED屏用于显示精确的文字信息作为LED和震动反馈的补充。设计原则是大、简、明。字体使用最大的内置字体或自定义点阵字体。内容显示关键名词或动词如“FIRE”、“DOOR”、“BOIL”。图标如果空间允许可以绘制简单的图标比文字更直观。滚动对于较长信息可以使用水平滚动但速度要慢。在代码中使用Adafruit_SSD1306库的setTextSize()和println()函数即可轻松实现。5.4 优先级管理与反馈冲突解决当多个事件同时发生时系统必须决定如何反馈。我设计了一个简单的优先级队列。绝对优先像EVENT_SMOKE_ALERT这类生命安全事件拥有最高优先级。一旦触发它将中断所有当前反馈并独占视觉和触觉通道直到手动复位通过一个特定的“静音/确认”按钮。排队与合并对于中低优先级事件如两个定时器同时到点如果它们反馈模式不冲突比如颜色不同可以让LED灯带分区显示左侧显示事件A的颜色右侧显示事件B的颜色。如果冲突则后到的事件进入队列等前一个事件反馈结束后再触发。OLED屏可以轮流显示排队事件的信息。手动干预必须设置一个物理按钮允许用户确认或静音当前报警。长按此按钮可以进入模式设置如调整LED亮度、震动强度等。6. 系统集成、调试与实测心得把所有模块组装进一个定制的3D打印外壳里接上电源就到了最激动人心也最让人头疼的环节——上电调试。6.1 分模块调试与系统联调千万不要一上来就把所有代码和硬件全接好。务必分模块调试先调通Teensy烧录一个最简单的Blink程序确保核心板工作正常能通过串口打印信息。单独测试每个输入例如只连接按钮写一段代码在串口监视器里打印按钮状态。确保每个传感器都能正确触发。单独测试每个输出写测试程序让LED灯带显示纯色、跑马灯让震动马达以不同强度震动让OLED显示“Hello World”。确保每个执行器都能受控。事件映射测试将单个输入和单个输出关联起来测试。比如按下按钮LED变绿。验证feedbackMap配置是否正确。全系统联调将所有模块接入烧录完整程序。进行场景模拟测试按门铃、模拟烟雾、触发震动等。6.2 常见问题与排查实录在调试过程中我遇到了几乎所有嵌入式新手都会踩的坑这里记录一下问题1LED灯带乱闪或部分不亮。排查首先检查电源这是最常见的问题。WS2812B对电源电压和电流非常敏感。确保使用独立的5V/2A以上电源为灯带供电并且电源地GND一定要和Teensy的地连在一起。数据线长度不宜过长超过50cm建议加信号中继。检查数据线连接的引脚是否正确代码中FastLED.addLeds函数指定的引脚号是否与实际一致。解决我最初用USB给整个系统供电灯带超过5颗就乱码。换用独立电源后问题立刻消失。在数据线靠近Teensy端加了一个330Ω电阻稳定性进一步提升。问题2震动马达不工作或Teensy复位。排查检查MOSFET接线是否正确G、D、S。用万用表测量Teensy PWM引脚在触发时是否有电压变化。最可能的原因忘记接续流二极管马达停转时产生的反向电动势无处释放会损坏MOSFET或导致电源电压尖峰使Teensy复位。解决补上1N4007二极管后问题解决。同时在马达电源两端并联了一个100μF的电解电容进一步平滑电源。问题3按钮偶尔“连发”或失灵。排查机械开关的抖动问题。没有使用消抖库或消抖时间设置不当。解决使用Bounce2库并将消抖间隔设置为25ms问题完美解决。问题4烟雾传感器误报频繁。排查MQ-2传感器对酒精、香烟烟雾也很敏感。直接使用单次读数比较阈值不靠谱。解决在代码中改为“滑动窗口平均法”。连续读取10次模拟值计算平均值再用这个平均值与阈值比较。同时只有连续3个平均值都超过阈值才判定为真实报警。这大大降低了误报率。问题5多个事件同时触发时系统反应迟缓或卡死。排查loop()中使用了delay()或者某个反馈函数如复杂的LED动画执行时间太长阻塞了其他事件检测。解决彻底重构代码采用本文所述的非阻塞状态机模式。所有定时都用millis()差值判断LED动画用状态变量分步执行确保每次loop()循环都在几毫秒内完成。6.3 功耗优化与待机考虑在测试中全速运行LED全亮、马达震动时系统电流接近1A。但在待机状态仅传感器监测LED微亮电流可以降到100mA以下。为了更省电可以进一步优化降低Teensy主频Teensy 4.0可以在setup()中使用set_arm_clock()函数降低CPU频率在待机时降到24MHz需要处理时再恢复。关闭未用外设将不用的模拟输入引脚设置为INPUT_DISABLE关闭OLED屏背光等。使用睡眠模式对于电池供电版本可以让Teensy进入深度睡眠通过外部中断如按钮按下唤醒。但这需要所有传感器都能产生中断信号设计会更复杂。6.4 实测反馈与迭代我将原型机交给听障朋友家庭试用了一周。收集到的反馈非常宝贵触觉比视觉更受关注在白天或使用者未直视灯带时震动提醒更直接。他们建议增加震动模式的多样性。需要“全局”和“局部”反馈他们希望有一个戴在手腕上的震动子机可以用蓝牙连接这样在房间任何位置都能收到提醒而主机的LED灯带作为环境光补充。“静音”按钮需要更明显当前的按钮太小紧急情况下不易找到。建议改用一个大而醒目的带灯按钮。根据这些反馈我计划在V2版本中引入ESP32作为无线从机负责穿戴式震动反馈主机Teensy通过串口与ESP32通信。同时重新设计外壳将“确认/静音”按钮做得更大并集成一个呼吸灯指示系统状态。这个项目从构思到实现让我深刻体会到好的技术产品不仅仅是功能的堆砌更是对用户需求的深度理解和细腻关怀。每一行代码每一个电路连接最终都转化为一种更平等、更自在的生活体验。