入门(快速上手 · 1~2 周)
- 可编程按键盘 / 宏盘(USB HID)
- 推荐:STM32F103(或 STM32F407)
- 要点:按键矩阵、USB HID(键盘)、防抖、LED 指示、Flash 存储宏配置
- 学到:GPIO 扫描、中断、USB Device(TinyUSB/STM32 USB 库)、Flash 操作
- 组件:按键、二三极管(消抖)、小 OLED、Type-C 母座
- 时间:1 周内(周末两天可做出雏形)
- 低功耗环境监测节点(温湿度+光线)
- 推荐:STM32F103 或 ESP32S3(若需 Wi-Fi)
- 要点:传感器读取(DHT22/BME280/光电)、睡眠/唤醒、数据上报(MQTT/HTTP)
- 学到:I2C/SPI、低功耗模式、RTC 唤醒、串口/网络通讯基础
- 组件:BME280、光电传感器、LiPo+充电模块(可选)、ESP8266/ESP32 作网关
- 时间:周末到一周
- 数字示波器(简版,1~2ch)
- 推荐:STM32F407(高速 ADC)
- 要点:高速采样、DMA、缓冲区、简单触发、LCD 显示(LVGL 可选)
- 学到:ADC + DMA、采样定时器、缓冲区管理、图形显示
- 组件:高速采样电路、ADC 输入保护、TFT 显示屏
- 时间:2 周(做基础波形显示)
进阶(功能丰富 · 2~6 周)
- 便携式音乐/吉他效果器(DSP)
- 推荐:STM32F407(浮点、FPU),可外接 DAC/ADC
- 要点:实时音频采样、滤波器(IIR/FIR)、效果链(失真、合唱、混响)、延迟
- 学到:实时信号处理、PCM、定时器与中断优先级、音频接口(I2S/PCM)
- 组件:高质量 ADC/DAC(或 codec)、输入/输出接口、踏板开关
- 时间:4~8 周
- 图形化触摸控制面板
- 推荐:STM32F407 + 480×320 TFT(或直接 ESP32S3 + LVGL)
- 要点:触摸驱动、LVGL UI、动画、页面管理、配置存储
- 学到:图形界面设计、触摸校准、GUI 性能优化、文件系统(SD 卡)
- 时间:2~4 周
- 智能门禁(人脸/指纹 + 网络)
- 推荐:ESP32S3(Wi-Fi/BT,支持 ML / 轻量人脸) + STM32F103 做外围控制可选
- 要点:摄像头接入、指纹模块、网络认证(JWT/MQTT)、日志存储
- 学到:摄像头驱动、边缘轻量识别、加密认证、后端交互
- 时间:4~6 周
高级 / 挑战(大型或跨学科 · 1~3 月)
- 四轴飞控(简化版)
- 推荐:STM32F407(运动控制) + 外置 IMU(MPU9250)
- 要点:传感器融合(AHRS)、PID 控制、PWM 输出、串口遥控、日志回放
- 学到:传感器校准、姿态估计、控制回路与实时系统设计
- 组件:IMU、ESC、无刷电机、遥控接收器、机架
- 时间:1~3 月(含调试)
- 小型 CNC / 激光刻印机控制器
- 推荐:STM32F407(步进/伺服控制)
- 要点:步进电机控制(微步)、G-code 解析、限位与回零、运动规划(插补)
- 学到:运动控制、时间敏感的中断/定时器设计、文件解析与串口/USB 通信
- 时间:1~2 月
- 边缘 TinyML 项目:关键词唤醒 / 分类
- 推荐:ESP32S3(向量处理、指令集支持)
- 要点:录音前端、MFCC 特征提取、TF-Lite Micro 模型部署、功耗优化
- 学到:音频前处理、模型量化、推理工程化、在线更新模型
- 时间:3~8 周
- 多节点无线传感网(Mesh/LoRa/ESP-NOW)
- 推荐:ESP32S3(或 STM32 + LoRa 模组)
- 要点:节点自组网、路由/数据汇聚、远程 OTA、低功耗策略
- 学到:网络协议、同步、错误恢复、规模化部署问题
- 时间:1~2 月
创意混合(把不同 MCU 的强项组合起来)
- 智能家居中枢(STM32F407 作实时外设控制,ESP32S3 作云连接与 UI)
- 用 STM32F407 做灯光、窗帘、传感器采集与实时任务;ESP32S3 做 Web UI、语音或 ML 本地服务。学到:跨 MCU 通讯(UART/I2C/SPI/RS485)、分层架构、固件升级策略。
- 机器人(主控 STM32F407,视觉/语音由 ESP32S3 处理)
- STM32F407 负责底盘与伺服控制,ESP32S3 负责摄像头/语音识别与高层行为决策,二者通过 UART 或 CAN 协作。学到:模块化分工、串口协议设计、AI 与控制协同。
- 专业数据采集仪(多通道高精度,STM32F407 采集,ESP32S3 上传和可视化)
- 采样与时序由 STM32F407 精确控制,ESP32S3 定时上传云端并提供手机实时图表。学到:时间同步、缓冲/流控、前端可视化与后端接口。
- 可编程工业网关(Modbus/RS485 + MQTT/HTTP)
- STM32F103/407 做现场设备协议(Modbus RTU),ESP32S3 做云桥接(MQTT/TLS)并做网页配置界面。学到:工业协议、加密连接、证书管理、稳定性设计。
技术栈与开源资源(建议)
- STM32:CubeMX + HAL / LL,FreeRTOS,HAL + CubeIDE,USB (TinyUSB), FatFS。
- ESP32S3:ESP-IDF(推荐)、Arduino(做原型时),TF-Lite Micro(TinyML),ESP-NOW / BLE / Wi-Fi。
- UI:LVGL(适合嵌入式 TFT),LittlevGL + Touch。
- 其他:PlatformIO(方便多平台构建)、Git + CI(做固件自动化)、KiCad(PCB 版图)。
UI 偏重 + FreeRTOS / RT-Thread 专项项目清单(面向 LCD1602 / SSD1306 + 实时内核)
太好了——我把清单 专门偏 UI,并把 FreeRTOS / RT-Thread 的任务划分、同步点、以及用哪块显示器做哪类界面 都列清楚。每个项目都有:推荐 MCU、显示器选择(LCD1602 适合纯文本/状态栏,SSD1306 适合小图形/动效)、关键 RTOS 任务/队列/互斥点、最小 BOM,以及学习收益与粗略工期。你挑一个,我就能立刻把 BOM + 接线图 + 工程骨架给你。
说明(快速阅读)
- LCD1602:字符型,适合状态展示、简易菜单、多行文本(低带宽、低刷新需求)。驱动库:Hitachi HD44780 风格(常见 HAL + GPIO / I2C PCF8574 扩展器)。
- SSD1306:单色图形 OLED(128×64 常见),适合图标、滑动动画、小游戏、图表。驱动库:u8g2、Adafruit SSD1306、或基于 HAL 的 SSD1306 驱动。
- UI 库:SSD1306 尺寸小,通常用轻量绘图库(u8g2)或自写帧缓冲;若换成更大 TFT(ILI9341 / ST7789),可用 LVGL。
- RTOS 设计要点:UI 线程单独负责渲染(周期刷新或事件驱动),外设/传感器线程产生数据通过队列发给 UI;共享总线(I2C/SPI)使用 mutex;长耗时操作(网络、文件)放后台任务或使用异步回调。
项目列表(UI 优先,含 RTOS 细节)
1) 智能桌面时钟 + 动画(入门)
- MCU:STM32F103 或 ESP32S3(若需网络校时)
- 显示:SSD1306(时间 + 秒针动画);LCD1602 可做备用简易版
- RTOS 结构:
Task_TimeSync(低优先)—— NTP/RTC 校时(ESP32)Task_Display(高优先)—— 每秒更新(事件驱动 + 定时器)Task_Button(中优先)—— 菜单/亮度/闹钟设置,按键事件入队- 互斥:I2C mutex(SSD1306)
- BOM(最小):SSD1306 模块、按键 2~3、STM32 板或 ESP32S3、实时时钟模块(可选)
- 学到:I2C、定时器、事件队列、低功耗待机唤醒
- 工期:1 周
2) 可配置菜单设备(多页 UI)
- MCU:STM32F407(更大内存)或 ESP32S3
- 显示:SSD1306(多页小图标/滚动)或 LCD1602(文本菜单)
- RTOS 结构:
Task_UI:页面管理 + 渲染(使用界面状态机)Task_Input:旋钮/按钮/触摸扫描(发送事件到 UI 队列)Task_Backend:配置读写到 Flash(使用互斥保护)- 使用
Queue传递 UIEvent、Semaphore控制 SPI/I2C。
- BOM:旋钮编码器、SSD1306/LCD1602、按键、Flash(内部/外接)
- 学到:状态机 UI、非阻塞输入处理、配置持久化
- 工期:1~2 周
3) 传感器仪表盘(图形表 + 条形图)
- MCU:STM32F407 或 ESP32S3(若要 Web 上报)
- 显示:SSD1306(小图表)或升级到 240×135 TFT 用 LVGL
- RTOS 结构:
Task_Sensors(周期采样)→Queue→Task_Display(合并刷新)Task_Logger(写 SD 或 Flash)—— 异步写入- 互斥:SPI(SD 卡)、I2C(传感器)
- BOM:BME280 / SHT3x、SSD1306、SD 卡模块(可选)
- 学到:双缓冲 UI、图形绘制、数据流与节律控制
- 工期:2 周
4) OLED 动画与过渡效果演示(练手)
- MCU:STM32F103 / ESP32S3
- 显示:SSD1306(坐标像素控制)
- RTOS 结构:
Task_Animation(高优先)—— 帧定时器(比如 30 FPS)Task_Input(中优先)—— 切换动画、参数调整- 使用
Timer或vTaskDelayUntil精准帧率
- BOM:SSD1306、按键或编码器
- 学到:帧率控制、位图合成、内存优化(帧缓冲压缩)
- 工期:3~7 天
5) 简易音乐可视化(频谱条/波形)
- MCU:STM32F407(较高 ADC 采样)或 ESP32S3(内建 ADC)
- 显示:SSD1306(简化频谱)或 TFT(更丰富)
- RTOS 结构:
Task_ADC(DMA + 双缓冲)→Queue→Task_Proc(FFT/倒谱)→Task_DisplaySemaphore用于缓冲切换
- BOM:音频输入电路、SSD1306、滤波器
- 学到:DMA + ADC、信号处理(简易 FFT)、实时渲染
- 工期:2~4 周
6) 可视化日志与事件浏览器(带分页、搜索)
- MCU:STM32F407 + SD 卡 或 ESP32S3 + SPIFFS/LittleFS
- 显示:SSD1306(分页文本)或更大 TFT
- RTOS 结构:
Task_Logger(写文件)Task_UI(分页显示、搜索索引)Task_Input(导航)- 文件操作使用互斥锁,避免并发写入
- BOM:SD 卡模块 或 SPI NOR flash、显示模块
- 学到:文件系统、分页渲染、检索算法
- 工期:2~3 周
7) 手持仿真器 / 调试面板(串口/Can 状态 + 交互)
- MCU:STM32F407(做协议解析) + ESP32S3(选配 Web UI)
- 显示:SSD1306(状态指示)+ LCD1602(快速文本)
- RTOS 结构:
Task_Comm(串口/CAN 接收处理)→Queue→Task_UI显示Task_Command(执行/脚本)- 重要:通讯速率与队列溢出处理策略
- 学到:协议解析、环形缓冲、优先级处理
- 工期:3~6 周
8) 小型游戏(贪吃蛇 / 2048)—— 教学级别
- MCU:STM32F103 / ESP32S3
- 显示:SSD1306(像素游戏)
- RTOS 结构:
Task_Game:游戏逻辑(固定周期)Task_Render:渲染(事件驱动或间隔渲染)Task_Input:按键/方向控制,低延迟中断 -> 队列- 使用互斥保护帧缓冲
- 学到:游戏循环、输入延迟管理、简单碰撞检测
- 工期:1~2 周
9) Smart Home 控制面板(本地 UI + 云同步)
- MCU:ESP32S3(Wi-Fi) + STM32F407(外设控制)
- 显示:SSD1306(快捷状态)或 TFT(完整控制页面)
- RTOS 结构:
Task_UI(交互)Task_Network(MQTT/HTTP,同步)Task_DeviceCtrl(与 STM32 协议通信)- 网络操作需放在低优先或使用异步事件避免 UI 卡顿
- 学到:任务优先级划分、网络回退策略、跨 MCU 协议设计
- 工期:4~8 周(含后端)
10) RT-Thread 专题:多窗口 GUI + 插件式界面
- MCU:STM32F407(RT-Thread 支持成熟)或更大 Flash 的芯片
- 显示:SSD1306(示例)或 TFT(真实场景)
- RT-Thread 结构:
- 使用 RT-Thread 的
rt_thread与rt_mq/rt_sem实现页面切换与插件加载 - 借助 RT-Thread 的文件系统、设备模型做模块化(插件热插拔、SD 卡加载主题)
- 使用 RT-Thread 的
- 学到:RT-Thread 设备模型、模块加载、系统软件架构
- 工期:3~6 周
11) 可视化 OTA 更新控制台(ESP32S3)
- MCU:ESP32S3(强烈推荐)
- 显示:SSD1306(显示进度/状态) + LCD1602(备用)
- RTOS 结构:
Task_Network:下载固件(分片)Task_Flash:校验写入(使用互斥)Task_UI:显示进度条与日志- 使用队列传递进度与错误事件
- 学到:分片下载、校验、原子性写入、用户反馈(UI)
- 工期:2~4 周
12) 综合练习:可扩展仪表板(模块化,支持 OLED/TFT 切换)
- MCU:STM32F407 + ESP32S3(分工)
- 显示:SSD1306(节能模式)或 TFT(高颜值)
- RTOS 结构:典型产消架构:传感器 → 中间处理 → UI 渲染 → 后台上传。UI 任务可加载不同“视图模块”。
- 学到:模块化设计、抽象显示接口、设备兼容层、动态加载(RT-Thread)
- 工期:1~3 月(按功能扩展)
常见 RTOS 与显示器集成模式(实操技巧)
- 单一显示驱动任务:只让
Task_Display访问 SSD1306;其它任务通过Queue发消息(UIEvent)给它,避免并发 I2C/SPI 访问。 - 双缓冲(若内存允许):在后台绘制一帧,然后切换指针并通知渲染任务发送缓存到显示。避免闪烁。
- 优先级设置:UI 渲染通常为中等优先;低延迟输入(按键/编码器)任务优先级比 UI 高,避免输入丢失。
- 资源保护:I2C/SPI 使用
mutex或 RTOS 的 device model(RT-Thread)防止竞争。 - 节能考虑:长时间不交互可把显示降亮或进入休眠,由外部按键/触摸唤醒(使用 RTC / EXTI)。
例:一个最小的 FreeRTOS UI 任务骨架(SSD1306,伪代码)
c
// 伪代码,表达结构,不可直接编译
QueueHandle_t uiQueue;
SemaphoreHandle_t i2cMutex;
void Task_Display(void *pv) {
UIFrame frame;
while (1) {
// 等待事件或超时刷新
if (xQueueReceive(uiQueue, &frame, pdMS_TO_TICKS(100))) {
// got new frame or event
}
// 1. 绘制到局部缓冲
draw_frame(&frame);
// 2. 发送到显示(保护 I2C)
xSemaphoreTake(i2cMutex, portMAX_DELAY);
ssd1306_send_buffer();
xSemaphoreGive(i2cMutex);
}
}
void Task_Sensor(void *pv) {
SensorData sd;
while (1) {
read_sensor(&sd);
UIEvent ev = make_event_from_sensor(sd);
xQueueSend(uiQueue, &ev, 0);
vTaskDelay(pdMS_TO_TICKS(500));
}
}下面给你设计一个**“类 Qt 概念、专为单片机 + RTOS/裸机打造”**的 UI 框架方案。 目标就是:控件模型 + 事件系统 + 渲染抽象层,保证 像 Qt 一样用着爽,但 又能完全脱离 RTOS。
这是一个非常适合你(F103/F407/ESP32S3 全学完)来做的框架级项目,它可以成为你开源作品/简历亮点。
🚀 最终方案:µGUIX —— 类 Qt 风格的轻量 MCU UI 控件库
(你可以随意换名字)
🎯 设计目标
✔ 类 Qt 的控件体系(widget tree) ✔ 信号/槽或事件回调 ✔ 渲染驱动与硬件抽象层分离(HAL + Device Layer) ✔ 完全 RTOS 无关:
- 如果有 RTOS → 使用 Queue/Timer 适配器
- 如果裸机 → 使用轮询 + 中断回调 ✔ 轻量:可跑在 20KB RAM 左右(STM32F103) ✔ 支持 SSD1306 / LCD1602(自动适配文本或图形) ✔ 后续可扩展 LVGL、TFT、RGB565 屏
🧱 框架整体结构(设计图)
+--------------------+ +-------------------+
| User Application | | RTOS (可选) |
| - 创建窗口/控件 | | - 定时器适配器 |
| - 注册事件处理 | | - Queue 适配器 |
+--------------------+ +-------------------+
| |
v v
+------------------------------------------------------+
| µGUIX 核心框架(重点) |
|------------------------------------------------------|
| 1. Widget 管理层(类似 Qt Widgets) |
| - Widget 结构体 |
| - Layout 自动布局(可选) |
| - 重绘树管理(Dirty Region) |
| |
| 2. Event/Signal 系统 |
| - Input 事件 (click / long press / wheel ...) |
| - 硬件事件 → 通用事件转换 |
| - 类似 signal-slot / callback |
| |
| 3. Rendering 抽象层 |
| - 驱动无关 |
| - frame buffer API: drawPixel()/fillRect() |
| - 支持单色/字符/彩屏 |
| |
| 4. Device Layer(硬件抽象) |
| - SSD1306 驱动适配器 |
| - LCD1602 字符屏适配器 |
| - ILI9341 / ST7789 彩屏适配器(可选) |
| |
+------------------------------------------------------+
|
v
+--------------------+
| HAL / BSP 驱动 |
| (I2C/SPI/GPIO/EXIO)|
+--------------------+🧩 关键技术特点(Qt 风格)
1) 控件树(Widget Tree)
每个控件是一个节点,有父子关系:
c
typedef struct Widget {
int x, y, w, h;
struct Widget *parent;
struct Widget *children[MAX_CHILDREN];
void (*paint)(struct Widget*); // 渲染回调
void (*event)(struct Widget*, GUI_Event*); // 输入事件
bool dirty;
void *userdata;
} Widget;控件添加、布局自动完成:
c
Widget_Label *label = gui_label_create(root, "Hello");
Widget_Button *btn = gui_button_create(root, "OK");2) 事件系统(Qt signal/slot 的 MCU 版本)
核心思想:
- 事件统一:点击、长按、定时器、键盘、滑动全走同一通道
- 控件只处理自身事件(类 Qt event filter)
- 最终是回调 / observer pattern:
c
void my_button_clicked(void* arg) {
printf("Button clicked!\n");
}
gui_button_onClick(btn, my_button_clicked, NULL);事件结构:
c
typedef enum {
GUI_EVT_CLICK,
GUI_EVT_LONG_PRESS,
GUI_EVT_UPDATE,
GUI_EVT_TIMER,
GUI_EVT_KEY,
...
} GUI_EventType;
typedef struct {
GUI_EventType type;
int x, y;
void *data;
} GUI_Event;3) 渲染层完全抽象(支持 SSD1306 / LCD1602 / TFT)
你只需要提供几个函数:
c
typedef struct {
void (*drawPixel)(int x, int y, uint16_t color);
void (*drawRect)(int x, int y, int w, int h, uint16_t color);
void (*fillRect)(...);
void (*drawChar)(...);
void (*update)(void); // flush to real screen
} GUI_Driver;SSD1306 适配:
c
GUI_Driver driver = {
.drawPixel = ssd1306_draw_pixel,
.drawRect = ssd1306_draw_rect,
.drawChar = font8x16_draw_char,
.update = ssd1306_flush,
};LCD1602 适配(文本 UI):
c
GUI_Driver driver = {
.drawChar = lcd1602_draw_char,
.update = lcd1602_refresh,
// drawPixel 不实现也可以
};框架完全不需要知道用的是 OLED 还是字符屏。
4) 与 RTOS 解耦
裸机模式
用户:
c
while (1) {
gui_poll_input();
gui_update();
delay(5);
}FreeRTOS 适配模式
你创建一个 GUI_Task:
c
void vGuiTask(void *pv) {
for (;;) {
gui_tick(); // 事件派发
gui_update(); // 绘制
vTaskDelay(5);
}
}甚至可以提供现成适配:
c
gui_enable_freertos_mode(GUI_FREERTOS_USE_TIMERS | GUI_FREERTOS_USE_QUEUE);用户完全不用关心底层。
🧩 提供哪些控件?
基础控件
- Label
- Button
- ProgressBar
- TextBox(可选)
- Canvas(自绘)
布局控件
- VBoxLayout
- HBoxLayout
- GridLayout(可选)
高级控件(扩展包)
- ListView(滑动列表)
- Menu
- Chart(折线图/柱状图)
- Popup/消息框
SSD1306 在 128×64 尺寸下也能用。
🔥 示范代码(真的很像 Qt)
c
gui_init(driver);
Widget *root = gui_root();
Widget *label = gui_label_create(root, "Hello World");
gui_widget_set_pos(label, 0, 0);
Widget *btn = gui_button_create(root, "OK");
gui_widget_set_pos(btn, 0, 20);
gui_button_onClick(btn, [](void*){
gui_label_set_text(label, "Pressed!");
}, NULL);
gui_exec(); // RTOS: 起线程 裸机: 进入主循环是不是像极了 Qt Widgets?😄
🔧 为你列好开发路线(3~6 周项目)
第 1 阶段(框架骨架)
- Widget 结构体
- Tree 管理
- 事件系统(click/longpress/key)
- 渲染抽象 Driver API
第 2 阶段(基础控件)
- Label / Button
- Canvas
- 布局管理器
第 3 阶段(SSD1306 适配)
- 帧缓冲
- drawPixel/drawChar
- flush(I2C DMA + 分段)
第 4 阶段(LCD1602 适配)
- 文本模式渲染
- GUI → 字符映射
第 5 阶段(RTOS/裸机 适配层)
- FreeRTOS queue/timer 封装
- RT-Thread event/timer 封装
🏆 最终成品特点(能在 GitHub 上火的级别)
- 统一 API(类似 Qt)
- 多显示兼容(SSD1306/LCD1602/TFT)
- RTOS/裸机通用
- 控件体系完善
- 动画与 redrawing pipeline 简洁
- 示例项目:菜单系统 + 仪表盘 + 游戏