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. 拓展思考
-
可在出口增加第二组光敏传感器,检测出车库的车辆,实现进出方向判断;
-
注意:为何选择地下车库?因为地库光线比较稳定,如果在露天停车场光线白天和夜晚差别很大,就不适用。