1. 项目概述:从纸质课表到智能终端的蜕变
每次走过教学楼走廊,那些贴在教室门口的纸质课表总让我思考:在数字化时代,这种传统信息展示方式是否显得过于落后?油墨打印的表格不仅更新麻烦,遇到临时调课还得人工更换,更别说统计考勤这种附加功能了。这就是我决定开发这套嵌入式教务显示系统的初衷——用一块智能终端替代传统纸质课表。
这个系统的核心是一块基于STM32F103RCT6的硬件平台,集成了TFT-LCD显示屏、Wi-Fi模块、RFID读卡器和SD卡槽。它不仅能动态显示课程信息,还可以实现学生刷卡签到、远程管理等功能。相比传统方案,这套系统有三大突破:
- 实时性:通过Wi-Fi自动同步云端数据,调课信息即时更新
- 交互性:RFID模块支持学生刷卡签到,数据自动上传
- 扩展性:预留的GPIO接口可连接温湿度传感器等外设
硬件选型时我特别注重成本控制,整套BOM成本控制在150元以内,比商用电子班牌便宜80%以上,非常适合学校批量部署。
2. 硬件架构设计与关键器件选型
2.1 系统整体框架解析
系统的硬件架构采用模块化设计,以STM32为主控,通过标准接口连接各功能模块。这种设计有两大优势:一是故障模块可以单独更换,二是便于功能扩展。具体来看主要包含以下子系统:
- 主控单元:STM32F103RCT6最小系统
- 显示系统:2.8寸IPS TFT-LCD(320x240分辨率)
- 通信模块:ESP8266 Wi-Fi模组
- 存储介质:MicroSD卡(最大支持32GB)
- 身份识别:RC522 RFID读卡器
- 人机交互:蜂鸣器+LED状态指示灯

2.2 核心器件选型详解
2.2.1 STM32主控芯片
选择STM32F103RCT6主要基于三点考量:
- 性能平衡:72MHz主频的Cortex-M3内核,处理GUI刷新和网络通信游刃有余
- 外设丰富:自带3个USART、2个SPI和2个I2C接口,完美适配所有外设
- 开发生态:丰富的HAL库和参考设计,大幅降低开发难度
特别值得一提的是其存储配置:
- 256KB Flash:足够存储整个GUI界面资源
- 48KB SRAM:可流畅运行FATFS文件系统
- 通过FSMC接口驱动LCD,刷新率可达30fps
2.2.2 显示模块选型对比
在测试了多款屏幕后,最终选定这款2.8寸IPS屏,原因如下:
| 参数 | 候选型号A | 候选型号B | 选定型号 |
|---|---|---|---|
| 分辨率 | 240x320 | 240x320 | 240x320 |
| 接口类型 | SPI | FSMC | FSMC |
| 刷新率 | 15fps | 30fps | 30fps |
| 可视角度 | 160° | 178° | 178° |
| 功耗 | 80mA | 120mA | 100mA |
FSMC接口虽然布线复杂,但刷新率是SPI接口的两倍,这对需要频繁更新内容的课表显示至关重要。
3. 软件系统实现关键点
3.1 文件系统设计与优化
3.1.1 FATFS移植实战
SD卡采用FAT32格式,通过SPI接口与MCU通信。移植FATFS时需要注意:
- 修改diskio.c中的底层驱动函数
- 配置
_USE_LFN=1支持长文件名 - 设置
_FS_REENTRANT保证线程安全
典型文件操作流程:
c复制FATFS fs;
FIL fil;
f_mount(&fs, "", 1); // 挂载文件系统
f_open(&fil, "schedule.txt", FA_READ); // 打开文件
f_read(&fil, buffer, sizeof(buffer), &br); // 读取数据
f_close(&fil); // 关闭文件
实测发现,将SD卡格式化为16KB簇大小可使读取速度提升约20%
3.1.2 课程数据存储格式
课程信息采用CSV格式存储,示例:
code复制周一,1-2节,高等数学,A201,张教授
周一,3-4节,大学物理,B105,李教授
...
这种结构化存储方式既便于人工维护,又方便程序解析。每学期初只需更新SD卡中的文件即可完成课表部署。
3.2 Wi-Fi通信实现
3.2.1 机智云协议解析
使用ESP8266通过AT指令连接机智云平台,关键步骤:
- 配置STA模式连接校园Wi-Fi
- 建立MQTT连接云端
- 订阅数据点实现双向通信
时间同步采用NTP协议:
c复制void get_ntp_time() {
char cmd[] = "AT+CIPSNTPTIME?\r\n";
esp8266_send_cmd(cmd, "OK", 2000);
// 解析返回的时间数据
}
3.2.2 断网处理机制
考虑到校园网络可能不稳定,系统实现了三级容错:
- 首次尝试:等待5秒重连
- 二次尝试:复位Wi-Fi模块
- 最终方案:使用RTC维持基本计时功能
4. 核心功能实现细节
4.1 动态课表显示算法
课表显示的核心是日期计算算法,主要流程:
- 从SD卡读取学期开始日期(如20230901)
- 获取当前NTP时间
- 计算相差天数→当前周数
- 根据周数筛选对应课程
c复制int calculate_week() {
struct tm start_date = {0};
start_date.tm_year = 2023 - 1900;
start_date.tm_mon = 8; // 9月
start_date.tm_mday = 1;
time_t start = mktime(&start_date);
time_t now = time(NULL);
return (int)difftime(now, start) / (7 * 86400) + 1;
}
4.2 RFID考勤系统
RC522模块采用SPI通信,典型操作序列:
- 寻卡→防冲突→选卡
- 验证密钥(默认FF FF FF FF FF FF)
- 读取卡号(学号)
- 记录时间戳并上传
为提高识别率,软件层面做了两点优化:
- 动态调整天线增益
- 实现防抖算法(间隔500ms才处理第二次刷卡)
5. 系统测试与性能优化
5.1 压力测试数据
对关键指标进行了72小时连续测试:
| 测试项目 | 初始值 | 优化后 | 提升幅度 |
|---|---|---|---|
| 启动时间 | 4.2s | 2.8s | 33% |
| 刷卡响应 | 800ms | 300ms | 62.5% |
| 网络重连 | 15s | 8s | 47% |
| 功耗(常亮) | 1.2W | 0.9W | 25% |
5.2 常见问题排查指南
-
LCD显示花屏
- 检查FSMC时序配置
- 确保背光供电稳定(3.3V±5%)
-
SD卡读取失败
- 重新格式化SD卡为FAT32
- 降低SPI时钟频率(实测8MHz最稳定)
-
Wi-Fi频繁断开
- 调整ESP8266固件版本(推荐v2.2.0)
- 添加10uF去耦电容靠近模块电源引脚
6. 项目演进与扩展思考
这套系统在实际部署后,根据用户反馈又迭代了两个重要功能:
- 多语言支持:通过Unicode字库实现中英文切换
- 紧急通知通道:云端推送优先显示紧急通知
未来还可以扩展:
- 增加人脸识别考勤
- 集成环境传感器(CO₂、温湿度)
- 开发微信小程序远程管理
在开发过程中最深的体会是:嵌入式开发必须注重细节。比如最初没注意FSMC的时序配置,导致LCD偶尔出现显示异常;Wi-Fi模块的天线布局不当也会大幅降低信号强度。这些问题都需要通过严谨的测试来发现和解决。