随着城市车辆数量激增,停车管理成为一项挑战。本文将介绍一套基于ESP32-CAM开发板的低成本AI智能停车系统原型,它集成了自动车牌识别(ANPR)和道闸控制功能。
该系统利用板载摄像头采集图像,通过云端车牌识别API完成识别,并结合红外传感器检测车辆进出,最终控制伺服电机驱动道闸,实现车辆的自动放行与数据记录。
项目整体思路
整个系统的核心工作流程如下:
- 入口检测:入口红外传感器检测到车辆靠近,ESP32-CAM触发拍照。
- 云端识别:拍摄的图片通过HTTPS上传至特定的车牌识别API服务器。
- 数据处理:服务器返回JSON格式的识别结果(含车牌号等),ESP32-CAM解析并记录到内存中的“停车数据库”。
- 道闸控制:识别通过且车位未满时,控制舵机抬杆放行,车辆计数加1。
- 出口检测:出口传感器检测到车辆离开,直接开闸放行,车辆计数减1,并记录一条出场历史。
- 网页监控:通过ESP32-CAM内置的WebServer可在浏览器查看实时状态、识别结果及停车历史。
该系统本质上构建了一个边缘设备:负责前端数据采集与物理控制,将复杂的AI识别任务交由云端处理,再将结果反馈回本地执行。

硬件清单
- ESP32-CAM × 1 (核心控制与摄像模块)
- 舵机 × 1 (驱动道闸)
- 红外传感器模块 × 2 (入口、出口各一)
- USB转UART模块 × 1 (用于烧录程序)
- 面包板、杜邦线若干
注:3D打印的支架与场景板仅为美化演示,非必需。
电路设计
连接简单明了:
- 舵机信号线连接至 GPIO 14 (配置为PWM输出)。
- 入口红外传感器连接 GPIO 13。
- 出口红外传感器连接 GPIO 15 (二者均配置为数字输入)。
供电注意:
- 整个系统采用5V供电(如旧USB线)。
- 舵机直接使用5V。
- 两个红外传感器由ESP32-CAM板载的3.3V引脚供电,确保信号电平安全。

搭建与调焦
本项目使用微缩模型演示。需注意ESP32-CAM出厂镜头焦距可能不适用于近距离拍摄玩具车牌,需要手动旋转镜头调焦,或使用叠加镜片来获得清晰图像。

软件准备
- 获取API Key:在相关服务平台注册并生成用于车牌识别的API Key。
- 安装Arduino库:
ESP32Servo (用于舵机控制)
NTPClient (用于网络时间同步)
代码结构总览
1. 头文件与全局配置
开头引入必要的库,并定义网络参数、API信息及引脚映射。
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <WebServer.h>
#include "esp_camera.h"
#include <NTPClient.h>
#include <ESP32Servo.h>
// 替换为你的实际信息
const char* ssid = "xxx";
const char* password = "xxx";
String serverName = "www.circuitdigest.cloud";
String serverPath = "/readnumberplate";
const int serverPort = 443;
String apiKey = "xxx";
// GPIO定义
#define servoPin 14
#define inSensor 13
#define outSensor 15
2. 关键函数说明
extractJsonStringValue(): 从服务器返回的JSON中解析所需字段。
handleRoot(): 生成并返回实时监控网页的HTML内容。
handleTrigger(): 处理拍照触发事件。
openBarrier() / closeBarrier(): 控制道闸开合。
sendPhoto(): 核心函数,负责拍照并将图片上传至服务器进行识别。
3. setup() 函数:初始化
setup()函数负责一次性初始化工作:
- 禁用棕出检测以提高稳定性。
- 初始化串口、配置传感器和舵机引脚模式。
- 连接Wi-Fi网络。
- 初始化NTP客户端以获取准确时间。
- 启动Web服务器并绑定请求处理函数。
- 配置摄像头参数与引脚。
- 初始化舵机至初始位置。
4. loop() 函数:主循环
loop()函数持续运行,构成系统主状态机:
- 更新时间:周期性从NTP服务器获取当前时间。
- 处理Web请求:轮询处理来自浏览器的访问。
- 处理车辆进入:
- 当入口传感器触发且有空车位时,延时确保车辆就位。
- 调用
handleTrigger()拍照并上传识别。
- 识别成功则记录车牌信息,控制道闸放行。
- 处理车辆离开:
- 当出口传感器触发且有车辆在场时,直接开闸。
- 记录一条“NULL-Exit”出场记录,车辆计数减1,随后关闸。
- 更新网页状态。
实测效果与优化方向
实测流程:
小车驶入入口 → 传感器触发 → 拍照上传 → 云端识别 → 网页显示结果 → 道闸抬杆。
小车驶出出口 → 传感器触发 → 道闸抬杆 → 记录出场信息 → 道闸关闭。
可优化点:
- 识别延迟:上传图片至云端识别存在网络延迟,是当前方案的主要瓶颈。
- 单点识别:目前仅在入口进行车牌识别。为实现精确的进出匹配,可在出口也增加识别功能。
- 数据易失性:停车记录仅存于RAM,断电即丢失。可考虑利用板载TF卡槽本地存储,或接入物联网平台进行云端持久化。
- 代码健壮性:原型代码在错误处理、网络重连等方面仍有提升空间,适合作为进一步开发的基础。
小结
本项目完整演示了如何利用ESP32-CAM构建一个微缩智能停车系统,串联了图像采集、云端AI识别、本地Web服务、传感器与执行器控制等多项技术。硬件成本低、代码开源,是学习边缘计算与物理世界交互的绝佳实践案例。
项目源码:https://github.com/Circuit-Digest/Smart-Parking-System-with-Number-Plate-Recognition-using-ESP32-CAM/tree/main
|