
项目编号X504201| 主控 STM32F103C8T6 核心板 | 视觉采集 ESP32-CAM OV2640 | 到位检测 四路红外感应模块 | 闸机执行 SG90 舵机 | 本地显示 OLED12864I2C | 通信 HTTP POST TCP Socket | 车牌识别 服务端调用百度在线车牌识别接口 | 服务端 jeesite SpringBoot MySQL摘要本文介绍一套以服务端车牌识别做决策的车位引导系统。硬件侧以 STM32F103C8T6 为核心板三路红外感应模块分别盯着车位 1 / 2 / 3另有一路负责出入感应车辆到达时 ESP32-CAM 抓拍号牌JPEG 由模组自己以 HTTP POST 直接上传服务端图像不经过主控服务端调用百度在线车牌识别接口返回号牌字符串主控把识别结论与车位占用状态合并驱动 SG90 舵机控制闸机放行OLED12864 就地显示车位总数、剩余车位与收费单价。服务端基于 jeesite 平台与 SpringBoot 框架构建以 MySQL 完成数据持久化网页端提供用户管理、车场闸机管理、系统配置、实时数据展示与进出记录查询。一、项目概述车位引导的难点不在「数出还剩几个位」而在「把车、车位与计费对上」。人工发卡只记入口一笔场内哪些位空着、放行谁说了算、停车费怎么算往往各管一段。本项目把三件事分到三个位置红外感应负责「车什么时候到、停在哪个位」服务端的车牌识别负责「认出这是哪辆车」主控只负责「汇总状态、驱动闸机与就地显示」。本文所述系统以 STM32F103C8T6 为主控四路红外感应模块分别检测三个车位与车辆出入场红绿 LED 指示车位占用、SG90 舵机做入场方向引导、OLED12864 显示车位概况、蜂鸣器在车位已满时提示ESP32-CAM 采集现场图像车牌识别由服务端调用百度在线车牌识别接口完成服务端基于 jeesite 平台与 SpringBoot 框架构建并以 MySQL 持久化网页端负责闸机与用户管理、收费标准配置、实时车位数据展示与停车记录查询把车位检测、图像采集、号牌识别与收费记录整合进同一套可远程查看的闭环。系统在 2025 年 4 月 完成整机联调进出记录页存下的 13 条实测记录与五张车牌抓拍样本就是这条链路真实跑过的痕迹。1.1 系统技术架构系统自上而下划分成应用层、服务层、网络层、控制层与感知执行层五个层次。图 1 系统总体架构图五层的关键分工是相机只负责按快门与上传主控只负责汇总车位状态与驱动舵机车牌识别始终在服务端完成。这也意味着换一家识别服务、改一条计费规则硬件侧一行代码都不用动。1.2 系统功能结构按部署位置划分为硬件系统、软件系统与交付服务三列。图 2 系统功能结构图三列之间只有一条边界设备侧只做「检测 采集 执行」号牌识别、计费规则与记录留存全部放在服务端。二、硬件系统设计2.1 硬件系统原理框图整块板子的中心是 STM32F103C8T6 核心板模块一侧是输入与采集四路红外感应模块与 ESP32-CAM 摄像头模组另一侧是输出与执行SG90 舵机、OLED12864、蜂鸣器与三组车位指示灯整机由 TYPE-C 取电口单口供电。图 3 硬件系统原理框图从框图可以看出本项目在硬件上的一个关键取舍图像数据完全不经过主控。红外感应的DO只给主控一个边沿事件真正触发拍照与上传的是模组自己 —— 收到指令后取景把 JPEG 经 Wi-Fi 以 HTTP POST 直达服务端。主控既不是数据通道也不需要在固件里解析图像。2.2 硬件原理图原理图用嘉立创 EDA 绘制同时提供 pdf、png、json 与 schdoc 四种格式。本文的接线描述以json源文件中的网络标号为准。图 4 硬件原理图提示解析原理图时建议直接读嘉立创 EDA 的json源文件。导出的 PDF 文字层只会包含已经连线的部分而源文件里能取出「引出但未连接」的悬空网络标号。提取方式是从schematics[0].dataStr.shape这组字符串里用\^\^([\d.\-])~([\d.\-])\^\^(\S?)~取网络标号坐标用spiceSymbolName\([^\]*)\ 取元件型号。2.3 硬件实物实物装配以洞洞板万用板作底板、杜邦线互连核心板压在板面中部四路红外感应模块经排针引出OLED12864 挂在板面一侧摄像头模组立在板上整机由一根 USB 线供电与下载。图 5 硬件实物总览OLED 上实测显示四行车位引导系统、车位总数35个、剩余车位33个、收费单价4元。车位统计与费率是就地可见的不需要打开网页也能看出车场当前的状态。图 6 板载器件与 OLED 读数特写车牌识别的输入是五张车头实拍样本浙A·X7U36、闽F·UE988、川A·Y17J5、皖F·66666 与 京A·00000全部为蓝底白字燃油车号牌与网页端用户管理和进出记录里的牌照数据一一对应 —— 实时图像区里那些识别结果就是从这类照片里认出来的。2.4 引脚分配连接对象信号引脚说明红外感应·车位 1U5DOPA1恰好是 EXTI 第 1 号外部中断线红外感应·车位 2U6DOPA2恰好是 EXTI 第 2 号外部中断线红外感应·车位 3U7DOPA3恰好是 EXTI 第 3 号外部中断线红外感应·出入场U8DOPA4恰好是 EXTI 第 4 号外部中断线SG90 舵机U4SIGNALPA8即 TIM1_CH1高级定时器通道OLED12864U3SCL / SDAPB6 / PB7与硬件 I2C1 的默认分配完全一致OLED12864U3VCC / GND5V / GND模块由 5 V 供电ESP32-CAMU2IO1(TX) / IO3(RX)PA10 / PA9对应 USART1模组 5V、GND 另行供电有源蜂鸣器BUZZER1信号端PB15另一端接地PB15 是 SPI2_MOSI本设计按普通 GPIO 驱动车位 1 指示灯红 / 绿PC14 / PC15这两脚同时是外部 32.768 kHz 低速晶振的 OSC32_IN / OSC32_OUT车位 2 指示灯红 / 黄PB0 / PB1图纸 COLOR 标为 R / Y实物为红绿双色见缺口说明车位 3 指示灯红 / 黄PB10 / PB11图纸 COLOR 标为 R / Y这两脚同时是 USART3 的默认 TX / RX把这几根线排开来看落点并不随意· 四路红外分别落在PA1/PA2/PA3/PA4恰好是EXTI 的 1~4 号中断线四路互不冲突· 显示屏SCL/SDA落在PB6/PB7正是硬件 I2C1 的默认分配· 舵机信号PA8恰好是TIM1_CH150 Hz、脉宽 0.5~2.5 ms 的周期信号可用硬件 PWM 直接产生· 摄像头两线落在PA9/PA10正是USART1 的收发脚· 六只指示灯分三组车位1 用PC14/PC15兼作 32.768 kHz 晶振脚、车位2 用PB0/PB1、车位3 用PB10/PB11兼作 USART3 默认收发各路外设各归其位主控这一侧的负担非常轻。三、逐线核对原理图得到的四处判断把嘉立创 EDA 源文件里的网络标号提取出来、与 PDF 文字层逐条对照后有四处值得单独说明。3.1 四路红外各自占一条外部中断线互不冲突四个红外感应模块的 DO 分别落在 PA1、PA2、PA3 与 PA4而这四个脚恰好是 STM32F103 的 EXTI 第 1、2、3、4 号外部中断线 —— 四路各占一条既不需要像引脚号撞车的方案那样牺牲其中一路改走轮询也不会有两路共用一个中断入口时「一次触发分不清是谁」的问题。车位占用与车辆出入场都是「来了就要立刻记账」的事件四路各自独占一条中断线意味着任何一路的状态变化都不会被漏采。3.2 显示屏的接线与硬件 I2C1 的默认分配完全吻合OLED12864 的 SCL 接 PB6、SDA 接 PB7而 STM32F103 的硬件 I2C1 默认功能分配正是 SCL PB6、SDA PB7两者完全一致。这块屏因此具备直接调用片上 I2C1 外设的条件不必再用通用 IO 去模拟时序 —— 对一块需要持续刷新车位数的屏来说硬件外设的稳定性比软件模拟省心得多。3.3 舵机刚好落在高级定时器的通道上SG90 的信号线接在 PA8 上也就是 TIM1_CH1。舵机要求的是 50 Hz、脉宽 0.5 ~ 2.5 ms 的周期信号用一路高级定时器的通道直接产生最直接不必额外占用通用定时器去凑节拍。本设计用舵机做入场方向引导转动角度与车位状态绑定。3.4 六只指示灯分在三组引脚上其中两只兼作晶振脚车位 1 用 PC14 / PC15车位 2 用 PB0 / PB1车位 3 用 PB10 / PB11。值得注意的是PC14 与 PC15 同时是外部 32.768 kHz 低速晶振的 OSC32_IN / OSC32_OUTPB10 与 PB11 同时是 USART3 的默认 TX / RX。本设计把这三组都当普通 GPIO 用因此若将来要启用外部低速晶振或 USART3需要重新分配这三组灯脚。蜂鸣器所在的 PB15 是 SPI2_MOSI同样按普通 GPIO 驱动 —— 有源蜂鸣器只需高低电平本来也不需要用 PWM。以上四条并非对设计的质疑而是对既有连线的如实描述 —— 本文只记录原理图上真实存在的连接不对作者的意图作推测。四、通信链路与数据交互4.1 通信参数链路协议 / 方式说明无线承载Wi-Fi 2.4 GHzSTA 模式默认热点名 8266wifi、密码 123456789说明文件里特别注明需使用电脑开热点图像上传HTTP POSTREST 方式相机端把拍到的 JPEG 直接 POST 到服务端的上传接口不经过主控转发指令通道TCP Socket服务端实现 tcpsocket 服务端与硬件周期性同步数据、下发指令车牌识别服务端调用百度在线车牌识别接口号牌识别在服务端完成识别结果回写停车记录硬件侧不做识别服务端技术栈jeesite 平台 Java / SpringBoot / MySQL / Bootstrap网页端与管理接口都构建在这一套框架上数据以 MySQL 持久化固件开发Keil 5STM32F103C8T6 固件工程在 Keil 5 下编译并烧录缴费入口网页端弹出的缴费图形码说明文件写明缴费时手机需连上同一个 8266wifi 热点因此该入口只在同一局域网内可用相机端保存的配置原文如下局域网地址仅供同网段调试参考ssid:8266wifi pass:123456789 server IP:192.168.137.250 server port:19214 rest url:http://192.168.137.250:8889/f/esp32/upload debug mode:false word mode: Periodic photo taking抓拍模式默认为周期拍照Periodic photo taking也可由红外感应触发单次抓拍。4.2 数据交互时序以「一辆车驶向出入口」为例整个过程分成十二步出入感应检测到车辆、边沿事件进主控、发出拍照指令、图像以 HTTP POST 直传服务端、服务端建立进出记录、调用百度在线车牌识别接口、号牌结论写入记录、结论经 TCP Socket 回传、主控合并车位占用状态判定、驱动舵机控制闸机、OLED 与指示灯刷新、记录落库。图 7 系统数据交互时序图这张图里有两处值得展开。第一处是「主控全程不搬运图像数据」JPEG 从模组直接进网络主控只是事件的触发者采集链路在主控这一侧非常轻。第二处是「认车结论不依赖硬件」识别接口的调用发生在服务端硬件侧既没有模型也没有号牌库。五、软件系统与界面功能5.1 界面字段界面分组字段与说明用户管理姓名 / 电话 / 车辆牌照 / 更新时间 / 操作 — 按姓名与电话检索右上角另有「新增」「车辆牌照」一栏把车主与车牌绑定起来编辑用户姓名 / 电话 / 车辆牌照 — 弹层页头写着「基本信息【手机号码将作为登录的账户信息】」提交前为「保存」「关闭」两个按钮车场闸机管理终端编号 / 终端名称 / 安装地址 / 车位 1 / 车位 2 / 车位 3 / online / 更新时间 / 操作 — 登记每一台闸机终端的编号、名称、安装地址与三个车位的实时占用情况系统配置参数名称 / 类型 / 参数项 / 参数值 / 备注 / 更新时间 / 操作 — 以「参数名称 / 类型 / 参数项 / 参数值」四列维护收费单价与各停车场编号实时数据展示车位总数 / 空闲车位 / 闸机状态 / 收费价格 三个车位卡 车场参数设定 实时图像 — 顶端给出更新时间与车场编号下拉其后是四张统计卡、三张车位卡与车场参数设定区进出记录查询车牌 / 类型 / 用户 / 电话 / 入库照片 / 入库时间 / 出库照片 / 出库时间 / 停车时长(分钟) / 单价(元/小时) / 收费金额(元) / 闸机编号 / 备注 / 操作 — 一次进出留一条记录同时带出车辆信息与收费信息查询条件为车牌号码侧边菜单共五项用户管理 / 车场闸机管理 / 系统配置 / 实时数据展示 / 进出记录查询。其中「系统配置」只有 4 条记录却决定了费率与车场规模。5.2 登录页与实时数据展示登录页标题「车位引导系统」字段只有「登录账号」「登录密码」两项。图 8 登录页与实时数据展示页实时数据展示页顶端给出更新时间与车场编号中部是四张状态卡与三个车位卡下面依次是车场参数设定区与实时图像区。实测这一帧为更新时间2025-04-22 20:22:48、车场编号停车场出入闸A、车位总数3、空闲车位0、闸机状态关闭、收费价格3元/小时三个车位卡均为空闲。必须说明网页端「车位总数 3」是演示环境按三个模拟车位登记的口径而终端 OLED 实拍的「车位总数 35个 / 剩余车位 33个」是屏幕固化的演示画面两处口径不一致本文如实并列、不作统一。车场参数设定区共三组收费价格填入数值后点确定即生效远程开闸提供「每次开闸 / 常开 / 关闭」三档缴费入口一栏提供「显示缴费码」按钮。实时图像区按时间横向排出最近五张车牌抓拍皖F·66666、京A·00000、苏A·X7U34、闽F·UE988与一张空位。5.3 用户管理与车场闸机管理图 9 用户管理页与车场闸机管理页用户管理页实测注册了 5 条记录车辆牌照依次为 陕A00000、川AY17J5、浙AX7U36、浙D88888 与未填写。编辑用户弹层的页头写着基本信息【手机号码将作为登录的账户信息】也就是说手机号同时承担账号与联系方式两个角色「车辆牌照」一栏则把车牌与人绑定供进出记录按「内部 / 访客」归类。车场闸机管理页实测只有 1 台终端编号ZDBH01、终端名称停车场出入闸A、安装地址xxx广场、车位 1 / 2 / 3 均为空闲、online 状态在线、更新时间2025-04-22 20:22:13。表格把三个车位的占用状态直接铺进列里 —— 加装第二台闸机时后台不需要改代码登记一条即可。5.4 系统配置与缴费入口图 10 系统配置页与缴费入口弹层系统配置页共 4 条逐条列出如下单价 tcs1 sfdj 3 - 收费单价 停车场A tcs1 tc1 1 - 车位数配置 停车场B tcs1 tc2 1 停车场C tcs1 tc3 1费率与车场规模都以配置项形式落库 —— 改单价是改一条记录加一个停车场是再加一条。缴费入口弹层的结构是顶部一行红字提示「请先连接电脑热点后再支付」标题「支付停车费」副标题「提前支付出口不排队」图形码下方注明支持的支付渠道支付宝、APP 等。把它与实时数据展示页的「显示缴费码」按钮连起来看缴费这条支路的设计意图就清楚了 —— 局域网环境里车辆端要先连上热点才能访问到支付页。5.5 进出记录查询图 11 进出记录查询页实测该查询共 13 条记录每页显示 20 条。可见样本里既有访客也有内部车辆京A00000 访客 无用户无电话 浙AX7U36 内部 萧萌萌 闽FUE988 访客 川AY17J5 内部 罗建政其中一条出库于 2025-04-22 的记录完整走完了计费停车 1 分钟、单价 4、收费金额 4、闸机编号 ZDBH01、备注「已缴费」其余多数条目停车 0 分钟、单价 4、收费 0。这张表有两处值得留意。一是「类型」一栏把车分成了「内部」与「访客」两类内部车能在用户管理页找到车牌与人的绑定访客车则只有车牌没有用户 —— 计费规则由此分岔。二是「入库照片 / 出库照片」两列都是缩略图说明每一次进出都留了影像。说明本项目界面截图含真实手机号已在交付前统一作不可逆遮蔽马赛克 高斯模糊。遮蔽后经高频细节能量自校验各遮蔽区域降至原值的 0.1% 以下。六、终端屏幕与车牌识别样本硬件实拍里 OLED 读数清晰可辨车牌样本与后台数据一一对应。图 12 终端 OLED 读数与车牌识别样本把这两组证据放在一起看可以说清楚一件事屏幕上的车位统计是主控写上去的实时状态而识别样本里的号牌与进出记录页、用户管理页里的牌照字段完全一致 —— 整条「抓拍—识别—落库」链路的输入与输出都对上了。七、系统视频展示演示视频完整记录了系统从登录、查看车位状态到车辆到达、触发拍照、服务端识别、闸机放行的全过程。图 13 演示视频封面视频里可以重点看三处一是车辆到达检测位到屏幕出现识别结果之间的停顿这段时间正是图像上传与车牌识别在服务端跑二是实时数据展示页状态卡与车位卡的刷新占用与空闲一目了然三是 OLED 上车位总数与剩余车位的变化它与网页端实时数据展示页是同一份状态的两种呈现。八、交付内容交付项形式硬件实物已装配并完成联调的整机洞洞板 杜邦线程序源码STM32F103C8T6 固件工程与 Java 服务端 网页端工程硬件原理图嘉立创 EDA 源文件json / schdoc及导出的图像与文档演示视频系统完整运行的演示录像技术支持远程协助环境搭建、程序调试与小规模修改答疑项目编号 X504201。本文所述系统已完成实测验证相关技术问题可在评论区交流。