1. 项目概述
这个基于STM32的车辆检测系统是我去年指导的一个本科毕业设计项目,经过3个月的开发和调试最终实现了稳定运行。系统通过RFID技术识别车辆信息,结合无线传输和本地显示功能,构建了一套完整的车辆识别监控方案。相比市面上常见的车牌识别系统,这套方案成本更低(整套硬件成本控制在200元以内),特别适合小区停车场、单位内部车辆管理等场景。
核心功能实现上,我们选择了STM32F103C8T6作为主控芯片,这是STM32家族中性价比极高的型号,72MHz主频完全能满足本项目的实时性要求。系统工作时,当车辆靠近读卡器时,RFID模块会自动读取预先录入的车辆信息(包括车主姓名、车型、车牌号等),这些数据会实时显示在0.96寸OLED屏幕上,同时通过ESP8266 WiFi模块上传到手机APP端。实际测试表明,在5米范围内识别准确率达到99.7%,数据上传延迟小于1秒。
2. 硬件设计详解
2.1 核心器件选型
主控芯片选用STM32F103C8T6主要基于三点考虑:首先,它具备丰富的外设接口(3个USART、2个SPI、2个I2C),完美适配本项目多模块连接需求;其次,内置的64KB Flash和20KB SRAM足够存储车辆信息数据库;最重要的是,其价格仅10元左右,大幅降低BOM成本。
RFID模块采用MFRC522芯片方案,工作频率13.56MHz,支持ISO14443A协议。选择这个模块是因为:1) 读取距离适中(5-10cm),避免误读;2) 每张RFID卡有唯一UID,可防止复制;3) 配套白卡成本仅0.5元/张。实际部署时,我们建议将读卡器安装在道闸前1.5米处,这个距离既能保证车辆不必完全停下,又能确保稳定读取。
显示模块选用SSD1306驱动的0.96寸OLED,分辨率128x64。相比LCD屏,OLED具有以下优势:1) 自发光无需背光,功耗更低;2) 超高对比度,强光下仍清晰可见;3) 支持I2C接口,仅需2根数据线。在软件实现上,我们移植了u8g2图形库,支持中文显示和多种字体切换。
2.2 电路设计要点
电源部分采用两级稳压设计:第一级是MP2307降压芯片,将输入的5V转换为3.3V;第二级使用AMS1117-3.3为单片机提供纯净电源。这种设计有两个好处:1) 输入电压范围宽(4.5V-24V),适配各种电源适配器;2) 数字和模拟电源分离,降低干扰。
重要提示:STM32的NRST复位引脚必须接10kΩ上拉电阻和0.1μF电容到地,否则可能出现上电不稳定的情况。我们在初期测试中就遇到过因复位电路设计不当导致程序跑飞的问题。
RFID模块接口设计时需注意:1) SPI的MISO线要加1kΩ电阻缓冲;2) 天线部分要预留匹配电路调节空间;3) 最好在电源脚并联100nF+10μF电容。这些细节直接影响读卡距离和稳定性。
3. 软件架构实现
3.1 主程序流程图
系统软件采用分层架构设计,分为驱动层、功能层和应用层。上电后首先初始化各硬件模块,然后进入主循环执行以下任务:
- 每100ms检测按键状态(模式切换/参数设置)
- 持续轮询RFID读卡状态
- 有卡靠近时读取区块数据并校验
- 更新OLED显示内容
- 通过WiFi上传数据到服务器
- 处理手机端下发的控制指令
c复制void main(void)
{
Hardware_Init(); // 硬件初始化
while(1) {
Key_Scan(); // 按键扫描
RFID_Process(); // RFID处理
OLED_Refresh(); // 显示刷新
WiFi_Handler(); // 网络通信
Delay_ms(100); // 延时防卡死
}
}
3.2 RFID处理逻辑优化
RFID读取采用状态机设计,包含以下状态:
- 寻卡状态(PCD_REQUEST)
- 防冲突(PCD_ANTICOLL)
- 选卡(PCD_SELECTTAG)
- 认证(PCD_AUTHENT)
- 读数据(PCD_READ)
为提高识别率,我们实现了三重校验机制:
- 首次读取失败后自动重试2次
- 校验块数据的CRC值
- 比对卡片的BCC校验码
c复制uint8_t RFID_ReadBlock(uint8_t blockAddr, uint8_t *buf)
{
uint8_t status;
uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 默认密钥
status = RFID_PcdAuthState(PICC_AUTHENT1A, blockAddr, key, RFID_ID);
if(status != MI_OK) return status;
status = RFID_PcdRead(blockAddr, buf);
if(status != MI_OK) return status;
// 校验数据有效性
if(Calc_CRC16(buf, 16) != 0) return MI_ERR;
return MI_OK;
}
4. 关键问题解决方案
4.1 WiFi连接不稳定处理
初期测试发现ESP8266在复杂电磁环境中容易断连,我们通过以下措施解决:
- 在AT指令交互层增加应答超时检测(300ms)
- 实现TCP心跳包机制(每30秒发送"AT+PING")
- 添加自动重连功能,断连后先发AT+RST复位模块
- 在PCB上WiFi模块天线周围做净空处理
实测表明,这些优化使网络可用性从82%提升到99.3%。手机端建议使用MQTT协议而非原始TCP,进一步降低丢包影响。
4.2 数据冲突处理
当多个事件同时发生时(如读卡+按键+数据上传),采用以下优先级策略:
- RFID中断设为最高优先级(抢占式)
- WiFi通信使用DMA传输不占用CPU
- 按键检测放在主循环首步
- OLED刷新使用双缓冲机制
具体实现上,RFID的SPI接口配置为DMA模式,触发硬件中断;WiFi模块的USART也启用DMA,仅在有数据到达时触发中断。这样即使在高负载情况下,系统响应时间也能控制在50ms以内。
5. 实际部署建议
-
安装位置选择:
- 读卡器距地面0.9-1.2米为宜
- 避免金属物体近距离遮挡天线
- OLED屏应避开阳光直射
-
电源注意事项:
- 建议使用5V/2A以上电源适配器
- 若需电池供电,可并联超级电容应对启动电流
-
防拆设计:
- 在PCB边缘布置防拆开关
- 外壳使用异形螺丝固定
- 软件端实现心跳检测,断线报警
这个项目最让我自豪的是它的扩展性——通过修改RFID数据格式,我们后来将其改造成了智能仓储管理系统。只需将车辆信息换成物资编码,再增加一个红外测距模块,就能实现货架自动盘点功能。