本节目标
在第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);
}
}
本节收获
这次调试让我理解了硬件项目中“反馈”的重要性。倒计时本身只是功能,屏幕、灯效、声音和动作让作品更像一个完整的实物产品。