第二章:按摩仪需求分析
好,咱们进入正题。上一章聊了状态机的基本概念,这一章咱们得落地了——具体到按摩仪这个产品,到底要分析哪些需求?
我个人习惯,做任何嵌入式项目之前,先画一张“需求脑图”。不是画给老板看的,是画给自己看的。你想想看,如果连功能都理不清,后面写状态机代码肯定要翻车。
2.1 按摩仪的功能需求
先列一下最基础的功能。嗯,这里我按“用户视角”来拆解:
- 开关机:长按电源键3秒开机,再长按3秒关机。这个逻辑我踩过坑——曾经有个项目,短按开关机,结果用户放包里误触,一晚上耗光电。所以后来我坚持用长按。
- 模式切换:用户按“模式键”循环切换四种模式(放松→舒缓→强力→智能→放松...)。
- 力度调节:每个模式下有3-5档力度,通过“+/-”键调节。
- 定时关闭:默认15分钟自动关机,防止用户睡着后一直按摩。
- 加热功能:部分高端型号带热敷,需要独立控制。
说白了,这些功能就是状态机的“输入事件”和“输出动作”。
2.2 模式定义:四种核心模式
这四种模式是按摩仪的灵魂。我见过不少产品,模式定义得花里胡哨,结果用户根本分不清。咱们来点实在的:
| 模式名称 | 核心特征 | 典型场景 | 电机波形 |
|---|---|---|---|
| 放松模式 | 低频、轻柔、间歇性 | 工作间隙、睡前 | 正弦波,频率2Hz |
| 舒缓模式 | 中频、持续、有节奏 | 久坐后、轻度酸痛 | 方波,频率5Hz |
| 强力模式 | 高频、强劲、冲击感 | 运动后、深层肌肉酸痛 | 锯齿波,频率10Hz |
| 智能模式 | 自适应调节 | 自动检测肌肉状态 | 动态波形 |
我的经验:智能模式最难做。我曾经在智能模式里加入了压力传感器反馈,结果算法太复杂,MCU跑不动。后来改用“定时切换波形”的伪智能方案,反而用户体验更好。有时候,简单就是美。
2.3 按键与交互逻辑
按键设计,说白了就是“人机接口”。我建议用3个物理按键 + 1个指示灯:
- 电源键:长按3秒开关机。短按无效,防止误触。
- 模式键:短按切换模式。长按2秒进入“加热设置”。
- 力度键(+/-):短按调档,长按连续调节。
这里有个细节——按键消抖一定要做。我记得有一次,客户反馈“按一下模式键,跳了两个模式”。查了半天,就是没做消抖。机械按键按下瞬间会有10-20ms的抖动,不处理的话,状态机会被“误触发”。
交互逻辑上,我习惯用“状态机+事件驱动”的思路:
// 伪代码示例
typedef enum {
STATE_IDLE, // 待机
STATE_RELAX, // 放松
STATE_SOOTH, // 舒缓
STATE_STRONG, // 强力
STATE_SMART, // 智能
STATE_HEAT // 加热
} MassageState;
// 按键事件
void onModeKeyPressed() {
switch(currentState) {
case STATE_RELAX: setState(STATE_SOOTH); break;
case STATE_SOOTH: setState(STATE_STRONG); break;
case STATE_STRONG: setState(STATE_SMART); break;
case STATE_SMART: setState(STATE_RELAX); break;
default: break;
}
}
避坑指南:我曾经在状态切换时直接修改PWM输出,结果导致电机瞬间反转,把用户吓了一跳。后来我加了一个“过渡状态”——切换模式时先停止电机100ms,再启动新波形。虽然多了100ms延迟,但用户体验好多了。
2.4 需求分析的输出物
做完需求分析,你应该得到以下文档:
- 功能列表:所有功能点,包括正常和异常情况。
- 模式定义表:每种模式的波形、频率、力度范围。
- 按键交互矩阵:每个按键在不同状态下的响应。
- 状态转换图:初步的状态机草图。
嗯,这些就是下一章写状态机代码的“原材料”。你想想看,如果这一步偷懒了,后面调试的时候,你会在各种边界条件里抓狂。
好,第二章就到这里。下一章咱们开始画真正的状态转换图,把今天分析的需求变成代码。