Skip to content

入门(快速上手 · 1~2 周)

  1. 可编程按键盘 / 宏盘(USB HID)
    • 推荐:STM32F103(或 STM32F407)
    • 要点:按键矩阵、USB HID(键盘)、防抖、LED 指示、Flash 存储宏配置
    • 学到:GPIO 扫描、中断、USB Device(TinyUSB/STM32 USB 库)、Flash 操作
    • 组件:按键、二三极管(消抖)、小 OLED、Type-C 母座
    • 时间:1 周内(周末两天可做出雏形)
  2. 低功耗环境监测节点(温湿度+光线)
    • 推荐:STM32F103 或 ESP32S3(若需 Wi-Fi)
    • 要点:传感器读取(DHT22/BME280/光电)、睡眠/唤醒、数据上报(MQTT/HTTP)
    • 学到:I2C/SPI、低功耗模式、RTC 唤醒、串口/网络通讯基础
    • 组件:BME280、光电传感器、LiPo+充电模块(可选)、ESP8266/ESP32 作网关
    • 时间:周末到一周
  3. 数字示波器(简版,1~2ch)
    • 推荐:STM32F407(高速 ADC)
    • 要点:高速采样、DMA、缓冲区、简单触发、LCD 显示(LVGL 可选)
    • 学到:ADC + DMA、采样定时器、缓冲区管理、图形显示
    • 组件:高速采样电路、ADC 输入保护、TFT 显示屏
    • 时间:2 周(做基础波形显示)

进阶(功能丰富 · 2~6 周)

  1. 便携式音乐/吉他效果器(DSP)
    • 推荐:STM32F407(浮点、FPU),可外接 DAC/ADC
    • 要点:实时音频采样、滤波器(IIR/FIR)、效果链(失真、合唱、混响)、延迟
    • 学到:实时信号处理、PCM、定时器与中断优先级、音频接口(I2S/PCM)
    • 组件:高质量 ADC/DAC(或 codec)、输入/输出接口、踏板开关
    • 时间:4~8 周
  2. 图形化触摸控制面板
    • 推荐:STM32F407 + 480×320 TFT(或直接 ESP32S3 + LVGL)
    • 要点:触摸驱动、LVGL UI、动画、页面管理、配置存储
    • 学到:图形界面设计、触摸校准、GUI 性能优化、文件系统(SD 卡)
    • 时间:2~4 周
  3. 智能门禁(人脸/指纹 + 网络)
    • 推荐:ESP32S3(Wi-Fi/BT,支持 ML / 轻量人脸) + STM32F103 做外围控制可选
    • 要点:摄像头接入、指纹模块、网络认证(JWT/MQTT)、日志存储
    • 学到:摄像头驱动、边缘轻量识别、加密认证、后端交互
    • 时间:4~6 周

高级 / 挑战(大型或跨学科 · 1~3 月)

  1. 四轴飞控(简化版)
    • 推荐:STM32F407(运动控制) + 外置 IMU(MPU9250)
    • 要点:传感器融合(AHRS)、PID 控制、PWM 输出、串口遥控、日志回放
    • 学到:传感器校准、姿态估计、控制回路与实时系统设计
    • 组件:IMU、ESC、无刷电机、遥控接收器、机架
    • 时间:1~3 月(含调试)
  2. 小型 CNC / 激光刻印机控制器
    • 推荐:STM32F407(步进/伺服控制)
    • 要点:步进电机控制(微步)、G-code 解析、限位与回零、运动规划(插补)
    • 学到:运动控制、时间敏感的中断/定时器设计、文件解析与串口/USB 通信
    • 时间:1~2 月
  3. 边缘 TinyML 项目:关键词唤醒 / 分类
    • 推荐:ESP32S3(向量处理、指令集支持)
    • 要点:录音前端、MFCC 特征提取、TF-Lite Micro 模型部署、功耗优化
    • 学到:音频前处理、模型量化、推理工程化、在线更新模型
    • 时间:3~8 周
  4. 多节点无线传感网(Mesh/LoRa/ESP-NOW)
    • 推荐:ESP32S3(或 STM32 + LoRa 模组)
    • 要点:节点自组网、路由/数据汇聚、远程 OTA、低功耗策略
    • 学到:网络协议、同步、错误恢复、规模化部署问题
    • 时间:1~2 月

创意混合(把不同 MCU 的强项组合起来)

  1. 智能家居中枢(STM32F407 作实时外设控制,ESP32S3 作云连接与 UI)
    • 用 STM32F407 做灯光、窗帘、传感器采集与实时任务;ESP32S3 做 Web UI、语音或 ML 本地服务。学到:跨 MCU 通讯(UART/I2C/SPI/RS485)、分层架构、固件升级策略。
  2. 机器人(主控 STM32F407,视觉/语音由 ESP32S3 处理)
    • STM32F407 负责底盘与伺服控制,ESP32S3 负责摄像头/语音识别与高层行为决策,二者通过 UART 或 CAN 协作。学到:模块化分工、串口协议设计、AI 与控制协同。
  3. 专业数据采集仪(多通道高精度,STM32F407 采集,ESP32S3 上传和可视化)
    • 采样与时序由 STM32F407 精确控制,ESP32S3 定时上传云端并提供手机实时图表。学到:时间同步、缓冲/流控、前端可视化与后端接口。
  4. 可编程工业网关(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(周期采样)→ QueueTask_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(中优先)—— 切换动画、参数调整
    • 使用 TimervTaskDelayUntil 精准帧率
  • BOM:SSD1306、按键或编码器
  • 学到:帧率控制、位图合成、内存优化(帧缓冲压缩)
  • 工期:3~7 天

5) 简易音乐可视化(频谱条/波形)

  • MCU:STM32F407(较高 ADC 采样)或 ESP32S3(内建 ADC)
  • 显示:SSD1306(简化频谱)或 TFT(更丰富)
  • RTOS 结构
    • Task_ADC(DMA + 双缓冲)→ QueueTask_Proc(FFT/倒谱)→ Task_Display
    • Semaphore 用于缓冲切换
  • 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 接收处理)→ QueueTask_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_threadrt_mq/rt_sem 实现页面切换与插件加载
    • 借助 RT-Thread 的文件系统、设备模型做模块化(插件热插拔、SD 卡加载主题)
  • 学到: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 与显示器集成模式(实操技巧)

  1. 单一显示驱动任务:只让 Task_Display 访问 SSD1306;其它任务通过 Queue 发消息(UIEvent)给它,避免并发 I2C/SPI 访问。
  2. 双缓冲(若内存允许):在后台绘制一帧,然后切换指针并通知渲染任务发送缓存到显示。避免闪烁。
  3. 优先级设置:UI 渲染通常为中等优先;低延迟输入(按键/编码器)任务优先级比 UI 高,避免输入丢失。
  4. 资源保护:I2C/SPI 使用 mutex 或 RTOS 的 device model(RT-Thread)防止竞争。
  5. 节能考虑:长时间不交互可把显示降亮或进入休眠,由外部按键/触摸唤醒(使用 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 简洁
  • 示例项目:菜单系统 + 仪表盘 + 游戏

Built with VitePress