基于Linux操作系统的车位管理系统设计_第1页
基于Linux操作系统的车位管理系统设计_第2页
基于Linux操作系统的车位管理系统设计_第3页
基于Linux操作系统的车位管理系统设计_第4页
基于Linux操作系统的车位管理系统设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I第1章绪论研究背景及意义1.1.1背景随着社会的进步,私家车早已屡见不鲜,公安部交管局发布的最新统计数据显示,2024年全国机动车保有量达4.53亿辆,其中汽车3.53亿辆;机动车驾驶人达5.42亿人,其中汽车驾驶人5.06亿人。至2024年底止,新能源汽车的保有规模达3140万辆,这一年新注册登记新能源汽车数量为1125万[1],然而与之相对应的停车位资源日益吃紧,停车难题已然形成为困扰城市居民的一大难题,尤其是在城市中心这片区域,停车位的供需矛盾十分凸显,众多驾驶者只好花费大量时间觅取空闲停车位,这极大地降低了停车效率,还让城市交通拥堵问题愈发严重[2],于城市而言,约30%的交通堵塞是由因车辆寻找停车位期间造成的无效巡游引发,以往停车场的管理方式多依赖人工操作,效能欠佳且易生差错,已无法达成现代城市对高效、智能化停车管理的需求[3]。为化解这一难题,智能车位管理系统应此问题诞生,依靠引入先进的信息技术手段,智能车位管理系统可达成对停车位的实时监管与调控,改进停车资源的分配及利用方式[4],采用车牌识别技术,系统可自行记录车辆的进出资料,减少人工的干预量;采用云端数据同步办法,多个停车场得以达成资源共享和协同管理[5,6]。这些技术的投入应用不仅让停车管理智能化升级,更为城市交通管理奉上了新的解决良策,基于Linux操作系统的车位管理系统成了一大焦点,Linux系统在处理复杂任务、网络通信以及扩展性上具备优势,该系统低成本与高扩展性的特点,赋予了它广泛的应用前景,适合在中小型停车场推广铺开。1.1.2意义社会意义:智能车位管理系统借助Linux平台开展工作,实时探查车位状态、有效分配停车资源,也能借助手机完成预约,极大减少车主寻觅车位的时长,不仅可缓和停车场的拥堵情形,还可削减车辆寻车位过程中造成的尾气排放,对改进城市交通及环境状况起到积极功效,该系统还可与城市智慧交通平台实现对接,为优化整体路网的规划给予数据支撑。技术意义:对比嵌入式实时操作系统(如FreeRTOS)而言,Linux更能胜任复杂任务的处理,譬如同时实现车牌清晰识别、停车数据全面分析、云端数据即时同步等操作,依靠Linux开展开发事宜,可有效促进系统稳定性提升,还能灵活地拓展功能,像未来新增自动驾驶泊车引导、充电桩智能匹配等新特性,让停车管理兼具智能与高效。经济意义:系统直接的好处是节省人力方面开支,譬如减少现场管理工作人员,同时运用高峰时段动态调整价格、长停给予优惠策略增加获利,Linux是采用开源模式的系统,开发成本花费少,尤其适配中小停车场的升级改造,只需少量投入就能达成智能管理。国内外研究进展1.2.1国内进展1.技术路线特点就传感器应用而言,现阶段国内车位检测的核心设备大多采用红外与地磁传感器[7,8],就E18-D80NK红外传感器和HMC5883L地磁传感器举例,其成本较为合理,安装十分简便,采用动态阈值车辆检测算法,可以准确的判断车辆的到来和离开,能把传感器误报率降到5%以下[9]。曾有部分高校团队尝试把超声波传感器集成到系统里,希望借助其非接触检测与高精度的长处,但其单个价格为红外传感器的3至5倍,而且安装时要专业技术人员进行角度校正,造成开发所需成本高、难度大,抑制了其在中小型停车场的推广铺开[10]。在主控平台的选定上,由于拥有丰富的GPIO接口且价格适中(约350元/台),树莓派4B成了主流选择,基于树莓派4B搭建起的停车场管理系统,运用Python语言的多线程相关特性,达成了数据采集跟报警功能的并行开展,该系统可实时对车位状态开展监测,也可在车位状态异常变动或车辆违规停放时迅速发出警报,且该系统的硬件成本被把控在500元以内,为低成本的智能车位管理方案给出了有效范例。2.典型应用案例杭州“城市大脑”停车系统:杭州城市大脑停车系统通过数字化手段,接入了大量停车场(库)和泊位,实现了“先离场后付费”等便民服务[11]。还通过采集停车数据,以热力图等形式量化分析停车难问题,并将停车场泊位忙闲等信息共享给属地政府,实现智能诱导。这些都体现了该系统在整合资源、优化管理、提升效率等方面的作用,与你描述的系统功能和效果相呼应。上海大众立体停车楼:上海大众为解决安亭区员工停车难问题,开建了第一个大型员工停车楼。该停车楼共有7层,约1300多个停车位,占地面积约7000平方米[12]。停车楼有两个机动车出入口,主出入口朝向北侧昌吉路,次出入口设置在于田路。该停车楼引进了立方公司的车牌识别系统、立体车库智能引导及反向查询系统。通过这些系统,为安亭区员工提供了舒适、智能、安心、便捷的停车环境。例如,智能引导系统可以实时监测车位状态,为车主提供精确的停车指引,帮助员工快速找到车位;反向查询系统则方便员工在取车时快速定位自己车辆的位置,节省了找车时间,提升了整体停车效率和体验。3.现存问题国内大多数智能车位管理系统应对高并发场景时存在实时性毛病,鉴于系统依靠单线程开展数据处理,若大量车辆同时进出停车场,或车位状态频繁改变时,系统难以实时响应,造成车位显示与实际状态不相称、车辆进出记录滞后等问题,影响到用户体验以及停车场的正常业务开展。现有的系统硬件接口设计往往比较板滞,这对系统扩展性形成了约束,面对多传感器融合需求以及功能升级情形时,直接接入新传感器设备或添入新功能模块不太容易,若要增添环境监测传感器(像空气质量传感器、温湿度传感器)来提高停车场智能化管理水平时,鉴于硬件接口的局限,或许得对整个系统开展重新设计与布线工作,让成本与实施难度都上升。1.2.2国外进展1.技术路线特点国外团队采用VIDAR技术,融合视觉与惯性测量单元,先检测障碍物区域并利用霍夫变换确定车位;再结合A算法与贝塞尔曲线算法规划路径,实时更新环境信息调整路径。实验证明该方法在复杂环境下检测精准、路径规划高效[13]。2.典型应用案例新加坡智能停车系统:全国部署的35万个地磁传感器与ERP系统联动后,中央商务区高峰时段停车需求匹配效率提升37%。系统采用分层计费策略,使得短时停车(小于1小时)占比从45%增至63%[14]。德国沃夫斯堡大众新车立体停车场:大众德国沃夫斯堡有一个新车停车场,是两栋23层42米高的圆柱形玻璃汽车塔,外形酷似未来时代大厦,内部每层被分隔成一个个停车的小方格,每栋塔楼可存放400辆小汽车。在这个立体停车场里,每辆汽车通过直达电梯方式被送往停车位,整个过程不超过2分钟[15]。3.现存技术瓶颈标准AI摄像头方案(含边缘计算单元)单点部署成本达320-380欧元,是传统方案的4-5倍。这导致中小型停车场投资回收期延长至5-7年。目前国外市场上27种主流传感器采用11种不同通信协议,导致系统集成时需额外开发30-50%的适配代码。在汉堡港智能停车场项目中,协议转换模块开发耗时占总工期的40%。这些都使得开发的成本大、耗时长。研究内容此项研究设计且实现了一种依托嵌入式Linux平台的车位监控系统,系统采用树莓派4B单板计算机作为硬件核心,经定制化移植Linux系统构建起开发环境,先搭建基础环境这一步,将裁剪优化后的RaspberryPiOS系统镜像部署到树莓派4B开发板上,该系统以Debian发行版作为根基,内核采用5.10版本,专门针对ARM架构实施了优化,开发期间采用SSH远程登录和VNC桌面连接相搭配的方式,凭借局域网IP地址达成开发机与目标板实时互联,主要由以下四个部分组成。先从硬件设计角度看,我们采用树莓派作为核心控制器,以GPIO接口为桥梁,连接了3个车位检测传感器、2个功能按键、1个PWM蜂鸣器、1个车位满指示灯和1块OLED显示屏,构造出完整的硬件格局。在软件程序开发阶段,我选用了Python当作主要编程语言,为提升系统响应速率,采用多线程的编程手段,让按键检测、屏幕刷新、主控制程序、传感器数据校验与硬件监控等功能能同步运行,互不干扰。为使系统性能进一步提高,我实施了几项关键优化:(1)借助中断机制快速回应传感器;(2)借助PWM技术让蜂鸣器发出不同频率的报警音;(3)修正了显示逻辑模式,仅在车位状态改变之际刷新OLED屏,降低了系统资源的占用;(4)采用成批记录方法处理系统日志,缩减频繁的IO操作次数。系统运行流程是这样的:开始启动时先把所有硬件设备初始化,而后各功能线程开始运转,若监测到按键操作或者传感器状态起变化时,系统会把此类事件存入队列,主控程序按事件类型协调车位状态管理、蜂鸣器提示与屏幕显示更新,硬件监控线程会周期性核查各设备的工作状态,若发现问题会马上尝试自动修复。

第2章设计方案本次设计的车位管理系统由四个任务组成:GPIO控制模块、传感器驱动模块、显示模块、报警模块。四个任务的设计实现主要由硬件电路的设计和软件程序的设计组成。硬件方面的设计,我选择了树莓派4B作为主控板,通过其自带的GPIO接口来搭建设计所需要的各种硬件电路。本系统采用三个红外传感器实时监测车位占用状态,通过检测传感器信号变化实现车位状态的自动更新。一个OLED显示屏用来显示车位信息,蜂鸣器与LED灯用来做报警模块,最后还有两个按键用来做车辆的进入按键和离开按键。设计的总体表现为当按下进入按键时表示有车辆要进入停车场,这时在5秒内遮挡传感器就可以占用该传感器所对应的车位,若没有在5秒内遮挡传感器则操作超时需要重新操作,按下离开按键也是同理。当3个车位都被占用时,若再次按下进入按键则蜂鸣器报警、显示屏上提示车位已满的提示信息。从软件设计角度,我决定采用RaspberryPiOS作为该项目开发平台,其为基于Linux且专为树莓派定制的操作系统,系统内置有Python环境和大量包管理工具,利于开发者顺利开展代码编写、调试与优化活动,提升开发成效。于开发的进程里,采用多个关键库,RPI.GPIO库可对树莓派的GPIO引脚进行控制,实现对硬件设备的调控;l.d库可实现对OLED显示屏的驱动及显示控制功能;logging库担负起系统运行日志的记录任务;threading库实现对多线程编程的支持,实现各功能模块的并行开展;Queue库可创建事件队列,达成线程间高效的数据通信与共享[16-19],这些库偕同各类成分,为系统实现夯实了坚实基础。本系统借助多线程协同响应模式,保障车位管理功能有序运作,按键探测到按键行为出现后,把事件添加到事件队列,唤醒主控制逻辑线程予以处理[20]。主控制逻辑线程根据事件类型,结合车位状态执行对应操作,期间还会调用其他线程辅助。线程的运行如下图2.1: 图2.1线程流程图本设计的系统流程如下图2.2所示:图2.2系统流程图

第3章系统硬件设计3.1树莓派一系列低成本、高性能的单板计算机——树莓派(RaspberryPi),由英国树莓派基金会开发,为促进计算机科学教育而设计,从2012年第一代产品推出起,树莓派依靠其卓越的性价比与多样的扩展能力,已大量应用于嵌入式开发、物联网、智能控制等范畴。(1)硬件规格:树莓派体积精巧至极,大小跟一张信用卡相仿,别看它“身材娇小”,然“内在充实”,融合了各种各样的功能模块,就常见的型号而言,它搭载了采用ARM架构的处理器,别看它块头不大,运算能力实在不容小觑,能轻松契合多种不同应用场景的要求。它同样具备一定容量的内存,这些内存好似一个临时的数据小货仓,专门开展数据存储及处理工作,保证各类程序得以顺畅运作,树莓派的接口同样十分丰富,其中GPIO接口实用性极高,可轻松连接各类外部设备,诸如传感器跟执行器。恰似在车位管理系统里,恰恰凭借这个接口,才得以顺利对接车位传感器、按键等设备,让整个系统实现运转,它同样配备了USB接口以及HDMI接口,依靠USB接口,便可顺利接入存储设备,利用HDMI接口可轻易连接显示设备,使数据呈现更为直观。(2)软件支持:树莓派软件的兼容能力同样十分强大,支持多种相异的操作系统,而RaspberryPiOS就是很受认可的一个,该操作系统的开发依托于Linux,为开发者铺就了一个稳定可靠的运行环境,而且还呈现了丰富多样的软件资源,开发者凭借包管理工具,恰似在超市里自在购物一样,顺手地挑选与安装自身所需的软件库。在编程语言范畴,树莓派同样给出了多样的选项,能支持Python、C/C++等各类编程语言,尤其当属Python语言,依托自身简单易懂的语法,以及充沛的库资源,在树莓派开发中获广泛应用,从开发者们的视角看,Python好像一把可破千障的钥匙,借助它可迅速达成各类复杂功能,大幅增进开发效率。(3)应用领域:各行各业中,树莓派都有相当多实际应用,在教育这个层面,此款小电脑特别适宜开展教学,老师们可借助它开展编程基础演示,学生借助树莓派去学习编程知识,探究电子电路的奥妙,还可进行多样创意项目的开拓,充分发挥个人的想象及创造潜能。在物联网范畴,树莓派凭借强大的设备连接实力,成为搭建物联网体系的核心支柱,各种设备彼此间可以达成数据的交互与智能操控,让物联网真正呈现“智能”风貌,在诸如智能家居、智能农业等场景里,树莓派也表现出极佳的水准,好比在智能家居系统里面,它可控制各类家电装置,让生活在便捷舒适中升级;处在智能农业范畴中,它可开展环境参数的监测工作,为农作物的生长打造最优的环境[21,22]。树莓派4B的各个模块处理器模块此车位管理系统的核心处理器模块采用了BroadcomBCM2711系统级芯片,此芯片聚合了64位四核ARMCortex-A72处理器,芯片默认主频设为1.5GHz,部分性能超棒的版本甚至能到1.8GHz,仗着多核心架构与高主频,它可轻易应对复杂的运算事务。实际使用的时候,不管同时运行多个程序与否,也或者开展大量数据的处理剖析,都易如反掌,处于车位管理系统里,它能迅速对传感器传来的车位状态、用户按键操作这两类数据进行处理[23],此芯片同样集成了VideoCoreVIGPU,工作频率达到了500MHz,适配OpenGLES3.0规格,且拥有部分OpenGLES3.2的相关特性,可实现4Kp60格式的硬件视频解码,为高清视频播放及图形渲染给予有力支撑。存储模块在存储模块里面,内存采用了LPDDR4SDRAM此项技术,可选择1GB、2GB、4GB、8GB等多种容量规格,LPDDR4SDRAM体现出低功耗和高带宽的明显优势,能在系统运行、程序执行期间提供高效的数据临时存储及快速读写服务,助力系统实现流畅运作,数据的存储主要借助microSD卡,最大支持512GB这般的存储容量,在车位管理的系统里面,microSD卡的主要用途是安装操作系统、存储程序代码,并记录系统运行时产生的日志文件等关键数据。通信模块在网络通信范畴,该系统装配了多样的通信接口,起始便是千兆以太网接口,依靠RJ45网线连接上网络,从理论上来说传输速度可达1000Mbps,实现了高速稳定的有线网络连接状态,系统也支持2.4GHz和5.0GHz双频的IEEE802.11ac无线通信模式,同时支持蓝牙5.0及低功耗蓝牙(BLE)技术,依靠这些无线通信功能,系统可方便地和各类设备进行无线连接,不管是搭建局域网还是接入互联网,皆可达成设备间交互及快速、稳定的数据传送。接口模块该系统的接口模块具备强劲的外部设备拓展实力,从数据输送的角度说,配置4个USB接口,其中2个USB3.0接口可实现5Gbps超高速的数据传送,其余2个USB2.0接口可稳定对接键鼠、U盘等常见外设,就显示功能层面,2个micro-HDMI接口实现4K60Hz双屏同步输出,能适配显示器、电视等各类显示终端设备,经3.5mmAV插孔,多媒体实现音视频同步输出,适配多样化应用情形。为特定功能拓展考量,系统设置了专门接口:利用CSI接口可直连树莓派摄像头,DSI接口跟官方触摸屏适配,完备图像采集与显示路径,40针GPIO连接器为各类传感器及执行器接入提供支持,为硬件开发赋予灵活扩展特性,采用4针PoE接口与PoEHAT插件协作,可以实现以太网电力输送,大幅简化系统线路铺设流程,增进安装部署成效。GPIO口树莓派4B的GPIO(通用输入输出)口是极其重要的功能接口,共有40个引脚,可通过软件灵活配置为输入或输出模式,实现与外部设备的通信和控制。我们可以在终端输入命令gpioreadall来查看GPIO的引脚状态和编号信息,下图3.1是我的树莓派的GPIO引脚状态。图3.1GPIO引脚状态和编号信息图中的各列的含义如下:BCM:BroadcomSOC引脚编号,是基于博通芯片定义的引脚编号方式,编程中经常使用,同时也是本设计中所使用的编号方式[24]。wPi:wiringPi库使用的引脚编号,wiringPi是树莓派上曾经常用的GPIO控制库,但该库目前已不在维护更新[24]。Name:引脚功能名称,普通GPIO引脚如GPIO.0、GPIO.2等,电源引脚如5V、3.3V、0V,特殊通信引脚如I2C的SDA、SCL等。Mode:引脚当前模式,IN表示输入模式(红外传感器、按键连接的GPIO就是这种模式),OUT表示输出模式(LED灯、蜂鸣器),ALT0表示复用功能模式(OLED显示屏连接的SDA.1、SCL.1)。V:引脚电平状态,0表示低电平,1表示高电平。Physical:树莓派GPIO排针的物理引脚编号,在实际硬件连接时会用到。红外传感器模块本设计使用了3个红外传感器,VCC接+5V,GND接0V,OUT分别接GPIO17、27、22。按下“进入”按键后,遮挡传感器触发车位占用状态登记;按下“离开”按键后,释放传感器则完成车位使用状态清除。红外传感器的实物图如下图3.2所示:图3.2红外传感器实物图在应用时启动了其内部的上拉电阻,接上电源后其电源指示会亮,遮挡传感器后其输出指示会亮。如下图3.3图3.3红外传感器检测按键模块本设计采用按键触发机制监测车辆出入:按下进入按键,系统判定车辆驶入停车场;按下离开按键,系统识别车辆驶出,以此实现停车场车辆进出状态的信号检测。显示模块本设计选择了一款0.96英寸的OLED屏幕来显示车位信息。这种屏幕最大的特点就是自己能发光,不需要像普通屏幕那样再加个背光灯。所以当显示黑色的时候,它可以直接把像素点完全关掉,这样不仅省电,而且黑色看起来特别纯正。它的分辨率是128×64,虽然不大,但用来显示几个车位状态绰绰有余。我们测试过,在停车场里隔个两三米都能看清楚上面显示的字。这块屏幕用的是SSD1306驱动芯片,通过I2C接口和树莓派连接。在树莓派上用Python写了个简单的驱动程序,让它可以实时更新车位信息。实际用起来发现,这块屏幕反应特别快,基本上按下按钮并操作完传感器后设定的3秒,显示内容就能更新,比普通液晶屏快多了。而且不管从哪个角度看,显示效果都差不多,不会出现看不清的情况。在具体使用中,我们主要用它来显示三个车位的状态,比如哪个车位空着,哪个车位被占了。当车位满载时,再次按下进入按键它还会显示的提示“Parkinglotisfull!”。这种小屏幕现在用得很普遍,像我们平时用的智能手环、一些小型仪器设备上经常能看到。该产品最显著的优势在于体积小巧、能耗极低,同时具备高性价比。我购入的这款产品,售价仅30元左右。在保证显示效果的同时也兼顾了成本控制,经过加速老化测试预估其使用寿命可达3万小时以上。本设计使用的是I2C接口的4引脚的OLED显示屏,驱动起来很方便很简单很快捷。此设计所用的0.96寸OLED显示屏电路图如图3.4所示:图3.4OLED显示屏电路图报警模块本设计的报警模块分为俩个部分。一个是有源蜂鸣器另一个是OLED显示屏。有源蜂鸣器作为常用发声元件的有源蜂鸣器,频繁应用于各种电子器械,主要应用于提示、报警之类的场景,该产品核心优势为使用便捷度高,只需接通电源就可发声,无需搭建繁复的控制线路,极大降低了使用的门槛以及设计成本,处于现代各类电子产品里面,从价格几十块的电子小玩具到价值上万元的工业大设备,皆能看到它的踪影。(1)工作原理:内部融合了振荡电路、驱动电路及发声装置,一旦接通了直流电源,振荡电路造出特定频率的电信号,经驱动电路做放大处理,驱动发声装置的振动膜片做周期性的振荡,进而发出频率平稳的声音,由于内部早已设定振荡频率,只要正常供应电力,便能发出既定频率的声音,不必外部添加额外振荡信号,诸如我们常见到的“滴滴”声,是依靠内部振荡电路产生约2kHz信号驱动的,实际使用的时候,仅需给蜂鸣器加上3到5V的直电压,它便会一直发出设定的音调,十分适配需简单发声提示的各类场合。(2)结构组成:主要由外壳、振动膜片、线圈、磁铁以及电路板等零件构成,外壳一般采用塑料材质制成,用于庇佑内部零件,也起到了聚合声音的作用,增进声音传播效果;振动膜片一般采用的是金属材料,乃发声的核心要素,因电信号驱动开始振动,驱动空气起伏形成声波;线圈和磁铁彼此配合,若电流在通过线圈的瞬间,会生成一个磁场,和磁铁彼此相互作用,带动振动膜片出现晃动;驱动电路和振荡电路集成到了电路板上,担负起产生和放大电信号的使命[25],这些部件彼此协同运作,才能发出清脆且响亮的声音,拆解之际我们发觉,优质蜂鸣器的内部做工十分精细,线圈缠绕整齐划一,电路板布局妥帖。处于车位管理系统内,车位饱和时,若有车辆尝试进入停车场,蜂鸣器即刻发出一连串蜂鸣声,提示车主去另找个空位,这种直观化提示途径,在实际运用期间高效解决车位引导问题,图3.5和图3.6分别展示了蜂鸣器的电路图和实物图:图3.5蜂鸣器电路图图3.6蜂鸣器实物图OLED显示屏当停车场车位已满时再按下进入按键OLED屏下方会显示“Parkinglotisfull!”。当停车场没有车位时按下离开按键OLED屏下方会显示“Nocarstoexit”。3.6本章小结本章主要介绍了车位管理系统的硬件部分,其中着重介绍了作为主控板的树莓派4B。然后阐述了该系统所用到的其他硬件设备,包括按键、传感器、LED灯、蜂鸣器、OLED显示屏,通过图片或者文字描述了解了其如何与树莓派连接。

第4章软件设计4.1操作系统4.1.1烧入系统树莓派可兼容多种操作系统,适配各类使用场景。我选用了RaspberryPiOS,这款基于Linux的系统,能为开发工作筑牢稳定根基。首先我们需要准备一张32G的TF卡和一个读卡器连接到电脑上,然后输入树莓派官网地址/software/,根据自己电脑的操作系统下载如图4.1的对应的镜像烧入器,然后根据如图4.2选择树莓派的版本和要写入的操作系统。图4.1下载镜像烧入器图4.2选择操作系统4.1.2树莓派开机连接系统烧入后然后就是树莓派开机连接,根据设备的不同分为了有屏幕、无屏幕有线远程、无屏幕无线远程三种。我选择的是无屏幕无线远程,实现方法如下:配置SSH远程登入文件和WiFi文件创建两个记事本txt文件,然后把它们的名字分别改成ssh和wpa_supplicant.conf空白文件,用文本编辑器Notepad++打开wpa_supplicant.conf,输入如下图4.3的代码来配置WiFi。图4.3WiFi配置然后将ssh空白文件和wpa_supplicant.conf文件放入boot盘中。硬件连接并开机将TF卡插入树莓派,打开电源开关,树莓派上的绿色指示灯闪烁,说明系统正常。获取树莓派IP地址我的树莓派连接的WiFi是电脑的移动热点,可以直接电脑的设置里看到树莓派的IP地址。远程连接登入树莓派我选择的是Windows系统自带的远程桌面连接,输入树莓派的IP地址就可以连接到树莓派。4.2开发环境搭建4.2.1系统基础环境配置利用系统自带的包管理工具(如apt)安装开发所需开发工具链,同时也可以在Linux终端通过命令行来安装核心依赖库,如RPI.GPIO(GPIO控制库)可以通过sudoapt-getinstallpython3-rpi.gpio来安装、luma.oled(OLED驱动库)可以通过sudo-hpip3install--upgradeluma.oled来安装,还有其他依赖库python3-dev、i2c-tools等。4.2.2硬件接口配置本设计中所使用到的硬件只有OLED显示屏需要配置,其余的都是接普通GPIO接口。在树莓派的终端中,执行命令sudoraspi-config,即可打开raspi-onfig配置工具。进入工具后,找到并选择“InterfacingOptions”选项,再从中找到“I2C”,将其状态切换为启用。具体界面如下图4.4。图4.4配置界面配置完成后可以使用命令sudoi2cdetect-y1来扫描连接到树莓派I2C总线上的设备,如下图4.5,结果显示在地址0x3c处有设备被检测到。这通常意味着连接在树莓派I2C总线上的设备地址为0x3c,很多OLED显示屏(如SSD1306等常见型号)默认I2C地址就是0x3c,后续若要对该设备进行编程控制等操作,就可使用这个地址来指定设备进行通信。图4.5I2C地址检查4.2.3权限设置在Linux系统中,权限设置至关重要,Linux通过严谨的权限体系,保障文件和目录的完全访问。(1)权限类型与用户组:基本权限有读取(r)、写入(w)、执行(x)。每个文件或目录关联所有者(owner)、组(group)、其他用户(others)三个用户组,各用户组可被赋予不同权限组合,如-rw-r--r--表示所有者有读写权限,组和其他用户只有读权限[26]。(2)查看权限:执行ls-l命令,输出结果的第一个字符代表文件类型,后续九个字符按所有者、组、其他用户分成三组展示权限。(3)设置权限:借助chmod命令进行权限设置时,存在着符号模式与八进制模式这两种途径。符号模式如chmodu+xfile.txt,给文件所有者添加执行权限;八进制模式下,读、写、执行分别对应数字4、2、1,如chmod755directory/,为目录所有者设置读/写/执行权限,组和其他用户设置读/执行权限。4.3程序架构设计本系统借助典型的分层架构实施设计,借助明确的层级划分达成功能解耦与模块化开发,整个软件系统沿着从底到顶的方向分为硬件抽象层、业务逻辑层和应用层三个主要层级,各层借助定义完善的接口开展通信与数据交换。4.3.1硬件抽象层(1)GPIO控制模块GPIO控制模块对RPI.GPIO库进行了二次封装,提供统一的引脚初始化如图4.6和引脚操作接口,如pin_mode()函数的作用是对输入或者输出模式进行设置;digital_read()函数可用于读取数字信号;digital_write()函数能够输出高电平或者低电平;pwm_control()函数可以用来生成PWM信号。实现硬件中断管理,支持上升沿触发、内置20ms硬件去抖、中断回调函数注册机制如图4.7。图4.6硬件初始化图中所示的代码是对硬件进行初始化,首先是将LED灯和蜂鸣器都设置为输出模式,然后创建脉冲宽度调制对象函数用以控制蜂鸣器的音量和电机的转速。然后是设置传感器和按键为输入模式并启动其内部的上拉电阻,其中传感器使用的是中断检测而按键采用的是轮询检测。图4.7中断回调函数传感器驱动模块该模块主要实现对车位传感器的驱动和管理,能够实时监测车位的占用或空闲状态,并将状态变化信息及时传递给系统的其他模块进行处理。具体功能包括传感器状态的读取、状态变化的检测以及与事件处理模块的交互等。下图4.8就是设定好的传感器状态检测:图4.8传感器状态检测我设定的传感器状态检测机制:当按下按键后,会在3秒钟之后去检测传感器的状态。要是检测到的状态和系统里保存的状态不一样,就会对系统状态进行更新。显示驱动模块在本设计中,显示驱动模块负责将系统的相关信息准确、清晰地展示在OLED显示屏上,提升了用户对车位状态的直观了解,是系统人机交互的重要组成部分。该模块主要是实现对0.96寸OLED显示屏的驱动控制,能够实时显示车位管理系统的关键信息,如当前可用车位数、各个车位的占用或空闲状态、系统提示信息等。与此同时,系统还拥有根据自身状态变化动态更新显示内容的功能,从而保证用户能够获取到最新且准确的信息。其主要的设计代码如下图4.9:图4.9动态显示显示器的上方区域用于显示当前可用车位数;中间区域分成多个部分,分别对应各个车位,使用不同的图标表示车位的占用和空闲状态;下方用于显示提示信息。报警模块报警模块主要负责在系统出现特定事件(车位已满后再次按下进入按键)发生时,及时发出报警信息,以提醒管理人员。同时还与显示器模块紧密协作,报警时显示屏下方会提示车位已满的信息。图4.10上图4.10就是一个PWM控制函数,可以用来控制蜂鸣器发出声音的持续时间和频率。如buzzer_alert(0.2,2000)就是持续0.2秒、频率为2000Hz。4.4业务逻辑层业务逻辑层是整个系统的核心处理引擎,如同人的大脑一样,对系统接收到的各种信息进行分析和处理,起着承上启下的关键作用,以下是对业务逻辑层的详细描述。4.4.1架构与驱动方式我所设计的代码采用事件驱动架构,意味着系统的运行是由各种事件(比如传感器检测到车位状态变化、用户按下按键等)来驱动的,而不是按照固定的顺序执行代码。当有事件发生时,业务逻辑层会根据事件的类型和系统当前的状态做出相应的处理。图4.11全局变量如图4.11所设定的全局变量中,最后的五个可以作为事件放入事件队列event_queue=Queue(),尤其他的程序从队列中获取事件并进行处理,实现不同功能模块间的解耦。4.4.2状态管理模块状态管理模块运用了有限状态机(FSM)的设计理念。通俗来讲,就是将整个系统的运行状况划分为若干种固定状态。在所设计的车位管理系统中,一共设置了五种不同的状态。第一个是空闲状态:这时候停车场正常运作,没有车辆正在进出。所有车位传感器都处于稳定状态,显示屏正常显示当前车位信息。第二个是等待入场状态:当有司机按下入口按钮时,系统就会进入这个状态。这时候终端会打印“进入等待入场状态,等待车辆入场”,同时开始5秒倒计时。如果5秒内没有检测到车辆停入车位,系统就会自动回到空闲状态。第三种是等待离场状态:和车辆入场的情况类似,当按下出口按钮后,系统便会进入该状态。此时,终端会打印“已进入等待离场状态,请等待车辆离场”,并且也会给予5秒的操作时间。第四个是满位报警状态:当所有车位都被占满时触发。这时候再次按下进入按键,蜂鸣器会发出“滴滴”的报警声,显示屏的会显示“Parkinglotisfull!”的提示信息。第五个是系统异常状态:当检测到传感器故障或其他硬件问题时进入。这时候所有操作都会被暂停,需要管理员处理。这些状态的转换都遵循明确规则。例如,要从空闲状态转变为等待入场状态“按下进入按键”是必不可少的触发条件。而从等待入场状态回到空闲状态,要么是成功检测到车辆停入,要么是5秒超时。每个状态的转换都在代码里写得清清楚楚,确保系统行为是可预测的。4.4.3计时管理模块计时管理模块用于确保系统中所有操作的实时性,特别是关键操作的计时精度达到毫秒级。在车位管理系统中,比如车辆进入或离开的时间记录、超时检测等操作都对时间精度有较高要求。计时管理模块通过精确的计时,能够准确地判断车辆的进出时间是否符合规定,以及是否出现超时等情况,一旦操作时间超过设定的时长,在终端打印“操作未完成”。如下图4.12:图4.12超时检查图中的代码就是超时检查的设计,如果想要设定为5秒超时则可以令operation_timeout=time.time()+5。4.5本章小结本章围绕以Linux操作系统和树莓派4B为基础的车位管理系统软件设计展开,对开发环境搭建、模块功能达成以及系统架构设计做了全面规划,采用模块化编程想法,把系统划分为硬件控制、事件处理、车位状态管理等一众功能模块,采用多线程技术达成各模块并行高效的运行状态。业务逻辑层充当核心角色,采用事件驱动架构、有限状态机模型、优先级队列事件调度等方式,保障系统于复杂工况期间稳定运行;计时管理模块保障操作可实时完成,报警模块迅速响应异常现象,各模块之间协同配合紧密,依靠上述设计架构,既达成了车位管理系统对硬件控制、数据处理以及人机交互的功能目标,又优化了系统的可靠性、可维护性及可扩展性,为系统的实际开发与应用铺就了坚实道路。

第5章系统测试5.1运行结果首先在终端输入文件夹所在地址cdparking_system,到达代码所在的文件夹目录下,然后输入python3parking.py运行代码,运行后传感器会显示初始的车位信息可用车位Available:3/3,代表着三个车位的方块皆为白色(空闲),如下图5.1所示。图5.1初始车位状态再按下进入按键随后遮挡传感器,对应的车位便会被占用。同时终端会打印相应的信息,OLED显示屏上可用车位Available也会减一,下方占用车位对应的方块也会变成黑色,结果如下图5.2。图5.2车位1被占用重复上述操作占用车位2、3,结果如图5.3。图5.3车位2、3被占用当所有车位都被占用后,再次按下进入按键,会在OLED显示屏下方提示“Parkinglotisfull!”的信息。因为buzzer_alert(0.5,800),所有蜂鸣器还会报警,持续时间0.5秒,频率800Hz。结果如下图5.4。图5.4满载报警同理按下离开按键后再释放传感器可以将车位从占用转为空闲,如下图5.5。图5.5车位释放在所有车位都释放后再次按下离开按键,OLED显示屏下方显示“Nocarstoexit”的信息并且和满载报警一样蜂鸣器报警持续0.5秒、频率800Hz,实际如下图5.6。图5.6无车可出显示除了上述的车位进出功能的实现,还有一个超时检测。当按下进入/离开按键后,5秒内没有检测到相应的传感器状态变化则会在终端触发超时警告。如下图5.7。图5.7超时警告以上就是我所设计的车位管理系统的全部功能。5.2本章小结本章主要围绕基于树莓派4B开发的车位管理系统展开了全面测试,在实际模拟的停车场环境里对系统各项功能加以验证,测试结果说明,系统运行平稳又可靠,车辆进出流程毫无阻滞,从按下按钮到操作完毕,平均响应时间0.5秒;车位状态检测精准度高,三个红外传感器同时运作,彼此间无干扰现象,显示屏可实时精准更新车位信息;报警功能响应十分迅速,车位满状态下,蜂鸣器迅速触发。硬件设备连接十分稳固,软件没有出现崩溃及数据丢失的情况,性能优化成效十分显著,关键操作的响应时间合乎设计要求,实施全面的系统性测试后,查明了车位管理系统设计具备有效性及实用性,这为后续的部署应用提供了坚实后盾。

第6章总结该项目凭借Linux操作系统与树莓派4B平台实施,实现车位管理系统全流程开发及验证工作,在硬件选型之际,有效借助树莓派4B的40-pinGPIO接口,利用电平信号采集HC-SR501红外传感器的相关数据,借助I2C协议驱动0.96寸搭载SSD1306驱动芯片的OLED显示屏,依靠BCM2835GPIO的PWM功能操控有源蜂鸣器达成分级报警目的,此种硬件组合可契合功能需求,且能让成本与功耗保持在较低水平。软件设计采用模块化方案,在RaspberryPiOS系统环境里,采用Python语言做开发,硬件控制模块以RPi.GPIO库为基础实现传感器数据实时读取与外设操控,经由GPIO口上拉电阻的配置,有效削减误触发的概率;业务逻辑层构建起有限状态机模型,把系统区分为空闲、入场等待、车辆占用、离场处理、故障报警五种状态,状态转换逻辑凭借事件驱动机制达成,若红外传感器触发中断事件,状态机按照现有状态实施对应操作;计时管理模块基于time库和t.Timer类,实现车辆停放计时误差不超±50ms,借助数据库模块,把进出记录以CSV格式存进TF卡。在系统测试进行阶段,我推进了多范畴的测试工作,功能测试主要用来验证车辆进出管理、车位状态更新以及报警提示等功能的精确性,保证各功能精准无误地开展,兼容性及稳定性测试聚焦于考察系统在不同环境当中的表现,保障系统得以持续、可靠地开展工作,性能测试主要是优化关键操作的响应时间以及资源占用情况,以此提高系统的整体功效,从测试得出的结果看,系统实现了预先拟定的设计目标,功能方面十分全面,而且运转稳定。本车位管理系统把技术创新跟实际应用结合起来,不仅为处理停车管理问题给出有效途径,还为智能交通领域的发展给出实践范例,存在一定的理论及实用价值。

参考文献吴博峰.全国机动车保有量达4.53亿辆[N].中国消费者报,2025-01-21(004).DOI:10.28867/ki.nxfzb.2025.000130.PrinceZTA,PaulD,ShompodNAA,etal.DesignAndImplementationofaSmartWirelessParkingSystem[J].JournalofComputerScienceandTechnologyStudies,2025,7(1):113-121.ZhangX,ZhangH,YanS,etal.Parkingpricingstrategiesintheeraofautonomousvehicles[J].TransportPolicy,2025,16687-100.李鹏.智能车位管理系统研究及应用[D].长安大学,2014.武培茂,张聪亮,李政跃,等.智能车牌识别系统的设计与实现[J].山西电子技术,2022,(01):38-40.霍世腾,郭俊博,马祥.智能停车资源共享系统设计[J/OL].电子设计工程,1-6[2025-05-04]./kcms/detail/61.1477.TN.20241129.1930.002.html.张苑,姚杰.基于Nb-Iot技术和地磁传感器的智能车位检测系统设计与实现[J].电子测试,2022,36(08):26-28.DOI:10.16520/ki.1000-8519.2022.08.024.冯磊.基于红外探测无线传输车位监测系统的研制[D].黑龙江大学,2019.DOI:10.27123/ki.ghlju.2019.001777.苏昱嘉.基于地磁传感器的车辆信息检测算法研究[D].西安建筑科技大学,2024.DOI:10.27393/ki.gxazu.2024.000639.王文贤.基于超声波传感器的全国产化自动泊车系统研究与应用[D].江苏大学,2023.DOI:10.27170/ki.gjsuu.2023.000240.邵汉星,单宏.办好一个会,提升一座城杭州:城市运行管理服务平台护航亚运盛会[J].城乡建设,2023,(22):50-51.上海大众立体停车楼智能引导系统应用案例[J].物联网技术,2014,4(11):7-8.DOI:10.16667/j.issn.2095-1302.2014.11.005.YiX,ShanshangG,GuoxinJ,etal.ParkingSpaceDetectionandPathPlanningBasedonVIDAR[J].JournalofRobotics,2021,2021杜松.新加坡公共交通智能化政策对郑州市智能交通系统升级的借鉴研究[J].人民公交,2024,(22):34-36.DOI:10.16857/11-5903/u.2024.22.009.依明.德国的立体停车库[J].环境教育,2014,(06):73.白永强,张正娟,孙琦.基于树莓派的开关量数据采集系统设计与实现[J].电脑知识与技术,2024,20(23):5-9.DOI:10.14004/ki.ckt.2024.1137.焦石,王琛,胡泽原,等.基于STM32的OLED显示屏驱动设计[J].电子世界,2018,(12):127-128.DOI:10.19353/ki.dzsj.2018.12.072.王蕊.Linux环境下日志分析系统的设计与实现[D].北京工业大学,2006.徐永新.多核并行计算中锁机制的影响研究[J].电子技术与软件工程,2020,(22):156-158.DOI:10.20109/ki.etse.2020.22.067.罗婷,李宏谱.中大型停车场车位管理系统的设计与实现[J].仪表技术,2024,(03):21-25.DOI:10.19432/ki.issn1006-2394.2024.03.014.马永杰,李罡,刘庭伟,等.基于树莓派的智能家居系统开发设计[J].吉林化工学院学报,2024,41(07):26-33.DOI:10.16039/22-1249.2024.07.005.应亚萍,尤传奎,朱向军,等.基于树莓派的农业大棚智能远程控制系统的设计[J].软件,2022,43(08):65-69.范光奎.关于多业态的大型现代建筑智能化设计重难点分析[J].江苏建材,2024,(06):77-78.展明.基于RaspberryPi的儿童教育机器人设计与实现[D].华中师范大学,2018.史俊海,李进财.浅议汽车蜂鸣器作用与结构原理[J].农村实用科技信息,2012,(04):102.崔宝才.Linux文件系统权限管理探讨[J].硅谷,2011,(11):170+148.A.WJ,YiLT,Y.NSA.Internetofthingsenabledparkingmanagementsystemusinglongrangewideareanetworkforsmartcity[J].InternetofThingsandCyber-PhysicalSystems,2024,482-98.XizhenZ,XueqiD,JieY,etal.Spatialheterogeneityofurbanillegalparkingbehavior:AgeographicallyweightedPoissonregressionapproach[J].JournalofTransportGeography,2023,110

附录A系统软件程序代码#!/usr/bin/envpython3#-*-coding:utf-8-*-"""基于树莓派的车位管理系统(多传感器+按键增强优化版)优化点:中断检测、PWM蜂鸣器、动态刷新、批量日志"""importRPi.GPIOasGPIOimportthreadingimporttimeimportcsvimportloggingimportsysfromdatetimeimportdatetimefromcollectionsimportdequefromqueueimportQueuefromerface.serialimporti2cfromluma.oled.deviceimportssd1306fromluma.core.renderimportcanvasfromlogging.handlersimportQueueHandler,QueueListenerfromenumimportEnum#配置日志LOG_FILE="/home/pi/parking_system/parking.log"log_queue=Queue(maxsize=1000)#增大队列容量handler=logging.FileHandler(LOG_FILE)que_handler=QueueHandler(log_queue)que_listener=QueueListener(log_queue,handler)logging.basicConfig(handlers=[que_handler],level=logging.INFO,format='%(asctime)s-%(levelname)s-%(message)s')#在模块顶层先设置GPIO编号模式,确保后续操作使用正确模式GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)#传感器引脚定义(3个车位)SPOTS_SENSORS={'spot1':(1,17),#车位1传感器->GPIO17'spot2':(2,27),#车位2传感器->GPIO27'spot3':(3,22)#车位3传感器->GPIO22}#按键引脚定义BTN_ENTER=19#车辆进入按钮BTN_EXIT=26#车辆离开按钮#输出设备BUZZER=18#蜂鸣器(PWM控制)LED_FULL=25#车位已满指示灯#OLED显示配置serial=i2c(port=1,address=0x3C)OLED=ssd1306(serial,width=128,height=64)#===================系统参数===================TOTAL_SPOTS=len(SPOTS_SENSORS)#总车位数DEBOUNCE_TIME=0.02#按键去抖时间(s)PWM_FREQ=2000#蜂鸣器PWM频率#===================全局变量===================spot_status={spot:FalseforspotinSPOTS_SENSORS}#车位状态event_queue=Queue()#事件队列shutdown_flag=False#系统关闭标志lock=threading.Lock()#线程锁pwm=None#PWM控制器entered=False#记录车辆是否已进入停车场button_enter_pressed=False#记录进入按键是否被按下button_exit_pressed=False#记录离开按键是否被按下valid_button_operation=False#记录是否有有效的按键操作current_operation=None#记录当前正在进行的操作("ENTER"或"EXIT")#新增状态定义classOperationState(Enum):IDLE=0AWAITING_ENTRY=1AWAITING_EXIT=2operation_state=OperationState.IDLEoperation_timeout=0#新增标志位,用于控制传感器校验函数的调用should_verify_sensor=False#===================硬件初始化===================defhardware_init():globallock,pwmwithlock:#初始化输出设备GPIO.setup(BUZZER,GPIO.OUT)pwm=GPIO.PWM(BUZZER,PWM_FREQ)pwm.start(0)GPIO.setup(LED_FULL,GPIO.OUT,initial=GPIO.LOW)#初始化传感器输入forspot_name,(spot_id,pin)inSPOTS_SENSORS.items():try:GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)GPIO.add_event_detect(pin,GPIO.BOTH,callback=sensor_callback,bouncetime=50)spot_status[spot_name]=(GPIO.input(pin)==GPIO.LOW)exceptRuntimeErrorase:logging.error(f"传感器引脚{pin}初始化失败:{str(e)}")#初始化按键输入GPIO.setup(BTN_ENTER,GPIO.IN,pull_up_down=GPIO.PUD_UP)GPIO.setup(BTN_EXIT,GPIO.IN,pull_up_down=GPIO.PUD_UP)print("GPIO模式已在hardware_init函数中设置为BCM")print("初始化车位状态:")forspot,statusinspot_status.items():print(f"{spot}:{'占用'ifstatuselse'可用'}")#===================中断回调函数===================defsensor_callback(channel):time.sleep(0.02)#硬件去抖current_state=GPIO.input(channel)forspot_name,(_,pin)inSPOTS_SENSORS.items():ifpin==channel:withlock:#无论有无按键操作都记录状态变化ifspot_status[spot_name]!=(current_state==GPIO.LOW):spot_status[spot_name]=(current_state==GPIO.LOW)event_type="OCCUPIED"ifcurrent_state==GPIO.LOWelse"VACATED"event_queue.put(("SENSOR",event_type,spot_name))break#封装的按钮检测函数defcheck_button(button_pin,history_queue,event_type,flag):globallockcurrent_state=GPIO.input(button_pin)ifcurrent_state==GPIO.LOW:time.sleep(0.2)ifGPIO.input(button_pin)==GPIO.LOW:withlock:print(f"[DEBUG]:{event_type}")event_queue.put(("BUTTON",event_type))flag=TruewhileGPIO.input(button_pin)==GPIO.LOW:time.sleep(0.01)flag=Truereturnflag#按键监测函数defbutton_monitor():globalcurrent_operation,should_verify_sensor#新增状态跟踪变量btn_states={'ENTER':False,'EXIT':False}#记录前次状态whilenotshutdown_flag:current_time=time.time()#检测ENTER按钮(非阻塞+状态跟踪)current_enter=(GPIO.input(BTN_ENTER)==GPIO.LOW)ifcurrent_enterandnotbtn_states['ENTER']:time.sleep(0.1)#增加去抖时间ifGPIO.input(BTN_ENTER)==GPIO.LOW:#确认按下event_queue.put(("BUTTON","ENTER"))current_operation="ENTER"should_verify_sensor=Trueprint("ENTER按钮按下")btn_states['ENTER']=True#标记为已按下elifnotcurrent_enter:btn_states['ENTER']=False#标记为已释放#检测EXIT按钮(相同逻辑)current_exit=(GPIO.input(BTN_EXIT)==GPIO.LOW)ifcurrent_exitandnotbtn_states['EXIT']:time.sleep(0.1)ifGPIO.input(BTN_EXIT)==GPIO.LOW:event_queue.put(("BUTTON","EXIT"))current_operation="EXIT"should_verify_sensor=Trueprint("EXIT按钮按下")btn_states['EXIT']=Trueelifnotcurrent_exit:btn_states['EXIT']=Falsetime.sleep(0.01)#主循环延迟#===================动态显示优化===================defdisplay_update():"""OLED显示更新线程"""last_available=-1last_available_spots=[]enter_pressed_when_full=Falsewhilenotshutdown_flag:available_count,available_spots=get_available_spots()#仅当可用车位数量或具体可用车位列表发生变化时才更新显示ifavailable_count!=last_availableoravailable_spots!=last_available_spots:withcanvas(OLED)asdraw:draw.rectangle((0,0,127,63),fill="black")draw.text((5,2),f"Available:{available_count}/{TOTAL_SPOTS}",fill="white")positions=[30,65,100]fori,xinenumerate(positions,1):spot_key=f"spot{i}"color="white"ifspot_keyinavailable_spotselse"black"draw.rectangle((x,25,x+20,45),outline="white",fill=color)ifavailable_count==0andenter_pressed_when_full:draw.text((10,50),"Parkinglotisfull!",fill="white")last_available=available_countlast_available_spots=available_spotstime.sleep(0.1)#===================PWM蜂鸣器控制===================defbuzzer_alert(duration=0.5,freq=2000):"""可调频率报警"""pwm.ChangeFrequency(freq)pwm.ChangeDutyCycle(50)time.sleep(duration)pwm.ChangeDutyCycle(0)#新增校验函数(按键按下时运行一次)defsensor_verification_worker():globalshould_verify_sensorwhilenotshutdown_flag:ifshould_verify_sensor:should_verify_sensor=Falsethreading.Timer(3,verify_sensor_states).start()time.sleep(0.1)defverify_sensor_states():"""传感器状态校验(独立线程运行)"""withlock:forspot_name,(_,pin)inSPOTS_SENSORS.items():actual_state=GPIO.input(pin)==GPIO.LOWifspot_status[spot_name]!=actual_state:print(f"[校验]{spot_name}状态不一致,修正为硬件状态{actual_state}")spot_status[spot_name]=actual_stateevent_type="OCCUPIED"ifactual_stateelse"VACATED"event_queue.put(("SENSOR",event_type,spot_name))#===================主控制逻辑===================defmain_loop():globaloperation_state,operation_timeout,entered,valid_button_operation,current_operationwhileTrue:#状态超时检查ifoperation_state!=OperationState.IDLEandtime.time()>operation_timeout:print(f"[超时]{operation_}操作未完成")buzzer_alert(0.4,1000)operation_state=OperationState.IDLEvalid_button_operation=Falsecurrent_operation=None#处理按钮事件ifnotevent_queue.empty():event=event_queue.get()ifevent[0]=="BUTTON":available,_=get_available_spots()ifevent[1]=="ENTER":ifavailable>0:operation_state=OperationState.AWAITING_ENTRYoperation_timeout=time.time()+5#5秒超时valid_button_operation=Trueprint("进入等待入场状态,等待车辆入场")else:buzzer_alert(1,800)#车位已满时蜂鸣器报警withcanvas(OLED)asdraw:draw.rectangle((0,0,127,63),fill="black")draw.text((5,2),f"Available:{available}/{TOTAL_SPOTS}",fill="white")positions=[30,65,100]fori,xinenumerate(positions,1):spot_key=f"spot{i}"color="white"ifspot_keyin[]else"black"draw.rectangle((x,25,x+20,45),outline="white",fill=color)draw.text((10,50),"Parkinglotisfull!",fill="white")#显示屏提示满载信息

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论