1. 项目背景与参赛概况
去年参加的第十三届全国大学生电子设计竞赛(国赛)是我单片机学习路上的重要里程碑。作为电子信息工程专业的学生,这次比赛不仅检验了我两年来的学习成果,更让我深刻体会到工程实践与理论学习的差异。我们团队选择的题目是"基于STM32的智能环境监测系统",最终获得了省级一等奖的成绩。
这个项目本质上是一个综合性的嵌入式系统开发案例,涉及传感器数据采集、无线通信、上位机交互等多个技术模块的集成。在四天三夜的比赛周期内,我们需要完成从硬件选型、电路设计到软件编程、系统调试的全流程开发。这种高强度、全流程的实战经历,对任何嵌入式开发者来说都是难得的成长机会。
2. 系统架构设计思路
2.1 整体方案选型
面对环境监测这个命题,我们首先明确了系统的核心需求:
- 多参数监测(温湿度、光照、空气质量)
- 实时数据显示与报警
- 数据存储与远程传输
- 低功耗运行
经过方案对比,我们最终确定了以STM32F407为主控,搭配DHT22温湿度传感器、BH1750光照传感器和SGP30空气质量传感器的硬件架构。选择STM32F407主要基于三点考虑:
- 充足的IO口和通信接口(我们用了3个I2C、1个SPI和2个USART)
- 内置浮点运算单元,适合传感器数据处理
- 丰富的官方库支持,加快开发进度
2.2 通信方案设计
在无线传输方案上,我们对比了ESP8266、LoRa和NB-IoT三种主流方案:
| 方案 | 传输距离 | 功耗 | 成本 | 开发难度 | 适用场景 |
|---|---|---|---|---|---|
| ESP8266 | 中等 | 较高 | 低 | 简单 | 室内短距离 |
| LoRa | 远 | 低 | 中 | 中等 | 远距离低功耗 |
| NB-IoT | 全覆盖 | 最低 | 高 | 复杂 | 广域物联网 |
考虑到比赛环境是室内场地且需要实时传输,最终选择了ESP8266 WiFi模块。虽然功耗较高,但其成熟的AT指令集和稳定的TCP/IP协议栈可以大幅缩短开发周期。
3. 关键模块实现细节
3.1 传感器数据采集优化
在实际调试中发现,直接读取传感器数据存在两个主要问题:
- 不同传感器的响应时间差异导致数据同步困难
- 环境干扰导致数据跳变严重
我们的解决方案是:
c复制// 数据采集时序优化
void Sensor_Update(void)
{
static uint32_t last_time = 0;
if(HAL_GetTick() - last_time < 100) return; // 100ms采集周期
// 分时采集不同传感器
switch(state_machine){
case 0: DHT22_Start(); break;
case 1: BH1750_Start(); break;
case 2: SGP30_Start(); break;
}
state_machine = (state_machine + 1) % 3;
last_time = HAL_GetTick();
}
// 数据滤波算法
float Moving_Average(float new_val)
{
static float buffer[10] = {0};
static uint8_t index = 0;
float sum = 0;
buffer[index] = new_val;
index = (index + 1) % 10;
for(int i=0; i<10; i++){
sum += buffer[i];
}
return sum/10.0f;
}
3.2 低功耗设计技巧
虽然比赛对功耗要求不高,但我们还是实现了一些低功耗优化:
- 动态调整主频:在数据采集时运行在168MHz,空闲时降至48MHz
- 外设时钟管理:不使用的通信接口及时关闭时钟
- 传感器供电控制:通过MOSFET开关控制传感器电源
- 无线模块休眠:ESP8266在无数据传输时进入Light Sleep模式
实测这些优化使系统平均功耗从120mA降至65mA,电池续航时间几乎翻倍。
4. 现场调试与问题排查
4.1 典型问题记录
在比赛现场我们遇到了几个棘手问题:
问题1:ESP8266频繁断连
- 现象:WiFi连接每10-15分钟断开一次
- 排查:用逻辑分析仪抓取AT指令,发现是路由器DHCP租期问题
- 解决:在代码中增加定时重连机制,并设置更短的DHCP续约间隔
问题2:温湿度数据异常跳变
- 现象:DHT22偶尔返回85°C/100%RH的异常值
- 排查:检查硬件连接发现是1m长的杜邦线引入干扰
- 解决:改用屏蔽线并缩短至30cm,同时在软件增加数据校验
问题3:LCD显示闪烁
- 现象:屏幕刷新时有明显闪烁感
- 排查:示波器显示SPI时钟信号质量差
- 解决:降低SPI时钟频率从18MHz到8MHz,并增加10Ω串联电阻
4.2 调试工具使用心得
几个在比赛中帮了大忙的调试技巧:
- SWD调试:通过STM32CubeIDE的实时变量监控功能,可以观察关键变量的变化
- 串口日志分级:将日志分为ERROR/WARNING/INFO三级,通过宏定义控制输出级别
- LED状态指示:用RGB LED的不同颜色组合表示系统各模块状态
- 备用调试接口:除了主串口外,预留一个USART接口备用
5. 比赛经验与建议
5.1 时间管理策略
四天三夜的比赛时间看似充裕,实则非常紧张。我们的时间分配如下:
- 第一天:方案确定与硬件搭建(20%)
- 第二天:核心功能实现(40%)
- 第三天:系统优化与稳定性测试(30%)
- 第四天上午:文档整理与视频录制(10%)
关键建议:
- 第一天晚上必须完成最小系统搭建
- 第二天结束前要实现所有基础功能
- 预留最后半天专门处理突发问题
5.2 团队协作要点
三人团队的理想分工模式:
- 硬件工程师:负责电路设计、PCB绘制和焊接
- 嵌入式软件工程师:负责单片机程序开发
- 算法工程师:负责数据处理和上位机交互
我们采用Git进行代码版本控制,每天早晚各进行一次代码同步。硬件设计使用Altium Designer的团队协作功能,确保原理图与PCB同步更新。
5.3 常见失误规避
根据赛后总结和其他队伍的教训,列出几个常见失误:
- 过度追求高性能而忽略稳定性
- 没有准备备用元器件(我们烧毁了2个ESP8266模块)
- 文档编写留到最后一天导致匆忙出错
- 测试用例不完整,现场演示时出现意外
- 电源设计不合理导致系统不稳定
6. 后续改进方向
比赛结束后,我们对系统进行了进一步优化:
- 改用STM32U5系列单片机,功耗降低至原来的1/3
- 增加BLE Mesh组网功能作为WiFi的备份通信方案
- 开发Android APP替代原来的PC上位机
- 加入机器学习算法实现异常数据检测
这套系统后来被改进用于学校实验室的环境监控,连续运行6个月无故障。最大的收获不是奖项本身,而是完整项目开发的经验和解决实际问题的能力。对于准备参加电子设计竞赛的同学,我的建议是:多积累底层驱动开发经验,熟练掌握常用调试工具,并且在赛前做好充分的模块化代码储备。