本节目标
完成宠物番茄钟的功能规划,把倒计时、输入、显示和反馈拆分成清晰的模块,为后续硬件调试打基础。
学习记录
1. 明确项目功能
本项目希望做成一个桌面宠物番茄钟:既能完成25分钟专注和休息切换,也能通过像素宠物、灯环、蜂鸣器和舵机提供更直观的反馈。
2. 拆分程序结构
代码位置在 D:\Documents\Arduino\PetPomodoro。项目将入口、配置、番茄钟状态机、输入、显示、反馈、存储和宠物动画拆成多个文件,方便单独调试。
3. 设计番茄钟状态机
核心逻辑包含专注、短休息、长休息三种模式。专注结束后累计完成次数,达到设定次数后进入长休息;中途跳过专注时不计入完成数。
项目代码(结构节选)
下面是入口文件中的主要模块和任务结构,体现了本项目从单一循环程序向多任务项目的升级。
#include "config.h"
#include "Pomodoro.h"
#include "Display.h"
#include "Input.h"
#include "Feedback.h"
#include "Storage.h"
Pomodoro pomodoro;
Display display;
Input input;
Feedback feedback;
Storage storage;
QueueHandle_t xInputQueue = NULL;
QueueHandle_t xFeedbackQueue = NULL;
void setup() {
xInputQueue = xQueueCreate(8, sizeof(InputEvent));
xFeedbackQueue = xQueueCreate(8, sizeof(FeedbackEvent));
pomodoro.begin();
display.begin();
input.begin();
feedback.begin();
storage.begin();
pomodoro.loadCompleted(storage.loadCompleted());
xTaskCreatePinnedToCore(vTaskInput, "Input",
TASK_INPUT_STACK, NULL, TASK_INPUT_PRIORITY, &hTaskInput, 0);
xTaskCreatePinnedToCore(vTaskPomodoro, "Pomodoro",
TASK_POMODORO_STACK, NULL, TASK_POMODORO_PRIORITY, &hTaskPomodoro, 0);
xTaskCreatePinnedToCore(vTaskDisplay, "Display",
TASK_DISPLAY_STACK, NULL, TASK_DISPLAY_PRIORITY, &hTaskDisplay, 1);
xTaskCreatePinnedToCore(vTaskFeedback, "Feedback",
TASK_FEEDBACK_STACK, NULL, TASK_FEEDBACK_PRIORITY, &hTaskFeedback, 0);
}
本节收获
这次练习让我认识到,复杂一点的嵌入式作品不能只把所有逻辑堆在 loop() 里。先划分模块,再通过队列传递事件,程序会更容易扩展和维护。