当前位置: 首页 > news >正文

ESP32_实验12_基于光敏传感器的停车场车辆计数系统

上篇我们讲到,可以用光敏传感器可以用来统计流水线物品数量。其原理是用光束打在光敏传感器上,没有物品遮挡的时候,光照强度是一定的,输出的电压值也一定。如果有物品遮挡,光线强度会减弱,此时判断有物品,计数加1。物品通过后光照又会变强,通过计算输出电压值的峰谷数量,可以计算物品的数量。

这次我想到,地下停车场的光线比较稳定,是不是也可以通过这个原理计算车辆的数量呢?其原理也类似,说干就干,实践一下。

1. 写在前面

1.1 目的

使用MicroPython编程语言完成基于ESP32单片机的停车场车辆数量统计系统的设计与实现。通过光敏传感器检测车辆遮挡光源的变化,实现对进入停车场车辆数量的自动计数,并通过数码管实时显示。

1.2 实现功能
  • 初始状态下,光敏传感器持续接收光源照射,数码管显示初始计数0。

  • 当车辆进入并遮挡光源时,光线强度降低,系统自动计数一次。

  • 车辆完全通过后,光线恢复,系统等待下一次遮挡事件。

  • 可通过复位按钮将计数器归零。

  • 数码管实时显示当前车辆数量。

1.3 实现方式

1、编程语言:MicroPython,其实就是Python的嵌入式用法,和Python差不多。

2、主控ECU:ESP32。(这里使用普中ESP32开发板)

3、相关传感器:光敏传感器模块。(开发板自带)

4、显示设备:TM1637驱动的4位数码管(开发板自带)

5、输入设备:复位按钮(开发板自带)

1.4 使用软件
  • 编码工具:VS Code / PyCharm

  • 调试工具:Thonny(用于代码上传与实时调试)

2. 硬件及其连接

2.1 硬件选择

1、主控单片机:ESP32。在这里我使用的是开发套件——普中ESP32开发板。当然你也可以选择单独的ESP32芯片,开发板用于学习使用,可以验证软件算法逻辑。用于实际固定成产品当然就不需要那么多集成模块,就要单独选材了。

2、光敏传感器模块:光敏传感器也是单独的模块,中配版本,带有这个模块。随着光照强度的增大,光敏电阻阻值减小。

3、其他:TM1637数码管模块、按钮开关、电筒或其他稳定光源

2.2 基本原理

光敏传感器的电阻值随光照强度变化:光照越强,电阻越小,输出电压越低;光照越弱,电阻越大,输出电压越高。通过检测电压变化判断是否有物体遮挡光源。

可以参考我上篇文章:ESP32_实验11_感知光照强度的声控灯制作(附光敏模块原理)-CSDN博客

2.3 硬件连线

这里就描述一下硬件连接啦。

外围组件

连接的ESP32引脚

光敏传感器 AO

GPIO34

数码管 CLK

GPIO18

数码管 DIO

GPIO19

复位按钮

GPIO4

光敏传感器 VCC

3.3V

光敏传感器 GND

GND

3. 软件代码

3.1 软件设计思路

系统采用状态机模型,分为“高光照”和“低光照”两种状态:

  • 初始状态为“高光照”,等待光线低于低阈值;

  • 当光线低于低阈值时,计数加一,状态转为“低光照”;

  • 在“低光照”状态下,等待光线高于高阈值,恢复“高光照”状态,准备下一次计数;

  • 复位按钮可随时将计数归零。

3.2 完整代码
from machine import Pin, ADC, Timer
import time
import tm1637  # 使用现有的tm1637模块# 硬件引脚配置
LIGHT_SENSOR_PIN = 34  # 光敏传感器连接的引脚
DIGIT_TUBE_CLK = 18    # 数码管CLK引脚
DIGIT_TUBE_DIO = 19    # 数码管DIO引脚
BUTTON_PIN = 4         # 复位按钮引脚
LIGHT_THRESHOLD_LOW = 2500   # 光线低阈值(低于此值表示有车辆遮挡)
LIGHT_THRESHOLD_HIGH = 3200  # 光线高阈值(高于此值表示无车辆遮挡)# 初始化组件
light_sensor = ADC(Pin(LIGHT_SENSOR_PIN))
light_sensor.atten(ADC.ATTN_11DB)  # 设置测量范围0-3.3Vreset_button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)# 初始化数码管(使用现有的tm1637模块)
display = tm1637.TM1637(clk=Pin(DIGIT_TUBE_CLK), dio=Pin(DIGIT_TUBE_DIO))# 全局变量
vehicle_count = 0
light_state = "HIGH"  # 初始状态为高光照# 显示初始值
display.number(vehicle_count)# 主循环
while True:# 读取光线强度light_value = 4095-light_sensor.read()# 检测复位按钮if reset_button.value() == 0:  # 按钮按下vehicle_count = 0display.number(vehicle_count)light_state = "HIGH"time.sleep(0.5)  # 防抖延迟# 状态机逻辑if light_state == "HIGH" and light_value < LIGHT_THRESHOLD_LOW:# 从高光照变为低光照(车辆进入)vehicle_count += 1display.number(vehicle_count)light_state = "LOW"print("车辆进入,计数:", vehicle_count)elif light_state == "LOW" and light_value > LIGHT_THRESHOLD_HIGH:# 从低光照恢复为高光照(车辆完全通过)light_state = "HIGH"print("车辆完全通过")# 短暂延迟,避免过于频繁的检测print("光照亮度:", light_value)time.sleep(0.1)

4. 调试结果

4.1 调试工具

使用Thonny进行代码上传与实时调试,通过Shell界面查看光线数值与计数状态。

4.2 Shell调试界面

在Thonny的Shell界面中可看到如下输出:

4.3 运行图片

4.4 运行视频

ESP32_实验12_基于光敏传感器的停车场车辆计数系统

5. 拓展思考

  • 可在出口增加第二组光敏传感器,检测出车库的车辆,实现进出方向判断;

  • 注意:为何选择地下车库?因为地库光线比较稳定,如果在露天停车场光线白天和夜晚差别很大,就不适用。

http://www.xdnf.cn/news/1410427.html

相关文章:

  • LeetCode 1855.下标对中的最大距离
  • 基于Python的OCR文字识别系统
  • More Effective C++ 条款19:理解临时对象的来源(Understand the Origin of Temporary Objects)
  • 地信/测绘/遥感就业岗位合集
  • Vue2 与 Vue3 路由钩子的区别及用法详解
  • 事件驱动架构新范式:FastEvent 让领域事件开发变得优雅
  • UVM APB 验证 VIP Agent 逻辑架构与数据流图
  • audioLDM模型代码阅读(三)——变分自编码器VAE
  • LeetCode100-160相交链表【链表介绍】
  • 基于AI的大模型在S2B2C商城小程序中的应用与定价策略自我评估
  • USBX移植(X是eXtended的意思)
  • 【python]变量及简单数据类型
  • Spring Data JPA 派生查询方法命名速查表
  • 平滑滤波器(Smooth Filter)的MATLAB与Verilog仿真设计与实现
  • linux内核trace_begin和trace_end使用分析
  • ICode总线原理
  • 【Bluedroid】A2DP Source 音频传输停止流程及资源管理机制(btif_a2dp_source_stop_audio_req)
  • ESP32学习笔记_Peripherals(5)——SPI主机通信
  • 编写一个名为 tfgets 的 fgets 函数版本
  • FPGA入门指南:从零开始的可编程逻辑世界探索
  • deep seek的对话记录如何导出
  • 【大数据技术实战】流式计算 Flink~生产错误实战解析
  • Springcloud-----Nacos
  • 【Spring Cloud微服务】7.拆解分布式事务与CAP理论:从理论到实践,打造数据一致性堡垒
  • Java试题-选择题(25)
  • 【Java进阶】Java与SpringBoot线程池深度优化指南
  • 【计算机组成原理·信息】2数据②
  • SpringAI应用开发面试全流程:核心技术、工程架构与业务场景深度解析
  • 第2.5节:中文大模型(文心一言、通义千问、讯飞星火)
  • 【系统分析师】高分论文:论网络系统的安全设计