尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

米家电动剃须刀动态设计解析:机械贴合、灯效反馈与智能联动

米家电动剃须刀动态设计解析:机械贴合、灯效反馈与智能联动 一台米家电动剃须刀的“动态设计”并不是产品页上那张动图也不只是刀头会浮动这么简单。真正落到工程里动态设计至少包含三层机械结构的动态贴合、灯效和交互反馈的动态变化以及基于传感器和 App 联动的智能调控。这篇文章以米家电动剃须刀为分析对象先把动态设计拆成可实现的模块再逐步说明硬件架构、控制流程、验证方法和排查思路适合刚接触智能小家电开发的工程师也适合想理解产品设计背后实现逻辑的产品经理。动态设计最容易出现的误解是把它当成一个“效果层”最后才去加灯效、加动画。实际上工程里的动态设计是一条完整链路结构件负责物理贴合传感器负责感知负载MCU 负责决策和状态迁移LED 和马达负责执行反馈无线模块负责把设备状态同步到手机。任何一环断裂用户感知到的都是“这台剃须刀不聪明、不跟手、反馈混乱”。所以下面先从概念拆开讲再落到工程实现。1. 动态设计到底指什么一台剃须刀里的三层动态很多人看到“动态设计”会直接联想到 UI 动画、产品宣传片里的高转场效果。但剃须刀这类小家电的动态设计与 App 动效完全不同它必须建立在物理运动、实时控制和多状态反馈的基础上。可以把它拆成三层来看。1.1 机械层动态刀头浮动与刀网自适应机械层动态是用户最先接触到的动态。米家电动剃须刀的刀头通常不是硬性固定的而是通过浮动结构安装在机身上。所谓浮动是指刀头可以在一定角度内上下摆动、前后倾斜从而在用户移动剃须刀时始终贴合面部轮廓。从工程角度看浮动设计要解决三个问题浮动行程不能过大否则刀头不稳定剃须时容易跳动。浮动阻尼要适中既要保证刀网能压在皮肤上又不能产生明显压迫感。浮动结构必须耐久经过几万次按压后不能出现松动或异响。常见的实现方式是刀头底座与机身之间加入弹簧或硅胶阻尼件。刀头受压时弹簧压缩刀头倾斜压力消失后弹簧回弹刀头复位。刀网表面则通过弧形设计和网孔排布减少与皮肤的接触阻力。这里要特别强调浮动不是越松越好。如果浮动结构阻尼过小刀头会“飘”在皮肤上反而剃不干净阻尼过大又会让用户感觉刀头僵硬。实际项目中设计团队会做压力分布测试用贴片压力传感器测量刀网与仿生皮肤之间的接触压力再调整弹簧的弹性系数和浮动限位角度。1.2 视觉层动态灯效、电量环与状态反馈视觉层动态是用户在交互过程中直接看到的变化开机灯效、运行指示、低电量闪烁、充电呼吸灯、故障报警等。它的意义在于把设备内部状态用视觉方式实时呈现给用户减少“不知道有没有在工作”的焦虑。以电量反馈为例固定亮一枚灯只能表示“有电”而用呼吸灯或流水灯来表示“正在充电”用户一眼就能看出状态差异。LED 灯效的动态设计通常依赖 PWM 调光。MCU 通过改变 PWM 占空比控制 LED 亮度从 0% 渐变到 100%再反向变化形成呼吸效果。视觉层动态必须和机械层状态联动。电机刚启动时用户可能还没听到声音但灯效先亮起给他一个明确的启动信号电机停转后灯效再延迟几百毫秒熄灭避免瞬间暗场造成不适。这种联动不是简单延时而是状态机里的有序迁移。1.3 智能层动态传感器调速与米家联动智能层动态是米家电动剃须刀区别于传统剃须刀的核心。传统剃须刀只有开和关而智能剃须刀试图回答三个问题当前负载是大还是小用户需要更强动力还是匀速运转设备状态是否需要同步到手机智能调速的基本思路是闭环控制。剃须刀工作时胡须密度不同刀网受到的阻力也不同。阻力大时电机负载变大转速可能下降系统检测到负载变化后自动提高电机 PWM 占空比把转速拉回目标值。这个“检测—计算—调整”的过程就是动态设计里的智能层。米家联动则将设备状态扩展到手机端。设备可以把运行时长、电量、充电状态、故障代码上报给米家 AppApp 也能下发关机、调档、查询等指令。动态设计在这里体现为“状态的实时同步”而不是让 App 只显示一个静态界面。需要说明的是这三层动态并不是独立实现的。机械层的浮动压力会影响电机负载电机负载会触发智能调速调速结果又要通过灯效或档位指示灯反馈给用户。因此后面的硬件架构和控制流程都必须围绕这条链路来设计。2. 从产品架构看动态设计的承载部件动态设计听起来偏“软”但落地的第一件事是硬件选型和模块划分。没有稳定的硬件基础再好的算法和动效都无法工作。下面以常见米家电动剃须刀的整体架构为参考梳理每个模块在动态设计中的职责。2.1 硬件模块拆分与职责一台支持动态反馈的电动剃须刀至少包含以下硬件模块模块职责动态设计中的作用电机与驱动电路带动刀网旋转执行转速调整提供机械动力MCU运行状态机和算法统一调度传感器、电机、LED 和通信传感器组检测负载、转速、电量、开关状态提供闭环控制所需的输入LED 灯组与按键人机交互显示状态变化接收用户指令电源与充电管理电池供电、充电控制影响续航、充电灯效和低电量策略无线通信模块与手机或网关通信同步设备状态接收远程指令结构件浮动刀头、防水密封、外壳承载机械动态决定手感这些模块不是简单堆在一起。MCU 是动态设计的中枢传感器信号进入 MCU 后由 MCU 判断当前处于什么状态然后通过 PWM 控制电机转速通过 LED 驱动控制灯效通过通信模块对外上报。结构件虽然是机械部件但它的参数会直接影响传感器读数所以不能只当成外壳看待。2.2 MCU 与感知单元的配合逻辑MCU 与感知单元的配合核心是“采样—处理—输出”的循环。以负载检测为例常用方案有两种霍尔传感器测转速或者电流检测电路估算电机功率。两种方案各有优缺点取决于成本、结构和控制精度要求。霍尔测转速的思路是在电机转轴或刀头驱动盘上放置磁铁MCU 通过霍尔传感器检测磁场变化计算单位时间内的脉冲数从而得到实际转速。当胡须密度大、刀网阻力增加时相同 PWM 下转速会下降MCU 检测到转速偏低后提高 PWM 占空比。电流检测的思路则不同。电机负载越大流过驱动电路的电流越大。MCU 通过 ADC 采样采样电阻两端的电压换算出电机电流。电流偏大时说明负载偏大系统可以进入高功率档位。下面是一段简化示例说明 MCU 的初始化逻辑实际项目需要根据芯片型号和电路调整void hardware_init(void) { // 初始化定时器用于 PWM 输出和转速采样 timer_init(TIMER0, PWM_MODE); timer_init(TIMER1, INPUT_CAPTURE_MODE); // 初始化 ADC用于电流检测和电池电压检测 adc_init(ADC_CHANNEL_MOTOR_CURRENT); adc_init(ADC_CHANNEL_BATTERY_VOLTAGE); // 初始化 GPIO接按键、LED 和霍尔传感器 gpio_init(GPIO_KEY_POWER, GPIO_MODE_INPUT_PULLUP); gpio_init(GPIO_LED_STATUS, GPIO_MODE_OUTPUT); gpio_init(GPIO_HALL_SENSOR, GPIO_MODE_INPUT); // 默认进入休眠状态 state_machine_set_state(STATE_SLEEP); }这里的重点是MCU 不能只做单次读取。动态设计要求连续采样、连续调整所以主循环或定时器中断里必须周期性执行“采样—判断—输出”的逻辑。如果用阻塞式延时LED 动画和转速控制都会被卡住产品表现就会非常生硬。2.3 通信模块蓝牙与 WiFi 在剃须刀中的取舍米家联动需要无线通信但剃须刀这类产品不能直接把 WiFi 模块做成标配。选择无线方案时主要看功耗、待机时长、配网难度和成本。指标低功耗蓝牙WiFi通信功耗较低适合低频小包数据较高尤其保持连接时配网方式通过手机直接连接流程短通常需要配网和路由器环境通信距离短距离适合随身设备中远距离适合固定设备成本与体积模组小、成本相对低模组体积和成本相对高剃须刀使用场景多在浴室和出差途中用户身边未必有稳定的 WiFi 环境同时设备本身对续航敏感所以很多小家电会倾向低功耗蓝牙方案。不过具体到某一款米家电动剃须刀使用哪种通信模块要以产品定义和接入文档为准不能一概而论。通信模块的引入会给动态设计带来一个额外约束上报频率不能太高。如果设备每 100 毫秒就把当前转速和电量上报一次功耗会明显增加而且 App 端也不需要一个这么高频的数据流。常见做法是设备只在状态变化时上报例如开机关机、电量下降一个档次、低电量告警、进入充电、发生故障这些事件通过轻量 JSON 形式发送。3. 最小实现米家剃须刀动态反馈的控制流程理解了硬件架构后再看控制流程。动态设计能不能稳定运行关键看设备的状态机是否清晰事件是否能被正确处理。一个好的实现应该让每个时刻只有一个确定状态任何输入都只会引起可控的状态迁移或动作输出。3.1 状态机设计休眠、运行、充电、故障剃须刀虽然功能简单但如果不用状态机管理代码很容易变成一堆 if else最终出现“明明关机了 LED 还在闪”的问题。典型状态至少包含四类休眠态按键可唤醒整机低功耗。运行态电机运转可能包含不同档位。充电态外部电源接入执行充电和充电灯效。故障态堵转、过温、电池异常等限制设备运行。状态迁移事件包括按键按下、开机完成、充满电、拔出充电线、故障恢复等。下面是一个简化枚举typedef enum { STATE_SLEEP 0, STATE_RUNNING, STATE_CHARGING, STATE_FAULT, } system_state_t; typedef enum { EVENT_KEY_PRESSED 0, EVENT_KEY_RELEASED, EVENT_CHARGER_INSERTED, EVENT_CHARGER_REMOVED, EVENT_BATTERY_FULL, EVENT_STALL_ERROR, EVENT_FAULT_CLEARED, } system_event_t;状态机处理函数可以设计为“输入事件输出动作并跳转状态”void state_machine_handle(system_event_t event) { switch (current_state) { case STATE_SLEEP: if (event EVENT_KEY_PRESSED) { motor_start(); led_effect_start(LED_EFFECT_RUNNING); state_machine_set_state(STATE_RUNNING); } break; case STATE_RUNNING: if (event EVENT_KEY_PRESSED) { motor_stop(); led_effect_start(LED_EFFECT_OFF); state_machine_set_state(STATE_SLEEP); } else if (event EVENT_STALL_ERROR) { motor_stop(); led_effect_start(LED_EFFECT_FAULT); state_machine_set_state(STATE_FAULT); } break; // 其他状态处理... default: break; } }这里要注意故障态必须提供恢复路径。比如堵转故障在用户松开按键、重新触发开关后要尝试重新启动电池低压故障在接入充电器后要自动进入充电态。如果没有恢复路径设备会因为一次异常永久卡死非常影响用户体验。3.2 转速闭环控制与动态调档动态调档的目标是让电机在不同负载下维持合适转速。最简单的实现是阈值控制当检测到电流超过高阈值时切到高功率档低于低阈值时回落到标准档。下面是一个简化的电流检测调档逻辑#define CURRENT_LOW_THRESHOLD 800 // ADC 采样值低于此值认为负载较小 #define CURRENT_HIGH_THRESHOLD 2000 // ADC 采样值高于此值认为负载较大 static void motor_speed_control(void) { uint16_t current adc_read(ADC_CHANNEL_MOTOR_CURRENT); if (current CURRENT_HIGH_THRESHOLD) { pwm_set_duty(PWM_HIGH_DUTY); led_effect_start(LED_EFFECT_HIGH_POWER); } else if (current CURRENT_LOW_THRESHOLD) { pwm_set_duty(PWM_NORMAL_DUTY); led_effect_start(LED_EFFECT_NORMAL_POWER); } }这种阈值控制在工程上简单、稳定但响应不平滑会出现临界处反复切换档位的问题。更精细的控制可以引入 PID 或滞回区间。滞回的意思是进入高功率档需要电流超过高阈值但回到普通档需要电流低于低阈值中间有一段死区避免频繁抖动。关键参数需要根据实际电机和电池标定参数含义调大的影响调小的影响采样周期多久读取一次电流或转速控制响应变慢容易感知到滞后响应快但增加 MCU 负担高阈值进入高功率档的负载条件更不容易触发高功率动力偏弱频繁触发高功率功耗增加PWM 加减速步长每次调整占空比的增量调整平滑但响应慢调整快但可能造成明显顿挫采样周期建议控制在 20 到 50 毫秒之间这个区间对剃须刀这类电机负载足够又不会让 MCU 一直忙于采样。实际项目要结合 MCU 主频、定时器资源和电池策略来选择。3.3 灯效动画和按键交互实现要点灯效动画是动态设计最容易出彩、也最容易出 bug 的部分。常见的错误是直接在主循环里用延时实现动画导致按键响应被阻塞。比如电机已经停了呼吸灯还在继续跑完整段动画才退出。 正确做法是让动画更新也受定时器驱动每次中断只更新一次 LED 亮度。下面是一段呼吸灯示例static uint16_t pwm_value 0; static int8_t pwm_direction 1; void timer_led_callback(void) { pwm_value pwm_direction * LED_STEP; if (pwm_value LED_MAX) { pwm_value LED_MAX; pwm_direction -1; } else if (pwm_value LED_MIN) { pwm_value LED_MIN; pwm_direction 1; } led_set_brightness(pwm_value); }定时器中断周期决定动画速度。中断周期过长呼吸效果会有卡顿过短LED 亮度变化不明显且浪费功耗。常见的呼吸周期在 1 到 3 秒即从暗到亮再到暗一次为 1 到 3 秒具体看产品调性。按键交互要注意防抖和长短按区分。突然断电、水渍接触、静电干扰都可能造成误触。简单防抖可以在按键检测到电平变化后延时 10 到 20 毫秒再读取一次确认状态再触发事件。若需要长短按则从按下开始计时而不是松手后判断这样用户能感受到“按多久触发什么动作”的实时反馈。按键事件最终要转化为状态机的事件不能在按键中断里直接开启或关闭电机。原因很简单中断里做耗时操作容易丢失后续事件而且会把业务逻辑和硬件层耦合在一起。推荐的做法是按键中断只置标志位主循环“读取标志—生成事件—交给状态机”。3.4 米家联动的事件上报与指令下发设备接入米家生态时动态设计会延伸到 App 侧。设备不是简单地把所有传感器数据推给 App而是按照事件模型对外同步。上报数据一般包括设备状态、电量、异常事件等下面是一个简化的 JSON 示例{ deviceId: device_001, event: battery_low, level: 15, timestamp: 1712345678 }{ deviceId: device_001, event: fault, faultCode: STALL, message: motor stalled }指令下发方向则由 App 发起设备接收后执行。例如用户通过米家 App 关闭设备App 下发一个指令设备收到后进行状态迁移{ cmd: power_off, requestId: req_001 }实际接入时需要先获取米家生态的接入文档确认产品模型、事件字段、协议版本和测试流程。不同版本可能对上报频率、字段命名、事件枚举有不同要求以平台文档为准。工程上要注意两点。第一指令处理必须具备幂等性App 可能因为网络超时重复下发同一条指令设备不能因为重复指令出现状态跳变。第二上报要带请求 ID 或序列号方便排查丢包和乱序。动态设计里App 显示的状态必须和设备实际状态一致否则用户会认为联动逻辑失效。4. 验证动态设计功能测试和交互评价动态设计验证不能只看“功能有没有”还要看“变化是否顺畅、反馈是否及时、功耗是否可接受”。下面从功能、延迟和功耗三个角度展开。4.1 功能层面的验证清单手动测试阶段建议先按清单逐项验证验证项操作方法预期结果开机灯效按下电源键LED 按设定时序亮起随后进入运行状态运行灯效正常剃须运行灯保持稳定档位变化时灯效同步变化低电量提示电量低于阈值模拟放电LED 闪烁或变为低电量颜色App 收到对应事件充电呼吸灯插入充电线呼吸灯亮起充满后呼吸灯熄灭或变为常亮故障报警堵转刀头电机停止LED 进入故障灯效App 收到故障事件米家联动App 下发关机指令设备停止运行状态同步为关机防抖可靠性快速连续按键 20 次不出现多次启动、卡死或状态错乱功能验证的目的不是测一次通过而是要找出状态机中的非预期路径。比如正在充电时按下电源键设备是要允许运行还是强制关机必须有明确行为定义不能出现“充电灯和运行灯同时亮”的冲突。4.2 动态响应延迟怎么看动态设计好不好主观上很大程度取决于响应延迟。延迟可以拆成四段按键按下到电机启动用户最直接的反馈最好控制在 50 毫秒内。按键按下到灯效亮起可以比电机更快或同时不能明显晚于电机。负载变化到档位调整应控制在 100 到 300 毫秒级别太快会突兀太慢像没反应。App 下发指令到设备执行受通信链路影响普遍比本地按键慢但要让用户有“正在执行”的反馈可以先更新界面状态。这里要说明具体数值应该根据设备类型和产品定义来定不能照搬其他产品。验证方法可以用示波器同时抓取按键电平、电机电流和 LED 驱动信号App 链路则可以通过抓日志测量指令下发时间和设备执行时间。4.3 续航和功耗对动态设计的影响动态设计做得越丰富功耗通常越高。LED 动画、频繁数据上报、高功率档位都会缩短续航。工程上需要在续航指标和交互效果之间找平衡。功耗测试建议覆盖以下场景场景测量项关注点休眠待机静态电流是否做到微安级能否撑过数小时待机低亮度灯效LED 驱动电流动画亮度是否过高是否可用最低亮度表达运行状态电机和 MCU 总电流高功率档位持续运行时电池压降是否过大上报状态通信峰值电流上报瞬间是否会拉低电池电压导致 MCU 复位充电状态充电电流和指示灯功耗充满后是否自动降低指示功耗一个常见问题是通信模块上报瞬间的电流尖峰较大如果电池本身已经处于低压尖峰可能触发 MCU 复位。工程师会通过加大电容、限制上报频率或降低通信功率来规避。在设计阶段就考虑这个场景能减少后期排查成本。5. 常见问题排查动态设计失效通常错在哪动态设计一旦出问题表象很多但根因往往集中在几个地方。下面从现象、原因、检查方式、解决方案四个维度整理排查思路。5.1 灯效异常或卡死现象LED 呼吸灯只亮一下就不再变化或者颜色状态和实际不符。可能原因定时器中断没有正确配置灯效更新函数没有被周期性调用。LED 动画状态被阻塞主循环里存在死循环或长延时。状态机没有把灯效切换到目标状态例如从运行态退出时忘记关闭灯效。检查方式用调试器打断点或加日志确认 LED 更新函数是否周期执行。检查主循环中是否有 while 等待比如耗时等待充电握手。检查状态迁移时是否调用了正确的灯效入口函数。解决方案将灯效更新统一放入定时器回调不允许在业务逻辑里直接控制 LED 长时间常亮或常灭。确保每次状态迁移都调用统一的 led_effect_start而不是散落在业务代码里。5.2 转速动态调整失灵现象胡须浓密时转速变化不明显或者出现转速忽高忽低。可能原因传感器采样数据不稳定ADC 未加滤波导致 MCU 误判负载。阈值区间设置过窄负载轻微波动就触发档位切换。电机 PWM 调整幅度过大系统出现振荡。检查方式打印 ADC 采样值观察电流或转速数据是否抖动。记录档位切换日志确认事件触发的频率和阈值条件。用示波器观察 PWM 输出确认占空比调整节奏。解决方案对 ADC 采样做滑动平均减少单次异常值影响。引入滞回区间中间区域保持原有档位。将 PWM 调整步长改小让转速平滑过渡。5.3 米家 App 收不到状态变化现象设备本地已经关机或低电量但 App 界面仍然显示旧状态。可能原因设备没有上报事件或者上报事件被平台过滤。事件字段格式不符合平台协议消息被丢弃。通信模块进入休眠设备本地状态变化后没有先唤醒通信模块。检查方式查看设备端日志确认状态变化时是否调用了上报接口。查看平台或 App 端日志确认是否收到事件。对比协议文档检查字段名、枚举值、上报时间戳。解决方案将上报逻辑放到状态机迁移动作里保证每次关键状态变化都触发上报。上报失败时保存待重试事件在通信恢复后补报。调整协议字段确保与平台要求一致。5.4 故障排查优先级表综合来看动态设计失效的排查可以按下面的优先级执行优先级检查点判断方式1输入是否正确按键状态、充电状态、传感器是否被正确读取2状态机是否按预期迁移打印当前状态和触发事件3硬件模块是否工作电机电流、LED 驱动、通信模组供电是否正常4配置是否生效阈值、PWM 档位、上报开关是否写入了芯片5版本和协议是否匹配固件版本、协议版本、App 版本是否一致实际排查时如果先怀疑通信协议结果却发现是传感器 ADC 值长期恒定不变就会浪费很多时间。从输入到输出从本地到云端按顺序排查是更稳妥的方式。6. 动态设计的工程落地要点动态设计不是一次性接口而是在整个产品生命周期里都要被维护和扩展的特性和设计资产。落地时建议从规范、功耗、生产一致性和复用性四个方面约束工程实现。6.1 设计规范先行动效参数要统一如果 LED 动画时长、颜色、亮度、缓动曲线分散在多个模块里调试和上线后微调都会非常痛苦。建议在建项目初期就建立一张动效参数表参数含义推荐做法动画时长由暗到亮或亮到暗的持续时间同一类状态保持统一时长避免节奏混乱亮度曲线线性、指数或对数变化视觉上接近人眼感知更自然颜色映射状态与颜色关系低电量、运行、充电、故障用不同色系重复次数动画循环次数充电呼吸通常无限循环故障报警可以限次优先级多事件同时发生时的展示顺序故障高于低电量低电量高于普通运行统一参数后UI 设计和嵌入式开发可以对照同一张表实现减少沟通偏差。后期产品迭代只需调整参数表不需要改每处业务逻辑。6.2 低功耗与动画反馈的平衡动效不是越炫越好。在剃须刀这类产品上用户更关注续航和稳定性。建议提供“标准灯效”和“低功耗灯效”两种模式或者在 App 里提供关闭动画的开关。低功耗模式下LED 亮度可以降到最低甚至仅在电量变化和故障时临时亮灯。通信上报也要服从功耗目标。不要在设备每次转动时都上报而是只在状态切换时上报并合并短时间内的事件。例如 5 秒内连续上报了 3 次低电量提醒App 端应该合并为一次避免设备反复唤醒通信模块。6.3 生产一致性同一产品不同批次表现差异同一型号的剃须刀不同批次可能出现灯效亮度不一致、浮动刀头阻尼不一致、电机在相同 PWM 下转速不一致等情况。根源在于器件公差和结构装配误差。解决办法是给关键参数留出校准余量LED 亮度通过出厂校准寄存器统一避免个体差异。电机 PWM 档位通过批量测试确定公共阈值不在单台设备上单独标定。浮动结构对阻尼件做抽检压力差异超过规定区间时调整装配工艺。生产一致性直接影响动态设计的口碑。用户可能不会测量数据但两台同型号设备手感完全不同会直接反馈为“品控差”。6.4 复用什么、扩展什么动态设计一旦沉淀为工程模块就能在后续产品中复用。建议把以下能力抽象为独立模块模块复用价值状态机框架任何需要多状态切换的小家电都可以复用LED 动效驱动可配置动画时长、颜色、优先级电机闭环控制剃须刀、牙刷、风扇、吸尘器等电控产品通用事件上报封装接入米家或其他物联网平台时只需替换协议层扩展时也要注意边界。加入新传感器、新档位或新事件时应优先扩展状态机的状态和动作而不是在主循环里堆条件分支。动态设计最大的风险就是后期逻辑散落一旦多个功能互相穿插测试和排查成本会成倍增加。7. 下一步从剃须刀到更多智能硬件米家电动剃须刀的动态设计本质上是把机械结构、电子控制、人机交互和物联网连接组合成一个可感知的反馈闭环。理解了这条链路再看电动牙刷、风扇、空气净化器、扫地机器人等产品的动态反馈就会发现它们在状态机、传感器闭环和事件上报上有很多相通之处。7.1 把动态设计拆成可复用的模块建议读者亲手做一个小项目来强化理解不一定需要完整产品。可以从一块开发板、一个直流电机、一个电流传感器、几颗 LED 和一个按键开始先实现“按键开关—LED 响应—电机调速”的最小闭环再接入蓝牙模块把运行状态上报到手机。每一步都走在动态设计的主路径上。实验项目中可以先写一个简单的状态机把开关、运行、低电量、故障四态跑通再逐步加入灯效动画和 App 联动。注意每个阶段都做一次验证不要等到所有功能都写完再联调否则问题集中爆发时会很难定位。7.2 用户在意的不是动画是可感知的变化最后要说的是动态设计的目标不是让设备看起来有多“聪明”而是让用户清楚地知道设备当前在做什么、将要做什么、发生了异常应该怎么办。灯效、转速调整、App 提示都只是手段稳定的状态反馈才是核心。所以写代码时保持一个习惯每次修改状态先问一问“这个动作会通过哪种方式被用户感知”。如果感知不到动态设计就不算完成。带着这条标准去做设计很多关于要不要加动画、要不要高频上报的争论都会变得简单。下一次再做智能小家电时可以先从状态机开始设计把状态迁移、事件上报、灯效联动这三件事画在一张图上再动手写硬件驱动。这样工程实现会有主线后期维护也不会太痛苦。
返回列表