您现在的位置是:首页 >技术教程 >单片机设计系列4——低成本物联网硬件ESP8266 D1mini的应用(自助停车场项目实践部分)网站首页技术教程

单片机设计系列4——低成本物联网硬件ESP8266 D1mini的应用(自助停车场项目实践部分)

南檐巷上学 2025-04-16 00:01:03
简介单片机设计系列4——低成本物联网硬件ESP8266 D1mini的应用(自助停车场项目实践部分)

简介说明

承接上文单片机设计3(视觉部分),本文接着来写自助停车场项目的主控部分。主控采用的是低成本物联网开发硬件——ESP8266单片机。在设计3中完成对车牌的视觉识别之后,接下来将得到的数据串口传输给主控,来完成这个项目的剩余部分功能。

单片机设计系列3——视觉模块MaixCAM项目之车牌识别-CSDN博客https://blog.csdn.net/2301_81315771/article/details/145464249?spm=1001.2014.3001.5501


芯片介绍


ESP8266 D1mini是一款基于ESP8266芯片的开源硬件开发板,上图是引脚分配以及尺寸标准。

基本特性

  • 芯片与架构:采用乐鑫科技的ESP8266芯片,这是一款超低功耗的UART-WiFi透传模块,内置Tensilica L106超低功耗32位微型MCU,主频支持80MHz和160MHz。

  • 存储与内存:通常配备4M字节的闪存,部分版本如D1 Mini V3则配备了16M字节的闪存,具备较大的存储空间用于程序和数据的存储。

  • 工作电压:工作电压为3.3V,使用Micro-B type USB线进行连接。

功能特点

  • 通信能力:支持802.11 b/g/n协议,WiFi @ 2.4 GHz,支持WPA/WPA2安全模式,内置TCP/IP协议栈,可轻松实现设备的无线网络连接。

  • 多种工作模式:支持STA/AP/STA+AP工作模式,还支持Smart Config功能(包括Android和iOS设备),方便设备的无线配置。

  • 丰富接口:包含11个数字IO引脚以及1个模拟输入引脚,除了D0口其他口都支持interrupt/PWM/I2C/one-wire等功能。

  • 低功耗设计:深度睡眠保持电流为10uA,关断电流小于5uA,2ms之内唤醒、连接并传递数据包,待机状态消耗功率小于1.0mW。

开发环境与编程支持

  • 兼容Arduino IDE:可以使用Arduino IDE对其进行开发,开发者可以通过简单的配置在Arduino IDE中选择相应的开发板进行编程。

  • 支持MicroPython:除了Arduino IDE,D1mini还支持MicroPython编程语言,为开发者提供了更多的选择。

应用场景

  • 物联网项目:由于其具备WiFi功能和易于开发的特点,广泛应用于各种物联网项目中,如智能家居设备、可穿戴设备、传感器网络等。

  • 教育与学习:作为一款低成本且功能丰富的开发板,非常适合电子爱好者和学生进行学习和实验,帮助他们快速上手物联网开发。


功能实现 

项目介绍

        本设计采用ESP8266 D1mini开发板作为核心主控,以LicheeRV Nano(见上一篇博客)开发板作为视觉方案,构造了一个成本极低、识别准确、功能强大的电子停车场自助管理系统。本设计采用合理的PCB板设计,实现以下功能:

  1. 当车牌号出现在摄像头前时,系统自动识别车牌号,并发送给主控芯片,主控芯片控制LED灯亮起、起落杆打开、蜂鸣器发声、OLED屏幕显示来车信息,并显示“欢迎到来”。
  2. 即刻将车牌信息上传到网页,记录“存在”状态并开始实时计时(计费),当车辆进入停车场车位(PCB板指定位置)后,触发红外感应装置,对应车位的指示灯亮起,表示此处已有车辆。
  3. 当同样的车牌再次出现在摄像头时,OLED显示对应车牌号以及“下次再见”,起落杆抬起,网页上更新车辆状态为“离开”。

本设计了实现一个低成本的停车场自助管理系统,功能丰富稳定可靠。


代码设计 

对ESP8266 D1mini的程序要求如下:

  1. 通过串口接收车牌号信息。

  2. 记录车牌的进入和离开时间。

  3. 显示停车时长和状态。

  4. 通过Web服务器提供实时数据和HTML界面展示。


代码构建

第一步,连接WIFI:

#include <ESP8266WiFi.h>

const char* ssid = "WIFI_SSID";
const char* password = "PASSWORD";

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
Serial.println("IP address: " + WiFi.localIP().toString());
  1. 使用ESP8266WiFi库连接WiFi。

  2. 连接到指定的WiFi网络(SSID和密码)。

  3. 如果连接失败,程序会在控制台输出连接提示。

  4. 连接成功后,打印本地IP地址。

第二步,创建Web服务器:

#include <ESP8266WebServer.h>
ESP8266WebServer server(80);

server.on("/", handleRoot);
server.on("/data", handleData);
server.begin();
  1. 使用ESP8266WebServer库创建一个Web服务器,监听端口80。

  2. 定义两个路由:

    1. /:返回一个包含车牌记录的HTML页面。

    2. /data:返回一个JSON格式的实时数据接口。

  3. 启动Web服务器。

第三步,OLED显示:

#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
  1. 使用U8g2lib库控制一个I2C接口的OLED屏幕(SSD1306型号)。

  2. 初始化OLED屏幕,设置分辨率为128x64。

  3. 显示以下内容:

    1. 欢迎信息(10秒后切换为停车数)。

    2. 车牌号(当有车牌进入或离开时)。

第四步,车牌记录管理:

struct PlateRecord {
  String plateNumber;
  unsigned long startTime;
  unsigned long duration;
  bool isActive;
};
PlateRecord records[MAX_RECORDS];
int recordCount = 0;
  1. 使用一个结构体PlateRecord存储车牌信息,包括:

    1. 车牌号(plateNumber)。

    2. 开始时间(startTime)。

    3. 持续时间(duration)。

    4. 是否处于活动状态(isActive)。

  2. 最大记录数为10(MAX_RECORDS)。

  3. 使用一个数组records存储所有车牌记录,recordCount记录当前已存储的记录数。

第五步,LED灯控制:

const int ledPin = 2;
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
  1. 使用GPIO2(D4)控制LED灯。

  2. 当有车牌记录添加或更新时,LED灯会亮起1秒。

第六步, 数据处理:

void handlePlate(String plateNumber) {
  int index = findPlateIndex(plateNumber);
  
  if (index == -1) {
    // 添加新记录
    records[recordCount].plateNumber = plateNumber;
    records[recordCount].startTime = millis();
    records[recordCount].duration = 0;
    records[recordCount].isActive = true;
    recordCount++;
    
    showWelcomeMessage(plateNumber);
  } else {
    // 更新现有记录
    if (records[index].isActive) {
      // 车牌离开
      records[index].duration = millis() - records[index].startTime;
      records[index].isActive = false;
      
      showGoodbyeMessage(plateNumber);
    } else {
      // 车牌重新进入
      records[index].startTime = millis();
      records[index].isActive = true;
      
      showWelcomeMessage(plateNumber);
    }
  }
}
  1. 当通过串口接收到车牌号时,调用handlePlate()函数。

  2. 检查车牌是否已存在:

    1. 如果不存在,添加新记录。

    2. 如果存在,根据当前状态(isActive)更新记录:

      1. 如果是活动状态,标记为离开并记录时长。

      2. 如果是非活动状态,重新启动计时。

第七步,OLED显示更新:

void showWelcomeMessage(String plateNumber) {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  u8g2.drawUTF8(0, 16, "欢迎到来!");
  u8g2.drawUTF8(0, 32, plateNumber.c_str());
  u8g2.sendBuffer();
}

void showGoodbyeMessage(String plateNumber) {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  u8g2.drawUTF8(0, 16, "下次再见!");
  u8g2.drawUTF8(0, 32, plateNumber.c_str());
  u8g2.sendBuffer();
}
  1. 显示欢迎信息或再见信息,包含车牌号。

  2. 使用中文字体(u8g2_font_wqy16_t_gb2312)在OLED屏幕上显示文本。

第八步,计时更新:

void updateTimers() {
  for (int i = 0; i < recordCount; i++) {
    if (records[i].isActive) {
      records[i].duration = millis() - records[i].startTime;
    }
  }
}

每次循环时,更新所有活动记录的持续时间(保证网页的计时时长实时更新)。

第九步,Web界面生成:

void handleRoot() {
  // 生成HTML页面
  server.send(200, "text/html; charset=UTF-8", html);
}
  1. 当访问路径/data时,返回一个JSON格式的实时数据。

  2. JSON数据包含所有车牌记录的车牌号、时长和状态。

第十步,数据接口:

void handleData() {
  // 创建JSON数据
  server.send(200, "application/json", jsonResponse);
}
  1. 当访问路径/data时,返回一个JSON格式的实时数据。

  2. JSON数据包含所有车牌记录的车牌号、时长和状态。


依赖库

  1. ESP8266WiFi:用于WiFi连接。
  2. ESP8266WebServer:用于Web服务器。
  3. ArduinoJson:用于处理JSON数据。
  4. U8g2lib:用于控制OLED屏幕。

TIPS

ESP8266/ESP32设备均只支持2.4GHz频段的WIFI连接,如果手机使用热点连接,会优先使用5Ghz频段的WIFI,如果出现ESP设备WIFI连接超时或者连接失败的情况,请尝试更换频段或者更换热点设备。


项目创新点/关键技术指标 

1.车牌识别数据准确快速,识别置信度高。本设计在低成本单片机LicheeRV Nano上部署了AI视觉模型,实现高帧率稳定OCR文字识别,并以正则化表达式筛选正确的车牌格式传输到主控。

2.网页信息可视化服务。本系统可以实时展示停车场数据并在网页显示,包括停车数量、车牌号,以及实时停车时间计时,简单高效。

3.极低成本以及高片上资源利用率。主控采用成本不到10元的D1 mini芯片,既能驱动GPIO,也能实现串口通信,还能实现网页服务器建设,整块主控的内存利用率和引脚利用几乎极致。同时,视觉模块LicheeRV Nano单片机的成本也仅有59元,便能高效稳定地运行车牌视觉识别模型。


相关实物产品展示:


其他

本项目目前还在半成品阶段,还差最后的装配和应用环节,预计将在25.3前完成,届时整个项目的成果我会发在CSDN上,具体的EDA文件(PCB)、ESP8266代码、MaixCAM代码,整个项目的文件材料我也会分享,有需要可以联系作者邮箱lingui_fzu@qq.com。

本设计非常适合新手接触完整的项目,整体结构简单,适合零基础或有初步认识的同学学习制作。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。