基于STM32的物联网智能停车系统设计(RC522刷卡出入库 + 自动计费 + 闸道控制)
基于STM32的物联网智能停车系统设计(RC522刷卡出入库 + 自动计费 + 闸道控制)
小区停车场的传统管理模式全靠人工发卡收费,出入口排长队、账目对不上、车位找不到,都是老大难。本文带来一套基于 STM32F103C8T6 的物联网智能停车系统:车主在出入口刷一下 IC 卡,闸道自动抬起、时间自动记录,出库时系统按停车时长自动算费,剩余车位数、出入库记录全部通过 ESP8266 同步到手机 APP。整套方案刷卡识别、计时计费、闸道控制、无线上云一气呵成,是单片机综合应用非常典型的练手项目。
一、系统功能总览
| 功能模块 | 具体说明 |
|---|---|
| 刷卡识别 | RC522 读取 IC 卡唯一卡号,识别车主身份 |
| 入库管理 | 首次刷卡记录入库时间,开闸放行 |
| 出库计费 | 再次刷卡读取时间差,按时长自动计算停车费用 |
| 闸道控制 | ULN2003 驱动步进电机,正转开闸、反转关闸 |
| 实时时钟 | DS1302 提供精准计时,断电后纽扣电池维持走时 |
| 信息显示 | OLED 显示卡片信息、出入库时间、停车费用 |
| 车位同步 | 剩余车位数、出入库记录经 ESP8266 实时上传 APP |
二、核心模块选型对比
2.1 主控芯片:STM32F103C8T6 vs LPC1768
| 对比项 | 方案一:STM32F103C8T6 | 方案二:LPC1768 |
|---|---|---|
| 内核 | Cortex-M3 @72MHz | Cortex-M3 @100MHz |
| Flash/RAM | 64KB / 20KB | 512KB / 64KB |
| 片上外设 | SPI、USART、定时器齐全 | 资源更多但本系统用不上 |
| 生态资料 | 例程丰富、教程极多 | 资料相对较少 |
| 价格 | 约 10 元 | 约 35 元 |
选择方案一(STM32F103C8T6)。系统所需的 SPI、USART、GPIO 数量不多,C8T6 资源绰绰有余,且开发资料最全、成本最低,是中小型控制系统的稳妥之选。
2.2 射频刷卡模块:RC522 vs ST25R3911B
| 对比项 | 方案一:RC522 | 方案二:ST25R3911B |
|---|---|---|
| 协议 | ISO14443-A | ISO14443-A/B、NFC 多协议 |
| 接口 | SPI,驱动成熟 | SPI/I2C |
| 读卡距离 | 0~5cm | 0~5cm |
| 读写功能 | 支持扇区读写与密钥加密 | 同样支持且安全性更高 |
| 价格 | 约 8 元 | 约 45 元 |
选择方案一(RC522)。停车场身份识别只需读取 M1 卡的唯一序列号,RC522 的功能完全覆盖,SPI 驱动代码公开成熟,价格优势明显。
2.3 时钟芯片:DS1302 vs PCF8563
| 对比项 | 方案一:DS1302 | 方案二:PCF8563 |
|---|---|---|
| 接口 | 三线同步串行 | I2C |
| 备用电源 | VBAT 外接纽扣电池 | 同样支持 |
| 计时精度 | ±2s/天(晶振决定) | 精度相当 |
| 价格 | 约 3 元 | 约 5 元 |
选择方案一(DS1302)。计费业务以秒级时间差为依据,DS1302 的精度足够;三线接口代码简单、芯片价格低、后备电池方案成熟,够用且可靠。
2.4 显示模块:OLED12864 vs LCD1602
| 对比项 | 方案一:OLED12864 | 方案二:LCD1602 |
|---|---|---|
| 分辨率 | 128×64 点阵 | 16×2 字符 |
| 显示内容 | 中文、曲线、多行信息 | 仅两行字符,无中文 |
| 接口 | I2C 两线 | 并口 6~11 线 |
| 对比度 | 自发光,无需调节 | 需电位器调对比度 |
选择方案一(OLED12864)。出入库时间、车牌/卡号、费用金额需要多行信息同时显示,OLED 点阵屏可以自定义中文字库,显示内容直观,I2C 接口还节省了 GPIO。
2.5 无线模块:ESP8266 vs nRF24L01
| 对比项 | 方案一:ESP8266 | 方案二:nRF24L01 |
|---|---|---|
| 联网方式 | WiFi 入网直连云平台 | 2.4G 私有协议,需网关 |
| 覆盖范围 | 随路由器覆盖 | 空旷百米级 |
| 上云能力 | TCP 透传即插即用 | 无法独立上云 |
| 价格 | 约 10 元 | 约 8 元 |
选择方案一(ESP8266-01S)。停车记录与剩余车位必须同步到手机端,数据要经云平台转发,ESP8266 独立即可完成入网上云,nRF24L01 还需额外部署接收网关,整体成本反升。
2.7 电机驱动:ULN2003 vs DRV8825
| 对比项 | 方案一:ULN2003 + 28BYJ-48 | 方案二:DRV8825 |
|---|---|---|
| 适配电机 | 四相五线步进电机 | 双极步进/直流电机 |
| 驱动方式 | 达林顿管阵列,灌电流驱动 | H 桥,支持细分 |
| 控制方式 | 四路 IO 按拍序翻转 | 脉冲+方向信号 |
| 转矩 | 低速大转矩,适合闸杆缓动 | 需配套电机,成本高 |
| 价格 | 约 5 元(含电机常见套餐) | 约 15 元(不含电机) |
选择方案一(ULN2003)。闸道模型使用 28BYJ-48 步进电机即可带动,ULN2003 四路输入直接由 GPIO 按四相八拍时序驱动,控制逻辑直观、成本最低。
三、系统接线总表
| 模块 | 引脚 | 连接 STM32 引脚 | 备注 |
|---|---|---|---|
| RC522 | SDA(NSS) | PA4 | 片选,与 3.3V 间接 4.7kΩ 上拉 |
| RC522 | SCK | PA5 | SPI1 时钟 |
| RC522 | MISO | PA6 | 主入从出 |
| RC522 | MOSI | PA7 | 主出从入 |
| RC522 | RST | PB0 | 模块复位 |
| DS1302 | SCLK | PB1 | 时钟线 |
| DS1302 | IO | PB2 | 双向数据线 |
| DS1302 | CE | PB10 | 片选使能,VBAT 接纽扣电池 |
| OLED12864 | SCL/SDA | PB6/PB7 | I2C 接口,SSD1306 驱动 |
| ESP8266 | TXD/RXD | PA3/PA2 | USART2,波特率 115200,交叉相连 |
| ESP8266 | RST | PA8 | 复位控制 |
| ULN2003 | IN1~IN4 | PB12/PB13/PB14/PB15 | 四相八拍驱动 28BYJ-48 步进电机 |
接线说明:RC522 与 DS1302 均为 3.3V 供电,与 STM32 电平直接兼容;28BYJ-48 电机经 ULN2003 驱动板独立供电,避免电机电流冲击主控电源。
四、系统软件设计
4.1 主程序流程
系统上电后初始化各外设并从 DS1302 读取当前时间,随后进入主循环轮询刷卡事件:RC522 检测到卡片 → 读出卡号并在本地记录中查询 → 未查到则记录卡号与入库时间、开闸、剩余车位减一 → 查到记录则计算停车时长与费用、关闸、剩余车位加一 → OLED 刷新显示,并将出入库信息经 ESP8266 同步 APP。主程序骨架如下:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
System_Init(); // GPIO/SPI1/USART2/I2C/定时器初始化
OLED_Init();
OLED_ShowString(0, 0, "Smart Parking");
DS1302_Init();
DS1302_Read_Time(); // 读取当前时间
ESP8266_Rst();
ESP8266_Net_Config(); // 入网 + 透传 + TCP 连接
while (1)
{
if (RC522_Request() == CARD_FOUND) // 寻到卡
{
RC522_Read_UID(card_uid); // 读取卡号(防冲撞+选卡)
if (!Find_Record(card_uid)) // 库中无记录 → 入库
{
In_Time = Get_Current_Time(); // DS1302 记录入库时间
Add_Record(card_uid, In_Time);
Motor_Forward(); // 正转开闸
Park_Count--;
OLED_ShowIn(card_uid, In_Time);
}
else // 库中有记录 → 出库
{
Out_Time = Get_Current_Time();
fee = Calc_Fee(In_Time, Out_Time); // 按时长计费
Del_Record(card_uid);
Motor_Reverse(); // 反转后复位关闸
Park_Count++;
OLED_ShowOut(Out_Time, fee);
}
ESP8266_Sync(card_uid, Park_Count, fee); // 同步 APP
}
delay_ms(100);
}
}
4.2 RC522 刷卡识别流程
RC522 遵循 ISO14443-A 协议,一次完整读卡分六步:① 天线寻卡(Request,获得卡类型);② 防冲撞(Anticollision,多张卡同场时提取唯一序列号);③ 选卡(Select);④ 密钥验证(Authentication,两级密钥加密,防数据被篡改);⑤ 读写扇区数据;⑥ CRC 校验保证传输正确。本系统用防冲撞得到的序列号作为车主唯一标识,配合 EEPROM 中的密钥验证,防止复制卡冒用。
4.3 计时计费流程
DS1302 以三线时序读写 time_buf 数组(年月日时分秒),出入库各取一次时间快照,费用按"分钟差 × 单价"计算,不足一分钟按一分钟计。OLED 出库页面同步显示入库时间、出库时间与应付金额,交易信息一并上传云端留档。
4.4 步进电机闸道控制流程
28BYJ-48 为四相八拍工作方式,正转按 A→AB→B→BC→C→CD→D→DA 的拍序依次给四相通电,反转按逆序执行,停止时四相全部置低:
const u8 Phase[8] = {0x01, 0x03, 0x02, 0x06,
0x04, 0x0C, 0x08, 0x09}; // 八拍拍序
void Motor_Forward(void) // 开闸:正转 512 拍(约一圈)
{
for (u16 i = 0; i < 512; i++)
for (u8 j = 0; j < 8; j++)
{
GPIO_Write_Phase(Phase[j]);
delay_ms(2); // 拍间延时决定转速
}
Motor_Stop();
}
void Motor_Reverse(void) // 关闸:反序执行
{
for (u16 i = 0; i < 512; i++)
for (u8 j = 0; j < 8; j++)
{
GPIO_Write_Phase(Phase[7 - j]);
delay_ms(2);
}
Motor_Stop();
}
拍间延时约 2ms,闸杆起落平缓无冲击。
4.5 ESP8266 数据同步流程
模块按标准 AT 序列配置:复位 500ms → AT+CWMODE=1 → AT+CWJAP 入网 → AT+CIPMUX=0 → AT+CIPMODE=1 透传 → AT+CIPSEND 建立数据通道。出入库事件触发时,系统把卡号、剩余车位、出入库时间与费用打包上传;APP 端也可下发校时指令,用网络时间校准 DS1302,保证计费基准精准。
五、系统实现与测试
系统硬件联调后,围绕自动控制与无线通信两大功能展开测试。
5.1 自动控制功能测试
| 测试项 | 操作 | 系统动作 | 结果 |
|---|---|---|---|
| 刷卡识别 | 入口处刷 IC 卡 | OLED 显示卡号,识别 <1s | 通过 |
| 闸道开闭 | 刷卡入库/出库 | 电机正转开闸、放行后关闭 | 通过 |
| 计时计费 | 停放 35 分钟后刷卡出库 | OLED 显示时长与费用,数值准确 | 通过 |
| 车位统计 | 连续多车出入库 | 剩余车位数随动增减无误 | 通过 |
5.2 无线通信功能测试
APP 端可实时查看剩余车位数与最新出入库记录;下发校时指令后,OLED 时间在下一刷新周期内与网络时间对齐。多次连续刷卡压力测试中,数据上传无丢包、无串扰,通信链路稳定。
六、总结
本文实现了一套完整的物联网智能停车系统:以 STM32F103C8T6 为核心,RC522 完成秒级刷卡识别,DS1302 支撑精准计时计费,ULN2003 驱动步进电机完成闸道起落,ESP8266 将车位与交易数据实时同步云端。测试表明系统刷卡识别、自动计费、闸道控制与无线通信各环节运行稳定,具备实际部署的雏形。后续可扩展 LED 车位引导屏、车牌识别摄像头或微信小程序支付,把"一张卡管到底"升级为"无感通行",项目延展空间充足,非常适合作为物联网方向的综合实践课题。
七、资料内容完整工程资料(原理图、PCB、代码、元件清单)
八、资料获取方式
更多推荐

所有评论(0)