1. 项目概述
这个基于STM32的智能停车场系统是我去年指导的一个本科毕业设计项目,整个系统采用主从机分布式架构,通过Zigbee无线通信实现车位状态监测与车辆引导功能。主机端负责车辆检测和引导显示,从机端负责车位状态采集,整套系统成本控制在200元以内,非常适合作为嵌入式开发的练手项目。
在实际应用中,我们发现这种设计方案特别适合小型商场、社区停车场等场景。相比传统停车场系统动辄上万的造价,这个方案不仅成本低廉,而且完全自主可控,后期维护和功能扩展都非常方便。下面我就从硬件设计、软件实现到调试经验,详细拆解这个项目的技术细节。
2. 系统架构设计
2.1 整体方案选型
为什么选择主从机架构?主要基于三点考虑:
- 扩展性:从机可以灵活增加,每个从机监控4-8个车位
- 布线简便:无线通信避免了长距离布线
- 故障隔离:单个从机故障不影响整体系统
通信方式上,我们对比了三种方案:
- WiFi:功耗高,需要路由器支持
- 蓝牙:传输距离有限(约10米)
- Zigbee:低功耗,自组网,传输距离可达100米
最终选择Zigbee模块(型号:XBEE S2C)主要考虑到停车场环境通常面积较大,且需要长期稳定运行。实测在空旷场地,两个模块间通信距离能达到80米左右,完全满足中小型停车场需求。
2.2 硬件组成框图
主机端硬件配置:
- 主控:STM32F103C8T6(72MHz Cortex-M3)
- 输入:
- 光电传感器(车辆检测)
- Zigbee模块(接收车位数据)
- 输出:
- 8x8 LED点阵(引导显示)
- 状态指示灯LED
- 电源:5V/2A DC-DC降压模块
从机端硬件配置:
- 主控:STM32F103C8T6
- 输入:
- 4路红外避障传感器(E18-D80NK)
- 输出:
- Zigbee模块
- 电源:5V/1A LDO稳压
特别注意:红外传感器选型时要注意检测距离可调(E18-D80NK的检测距离可通过电位器在3-80cm间调节),这样可以根据不同车型调整最佳检测位置。
3. 核心电路设计
3.1 主控电路设计
STM32F103C8T6最小系统包含:
- 电源电路:3.3V LDO(AMS1117-3.3)
- 复位电路:10k上拉电阻+0.1uF电容
- 时钟电路:8MHz晶振+22pF负载电容
- 调试接口:SWD四线接口(VCC、GND、SWDIO、SWCLK)
PCB设计要点:
- 晶振尽量靠近MCU,走线等长
- 电源滤波:每个电源引脚放置0.1uF去耦电容
- 覆铜时保持完整地平面
3.2 传感器接口电路
红外避障传感器接口:
code复制VCC --- 5V
GND --- GND
OUT --- PA0-PA3(配置为上拉输入)
光电传感器电路特别增加了施密特触发器(74HC14)进行信号整形,避免车辆缓慢通过时产生抖动信号。
3.3 点阵驱动电路
采用MAX7219驱动8x8点阵,硬件连接:
code复制DIN --- PB15
CS --- PB12
CLK --- PB13
软件配置要点:
c复制void MAX7219_Init(void)
{
// 设置解码模式:不使用BCD解码
MAX7219_Write(0x09, 0x00);
// 设置亮度:0x00-0x0F
MAX7219_Write(0x0A, 0x03);
// 扫描位数:使用8位数码管
MAX7219_Write(0x0B, 0x07);
// 正常工作模式
MAX7219_Write(0x0C, 0x01);
// 显示测试:正常显示
MAX7219_Write(0x0F, 0x00);
}
4. 软件实现
4.1 主程序流程
主机端主程序逻辑:
c复制while(1)
{
// 1. 检测车辆入场
if(Check_Car_Enter())
{
// 2. 获取车位状态
Get_Parking_Status();
// 3. 计算最优车位
uint8_t best_spot = Find_Best_Spot();
// 4. 显示引导信息
Show_Guidance(best_spot);
}
HAL_Delay(100);
}
从机端主要实现定时扫描(每500ms一次):
c复制void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim3)
{
// 扫描4路传感器
for(int i=0; i<4; i++)
{
spot_status[i] = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0 << i);
}
// 通过Zigbee发送状态
Zigbee_Send(spot_status);
}
}
4.2 Zigbee通信协议
自定义的简单通信协议:
code复制帧头(0xAA) | 从机ID(1字节) | 车位状态(1字节) | 校验和(1字节)
车位状态字节定义:
code复制bit0: 车位1状态(0-空,1-占用)
bit1: 车位2状态
bit2: 车位3状态
bit3: 车位4状态
bit4-7: 保留
校验和计算:
c复制uint8_t checksum = 0;
for(int i=0; i<3; i++)
{
checksum += frame[i];
}
frame[3] = ~checksum;
5. 调试经验与优化
5.1 常见问题排查
-
红外传感器误触发
- 现象:无车时显示车位占用
- 解决方案:
- 调整传感器灵敏度
- 增加软件滤波(连续3次检测为真才判定)
-
Zigbee通信不稳定
- 现象:数据丢包
- 解决方案:
- 调整天线位置(垂直放置最佳)
- 降低波特率(从115200改为9600)
- 增加重发机制(3次重试)
-
点阵显示闪烁
- 现象:箭头显示不稳定
- 解决方案:
- 提高刷新频率(从100Hz提高到500Hz)
- 增加显示缓冲机制
5.2 性能优化技巧
-
电源管理优化:
- 从机端增加休眠模式(无车时进入STOP模式)
- 主机端采用事件驱动代替轮询
-
算法优化:
c复制// 原顺序查找改为位操作
uint8_t Find_Best_Spot(void)
{
if(status_byte & 0x03) return 2; // 左侧优先
if(status_byte & 0x0C) return 3; // 右侧次之
return 4; // 全满
}
- 显示优化:
- 增加入场动画效果
- 不同时段调整亮度(夜间自动降低)
6. 扩展与改进方向
在实际部署后,我们发现还可以做这些改进:
- 增加超声波测距模块,实现车位占用程度检测(区分轿车/SUV)
- 改用LoRa通信,适合更大范围的停车场
- 添加OLED显示屏,显示空余车位数量
- 集成重量传感器,防止误判(如购物车触发)
- 开发手机APP查看实时车位状态
硬件上可以考虑:
- 改用STM32G0系列降低成本
- 集成太阳能供电模块
- 采用防水外壳适应户外环境
这个项目最让我满意的是它的实用性和扩展性。通过毕业设计的标准实现,我们最终做出了一个真正可用的智能停车场原型系统。学生们在项目中不仅掌握了STM32开发、无线通信、传感器应用等核心技能,更重要的是培养了解决实际工程问题的能力。
