基于esp32-cam单片机门禁系统设计
摘 要
本文设计是利用esp32-cam单片机为核心,esp8266单片机为辅助,通过摄像头模块,oled显示屏模块,巴发云平台,rfid射频模块,微信小程序,热释电传感器模块,as608指纹传感器模块,将人脸识别技术,指纹识别技术,网页技术,射频技术相结合实现的门禁系统。
关键词:esp32-cam;传感器;门禁系统;esp8266
四个月时间完成的这个毕业设计,今天整理了一下内容,分享给需要的人,源码什么的放在了文章末尾的百度网盘链接里,如果未来有人看见这篇文章觉得它有帮助就帮忙点个赞收藏一下吧,嘿嘿,本人QQ:2535640842有问题欢迎找我
齐鲁师范学院
本科毕业论文(设计)
题目:基于esp32-cam单片机门禁系统设计
Design of access control system based on esp32-cam microcontroller
学 院
专 业 计算机科学与技术
班 级 云计算
学 号
姓 名 孙 浩
Q Q 2535640842
齐鲁师范学院教务处制
二O二二年 五 月
齐鲁师范学院学士学位论文原创性声明
本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在论文中作了明确的说明并表示了谢意。本声明的法律结果由本人承担。
学位论文作者签名: 孙浩
2022 年 5 月 19 日
齐鲁师范学院关于论文使用授权的说明
本人完全了解齐鲁师范学院有关保留、使用学士学位论文的规定,即:学校有权保留、送交论文的复印件,允许论文被查阅,学校可以公布论文的全部或部分内容,可以采用影印或其他复制手段保存论文。
指导教师签名: 论文作者签名: 孙浩
年 月 日 2022 年 5 月 19 日
目录
及论文结构
本次设计使用的开发语言是micropython, micropython是小型的python语言编译器,它支持python语言在嵌入式设备上运行,micropython与python的语法一致,支持常用的python语法。micropython是计算机工程师和物理学家 Damien George 在2013年创建。micropython的程序无需编译就可以直接在开发板运行。通过干净、简单的Python代码来控制硬件,使用者不用使用像c或c++十分复杂的底层语言控制硬件控制硬件。
本文中的esp32-cam与esp8266使用的网络为wifi网络,wifi协议是ieee802.11协议的一个组成部分,用于无线局域网络的数据传输,弥补无线局域网络传输数据的不足,工作频段分为2.4Ghz和5Ghz,帧结构相对复杂。
MQTT是IBM设计,是一个基于客户端-服务器的消息发布/订阅传输协议[11],esp8266与node-red使用该协议,这个协议以TCP/IP协议为基石,易于实现,简单,使用比较少的代码和比较有限的带宽。
MQTT使用发布与订阅消息模式,一个发送者可以使多个消息者接受,使应用程序更加灵活,实现了对负载内容屏蔽的消息传输。消息的发布者、代理服务器、消息的订阅者是完成mqtt通信的三个组成部分。[8]主题和负载是是消息的两个部分。Mqtt通信模型如图 2-1 mqtt通信模型
图 2-2 mqtt通信模型
esp32-cam与oled显示屏使用IIC协议,IIC协议使用两根信号线即可实现主设备和从设备的通信,开发板仅需要两个普通的输入输出引脚即可向oled屏传输消息,IIC协议分为数据帧和地址帧,IIC主要有硬件实现和软件实现两种方式,本次设计使用的是软件实现,软件IIC是程序控制SCL,SDA线输出高低电平,模拟i2c协议的时序。软件实现IIC一般较硬件实现IIC稳定。
esp8266与as608指纹传感器通信使用UART协议,Uart协议可以实现全双工传输和接收数据,是一个通用的通用串行数据总线,它的基本结构有六种比较常用的寄存器。
esp32-cam单片机与与巴法云平台通信,微信小程序与巴法云平台通信使用此协议,HTTP的中文名字叫超文本传输协议,它是基于TCP协议来传输网页和图片文件的协议,端口是80,HTTP比较常见的请求方法为GET和POST。文中esp32-cam使用post方法传输图片到云平台,微信小程序使用post方法请求云平台中的图片来给用户展示。
Socket协议
esp32-cam单片机与esp8266单片机通信使用Socket协议。Socket借助TCP协议实现,它是一个的中间软件抽象层。Socket其实就是一个通信模式,它能够简化通信,可以把复杂的通信协议变得简单,Socket相当于一个接口,用户只需要使用这个接口,而不需要考虑这个接口后面的东西是什么,只负责组织计算机双方的数据的传输。
PyCharm是python的集成开发环境,功能比较强大,是一个比较不错的软件。另外,pycharm还有一些高级的功能,比如版本控制、自动搭建web开发框架等。Pycharm在项目中用来运行人脸验证的服务端。
uPyCraft是一个用于micropython开发的IDE工具,支持比较主流操作系统。,uPyCraft在windows系列系统上都采用点击exe文件即可使用的方法。uPyCraft在项目中用来为单片机烧录micropython的固件,其较传统的固件烧录更加简单。
Thonny是一个用于micropython开发的IDE工具,支持比较主流操作系统。它里面有一个类似pip的工具包,对于下载一些库很友好,不用专门到官方网站里面下载,它是用tkinter开发出来的python ide,有一些不错的功能等功能,Thonny在项目中负责编写esp32-cam和esp8266单片机的程序,并且上传至单片机中。
Apache ActiveMQ是一个消息服务器。这个服务器可以使用C,Python,java等程序等连接。它是由java开发的,开源,支持多协议,可以使用STOMP通过websocket在Web应用程序之间交换消息,本文使用它作为mqtt服务器转发消息,node-red web端的mqtt消息通过它转发给esp8266单片机。
Node-red 是由IBM开发,是一种简化物联网开发的一种基于流的可视化编程平台编程工具,目前是OpenJS 基金会的成员之一。
Node-red的编程环境是在网页中,用户运行Node-red服务器,通过浏览器登录开发平台,现将已经写好node节点拉到工作区并用线连接节点创建数据流来实现一些功能。用户通过部署即可运行。创建的这个程序以JSON字符串的格式保存,用户可以分享、修改这个程序。
Face_recognition是一个人脸识别python库,由于这个项目开源可以免费使用,这个人脸识别库目前用的人比较多,国内教程比较多。用一些国外的人脸数据集进行测试,它的准确率很高,这个项目的配置运行有两种方式,pip和conda,pip下载十分复杂,conda下载类似linux中的yum下载,十分友好,因此采用conda下载该项目。
用于开发微信小程序和公众号网页开发,项目中主要用它完成监控画面的获取并在手机上展示。方便用户查看。
esp32-cam
esp32-cam是一个带有摄像头模块的单片机,可以在上面运行c或者micropython程序,可以作为一个系统进行独立的工作,它的正常供电电压在5v,它的电流最低为6mA。它在各种物联网场合都能使用,价格便宜,可用于很多物联网解决方案中。Esp32-cam的管脚定义,如图 2-2管脚定义
图 2-2管脚定义
esp32-cam的最小系统图,如图 2-3 esp32-cam最小系统图
图 2-3 esp32-cam最小系统图
esp8266
nodeMcu是一个esp8266开发板,工作电压为5v,有两个模拟输入引脚,10个pwm引脚,两个串行端口,有软件模拟的I²C端口,没有硬件I²C端口,4个spi端口,可以运行C,micropython程序,使用简单容易上手。引脚对应关系如图 2-4 esp8266引脚对应关系
图 2-4 esp8266引脚对应关系
nodemcu模型图,如图 2-5 nodemcu模型图
图 2-5 nodemcu模型图
Ly-01电磁锁的供电电压是12v,在介绍电磁锁的原理之前需要介绍一下电生磁的现象,一条通电的直导线空间会产生圆形磁场。这条导线中的电流越大,那么其产生的磁场越强。该导线产生的磁场是圆形,会围绕导线周围。
电磁锁的原理是电磁锁通电时,电磁锁的电磁线圈产生电磁力会把锁芯吸入锁内,即锁打开,通电结束,电磁力消失,弹簧把锁芯弹出,即锁关上。
As608指纹传感器有两个通信总线,分别为uart和usb,由于usb实现比较复杂,故本文采用uart通信总线与esp8266单片机进行通信,as608指纹传感器芯片是由杭州晟元芯片技术有限公司设计,它有8个控制接口,可以进行二次开发,指纹识别是一对多,指纹验证是一对一,一般它的控制指令一般分三种,包括指令包,数据包和结束包,实现指纹验证的思路一般先把指纹的图像录入进去,然后对录入的这个图像生成一些特征,然后根据这个特征做指纹的验证或者注册,或者删除。
5.mfrc522非接触式读写卡芯片
mfrc522芯片是一个非接触的读写卡的芯片,质量高,价格便宜。它和s50卡常用于门禁系统,水卡系统,饭卡系统,它有uart,iic,spi三种通信接口,通信速率可以达到13.56MHz,本文使用mfrc522芯片通过uart协议与esp32-cam单片机进行数据的交互,可以实现RFID射频系统识别开锁。Mfrc522芯片原理图如图2-6 mfrc522芯片原理。
图 2-6 mfrc522芯片原理
oled是一种显示屏,其发光过程共分为4种,其功耗比较低,显示效果比led好,接线数量少于lcd屏,可以减少单片机端口的占用,本文采用oled显示屏代替lcd屏连接esp32-cam单片机用于显示相关信息。
热释电传感器PIR可以检测是否有人,常用于监控领域,PIR传感器里面的材料压电陶瓷类电介质存在自发极化特性,当这个材料表面受到人体红外辐射温度会升高,上面的电荷减少,减少的电荷经过一些特殊处理会变成电压信号输出,单片机收到这个信号会根据内部的逻辑作出相应的处理,当红外辐射消失,电荷则会恢复,电压消失。热释电原理如图2-7热释电原理图
图 2-7 热释电原理图
8.继电器
继电器是一个低电流控制高电流的电子元器件,常由于各种物联网项目开发,当输入的电流达到一定阀值时,会将电路进行转换,本文使用esp8266的3.3v电压引脚输出电流,用来控制12v电压给电磁锁供电,当esp8266单片机收到开锁指令后,3.3v引脚输出电流,继电器收到小电流,控制12v外部电源给与电磁锁供电,锁开,其本质是用小的电流去控制大的电流运作的一种开关,起到自动调节、安全保护、转换电路的作用[4]。
门禁系统设计共分为四个子系统,分别为人脸识别系统,射频识别系统,网页控制系统以及指纹识别系统,本文重点探讨人脸识别系统和射频识别系统的设计与实现。人脸识别系统主要通过验证人脸开锁,射频系统主要通过验证卡开锁。
系统架构图如下,如图 3-1 门禁系统架构图
图 3-1 门禁系统架构图
验证人脸,验证成功锁开,具体实现:人靠近房门,热释电传感器PIR向esp3-cam单片机发送指令,开始拍照,照片通过wlan传送后端windows服务器(采用socket协议),由后端python程序进行人脸识别,识别成功将开门指令返回esp32-cam,收到开门指令后,esp32-cam向esp8266发送开门指令, esp8266连接继电器模块,继电器模块外接电磁锁和12v电源,[6]esp8266收到指令,发送指令给由继电器模块,继电器模块控制电源模块向电磁锁供电,锁开,人进入后,红外感应装置失去目标,程序恢复等待状态。esp8266与esp32-cam同处一个wlan网络中,工作频段为2.4Ghz,IEEE 802.11g通讯协议,为了保证安全性,在esp8266与esp32-cam中设置认证字段,在发送指令前需进行认证,在esp32-cam向服务器发送照片的同时也将照片通过http协议发送至巴法云平台,开发微信小程序对接巴法云平台展示图片,实现监控功能。
登录网页系统,打开开关按钮,即可实现电磁锁的开与关。具体实现:esp8266连接继电器,继电器连接电磁锁和12v电源,网页向esp8266收到指令,发送指令给继电器模块,继电器控制电源模块向电磁锁供电,锁开或锁关,网页与esp8266使用mqtt协议进行通信,mqtt服务器使用activemq,网页开发使用node-red,运行node-red服务器进入可视化编程平台,对接mqtt服务器,添加按钮,设置发送的消息内容,完成之后对接activemq,在esp8266连接activemq,设置连接密码,订阅主题,根据回调函数收到的指令做出电磁锁相应的操作。
验证指纹,验证成功锁开,具体实现:该系统无需使用esp32-cam,使用esp8266连接继电器模块,继电器外接电磁锁和12v电源,esp8266连接as608指纹识别模块,通信协议采用UART,手指按压传感器,指纹识别成功则锁开,不成功则锁不开,若指纹识系统实现增加指纹,删除指纹功能与清空指纹功能则需要与网页控制系统做联动,通信协议为MQTT。
验证IC卡,验证成功锁开,具体实现:esp8266连接mfrc522非接触读写卡芯片,共占有单片机7个引脚,通过uart协议进行通信,该系统可以读写s50卡,先写s50卡,写完后当再次读取到这个s50卡后会向esp8266发送开锁指令,如果读取到的不是写过的s50卡,则不会发送开锁指令给继电器。
人脸识别流程,如图 3-2 人脸识别流程图
图 3-2 人脸识别流程图
鉴于另外三个方案流程图类似,略过。
esp32-cam 引脚2连红外传感器,引脚6,7连接oled显示屏。
esp8266 引脚5连继电器,继电器连电源,电磁锁,引脚1,3连as608指纹传感器,引脚14, 12, 13, 15, 2连mrff522读写卡。
实现
软件:thonny,pycharm,micropython,微信小程序开发工具,巴法云平台。
硬件:红外传感器,oled屏,电源模块,数据线,esp32-cam单片机,esp8266单片机,路由器,继电器,电磁锁。
人脸识别子系统使用micropython语言开发,云平台主要负责接受esp32-cam发来的图片,微信小程序开发工具主要负责开发微信小程序,展示从云平台获得的图片,数据线用来烧录代码,oled屏用来展示认证是否成功的消息,红外传感器主要负责检测是否有人,有人的话唤醒esp32-cam单片机拍照,路由器充当网关,负责传输无线数据,电源模块用来给esp8266单片机供电。esp8266负责连接继电器与电磁锁。
部分关键代码:
人脸验证部分
if len(unknown_face_encodings) > 0:
#在以存在的人脸库搜索特征码,匹配上则认证成功,匹配不上则验证失败
for face_who in face_list:
match_results = compare_faces(
[face_who[0]], unknown_face_encodings[0])
if match_results[0]:
is_name = face_who[1]
图像监控部分
#api接口,云平台的接口
API='http://images.bemfa.com/upload/v1/upimages.php'
#密钥,用于和云平台做认证
uid="ecedeb645ec8090652704f0608dad074"
#主题,相当于MQTT中的主题
topic= "123456"
#构造http的请求头
headers={"ContentType":"image/jpg","Authtopic":topic,"Authorization":uid}
#初始化相机参数,捕捉图片的大小,格式等
camera.init(0, format=camera.JPEG)
camera.framesize(camera.FRAME_SVGA)
camera.speffect(camera.EFFECT_NONE)
camera.whitebalance(camera.WB_NONE)
#连接wifi,门禁系统设计底层网络为wlan
def connectWifi(ssid,passwd):
global wlan
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
wlan.disconnect()
wlan.connect(ssid,passwd)
while(wlan.ifconfig()[0]=='0.0.0.0'):
time.sleep(1)
connectWifi(SSID,PASSWORD)
#调用micropython的urequest库向云平台以http协议发送图像
def do_camera():
buf = camera.capture()
response = urequests.post(API, data=buf,headers = headers)
print(response.text)
print(response.json())
time.sleep(40)
#不间断发送,实际应该检测到pir传感器的信号时在进行发送,为了简化展示此代码处略过。
while True:
do_camera()
软件:thonny,pycharm,micropython。
硬件:s50卡,mfrc522非接触式读写卡芯片,电源模块,数据线,esp32-cam单片机,esp8266单片机,继电器,电磁锁。
RFID子系统使用microython语言开发,Thonny负责编写esp32-cam,esp8266端代码,mfrc522非接触式读写卡芯片主要负责读写s50卡,s50卡用来存储读写卡芯片写的信息。路由器充当二层网关,负责esp32-cam与esp8266的通信,数据线用来烧录代码,esp8266负责连接继电器与电磁锁。
部分关键代码:
读卡
def do_read():
rdr = mfrc522.MFRC522(14, 12, 13, 15, 2) ###连接单片机的pin引脚
index = True ###用于标记是否读到卡片
try:
while True:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
index = False
if rdr.select_tag(raw_uid) == rdr.OK:
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
rdr.stop_crypto1()
return 1 ####读取到已认证的id卡返回数字1,后续开锁函数开锁的条件值
else:
print("Authentication error")
为了验证系统的正常运行,本文做了人脸识别系统,射频识别系统,网页控制系统以及指纹识别系统的测试,下面是具体的结果以及部分截图展示。
esp32-cam连接wifi网络,正常。
esp32-cam获取ip地址,正常。
服务端人脸身份验证,正常。
esp32-cam与人脸认证服务端通信,正常。
服务端人脸身份验证,正常。
Pir红外传感器检测到人唤醒esp32-cam,正常。
esp32-cam 拍照上传云平台,正常。
微信小程序展示监控图片,正常。
esp32-cam与esp8266通信,正常。
esp32-cam与oled屏通信,正常。
face_recognition库调用,正常。
微信小程序监控画面展示,如图 5-1小程序端监控查看
图 5-1小程序端监控查看
esp8266连接wifi网络,正常。
esp8266获取IP地址,正常。
Activemq转发MQTT数据,正常。
esp8266连接activemq服务器,正常。
Node-red连接activemq服务器,正常。
Node-red部署web项目,正常。
用户登录web网页,正常。
Web网页与esp8266通信,正常。
Node-red web后端如图5-2 node-red web后端
图5-2 node-red web后端
As608指纹传感器与esp8266单片机连线,正常。
esp8266单片机与As608指纹传感器通信,正常。
esp8266单片机控制As608指纹传感器注册,删除,验证指纹,正常。
as608指纹传感器读取指纹,如图 5-3 指纹读取
图 5-3 指纹读取
(四)RFID射频识别系统
esp32-cam连接wifi网络,正常。
esp32-cam获取ip地址,正常。
esp32-cam与mfrc522读写卡通信,正常。
mrff522读写卡读,写s50卡,正常。
mrff522读取s50卡,如图 5-4 mrff522射频芯片读取s50卡片信息
图 5-4 mrff522射频芯片读取s50卡片信息
六、总结
本文门禁系统设计共有4个子系统。通过借助esp8266单片机,esp32-cam单片机,红外传感器,继电器,电磁锁等硬件以及micropython, face_recognition,node-red,微信小程序等软件之间的相互配合实现了人脸识别系统、射频识别系统、网页控制系统以及指纹识别系统这四个子系统的设计。本文重点设计并实现人脸识别门禁系统和射频识别门禁系统。本系统存在一定的缺点,单片机并没有实现多进程多线程处理任务的功能,处理多个进程或线程任务时不够友好,后续需要进一步提高该系统的性能。
七、源代码,PPT及演示视频
链接:https://pan.baidu.com/s/1emct2jyJMb8tcZvm1G4XDg
提取码:h2zy
Original: https://blog.csdn.net/qq_45891048/article/details/125584937
Author: “孙小浩
Title: (毕设3)基于esp32-cam单片机门禁系统设计(附源码,PPT,演示视频)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/637109/
转载文章受原作者版权保护。转载请注明原作者出处!