Lesson Note

第8节课日志

日期:2026-04-22 · 主题:宠物番茄钟硬件联调

本节目标

在第7周状态机基础上继续完善硬件交互,接入ST7789屏幕、EC11旋钮、WS2812灯环、蜂鸣器和舵机反馈。

学习记录

1. 输入方式

使用EC11旋钮调整番茄钟时长,运行中旋转可以跳过当前阶段,独立按键负责开始和暂停。这样比单按键操作更直观。

2. 输出反馈

屏幕显示倒计时和像素宠物,WS2812灯环显示进度,蜂鸣器播放开始、结束和完成提示音,舵机在完成专注时做摆动动作。

3. 多任务协作

项目使用FreeRTOS任务分担输入扫描、计时状态机、屏幕刷新和反馈播放,避免某一个外设动作阻塞整个程序。

项目代码(番茄钟核心)

下面是番茄钟完成与跳过时的状态流转逻辑。

void Pomodoro::skip() {
    if (!state.isRunning) return;

    state.isRunning = false;

    if (state.mode == MODE_FOCUS) {
        switchMode(MODE_SHORT_BREAK);
        state.wasAbandoned = true;
        return;
    }

    switchMode(MODE_FOCUS);
}

void Pomodoro::onComplete() {
    state.isRunning = false;

    if (state.mode == MODE_FOCUS) {
        state.completedCount++;
        state.sessionCount++;
        bool startLongBreak = state.sessionCount >= FOCUS_SESSIONS_FOR_LONG;

        if (startLongBreak) {
            state.sessionCount = 0;
        }

        switchMode(startLongBreak ? MODE_LONG_BREAK : MODE_SHORT_BREAK);
        state.justCompleted = true;
    } else {
        switchMode(MODE_FOCUS);
    }
}

本节收获

这次调试让我理解了硬件项目中“反馈”的重要性。倒计时本身只是功能,屏幕、灯效、声音和动作让作品更像一个完整的实物产品。