第二章:按摩仪需求分析

好,咱们进入正题。上一章聊了状态机的基本概念,这一章咱们得落地了——具体到按摩仪这个产品,到底要分析哪些需求?

我个人习惯,做任何嵌入式项目之前,先画一张“需求脑图”。不是画给老板看的,是画给自己看的。你想想看,如果连功能都理不清,后面写状态机代码肯定要翻车。

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 需求分析的输出物

做完需求分析,你应该得到以下文档:

  1. 功能列表:所有功能点,包括正常和异常情况。
  2. 模式定义表:每种模式的波形、频率、力度范围。
  3. 按键交互矩阵:每个按键在不同状态下的响应。
  4. 状态转换图:初步的状态机草图。

嗯,这些就是下一章写状态机代码的“原材料”。你想想看,如果这一步偷懒了,后面调试的时候,你会在各种边界条件里抓狂。

好,第二章就到这里。下一章咱们开始画真正的状态转换图,把今天分析的需求变成代码。