宙仔 发表于 2020-2-9 23:40:22

【2020】非接触式门禁



一、项目背景  前段时间,看到一则关于在门把上发现新冠病毒的新闻,于是便想到能否在一些经常需要开关门的公共场合采用非接触式的门禁,例如,在使用频繁的公厕、更衣室等,于是便利用手头上的掌控板设计制作一个《非接触式门禁》的作品。


二、工作方式
  非接触式门禁,通过传感器的遥感来实现开关门。与普通的门相比,它少了门把,同事也少了新冠病毒通过门把的传播途径。特别适合在公共场合的使用,如:公厕门或仅供单人使用的房间的门禁(试衣间,单人更衣室等……)。
  通过显示屏和指示灯来提示室内是否有人在使用,一目了然,让您快速找到位置。

三、工作流程
  1.门虚掩,显示屏显示“无人”,指示灯亮绿灯。  2.当室外超声波测距遥感到人手靠近,门打开;  3.人进去之后,用手靠近室内超声测距,则门关闭,上锁,指示灯亮红灯;  此时,室外外超声测距传感器不起作用。  4.当人要出去的时候,再次用手靠近内超声测距,开锁,门自动打开,  5.人离,门自动关闭,显示屏显示无人,指示灯亮红灯。
  为此,设置了两个标识——outdor,lock,分别标识门外感应和门锁。以下为真值表:

状态outdorlock触发事件
初始状态00门关,亮绿灯
室外超声 有感应00开门
室内超声感应 第1次10关门,上锁,亮红灯
室内超声感应 第2次11解锁,开门,亮绿灯
复位00门关,亮绿灯


  程序设计参考以上真值表

三、实验器材:



元器件数量作用
掌控板1主控器,显示屏
90g舵机2开关门,门锁控制
HC-SR04超声波测距2内外各一,开关门感应
杜邦线若干

其他
结构搭建


  就地取材吧,家里就这些设备了,原本打算再加一个人体感应来控制人走之后关门的,手头没有了,只能放弃了……

四、参考接线图



五、自定义图片
由于掌控的显示屏不能调整字体的大小,所以,利用图片来生成大字体,通过画图制作了两张图片“有人”“无人”,像素大小为:120*60(开始是128*64,生成导入之后居然出错了,缩小一点就正常了),没安装pbm转换工具,就在找了个在线转换的,也顺便推荐给大家。网址:https://convertio.co/zh/image-converter/在线生成名字为on和off的pbm文件之后,将其上传到mPythonX的文件系统中,操作如下:
六、参考代码


源代码:from mpython import *import timefrom hcsr04 import HCSR04from servo import Servo
hc1 = HCSR04(trigger_pin=Pin.P15, echo_pin=Pin.P16)hc2 = HCSR04(trigger_pin=Pin.P14, echo_pin=Pin.P13)servo_0 = Servo(0, min_us=750, max_us=2250, actuation_range=180)servo_1 = Servo(1, min_us=750, max_us=2250, actuation_range=180)image_picture = Image()
#有人提示def human_in():    global outdor, lock, OutSide, InSide, i    oled.fill(0)    oled.blit(image_picture.load("face/on.pbm", 0), 0, 0)    oled.show()    rgb.fill((int(255), int(0), int(0)))    rgb.write()    time.sleep_ms(1)#无人提示def human_out():    global outdor, lock, OutSide, InSide, i    oled.fill(0)    oled.blit(image_picture.load("face/off.pbm", 0), 0, 0)    oled.show()    rgb.fill((int(51), int(255), int(51)))    rgb.write()    time.sleep_ms(1)#开门def opend():    global outdor, lock, OutSide, InSide, i    for i in range(20, 121, 5):      servo_0.write_angle(i)      time.sleep_ms(50)#关门def closed():    global outdor, lock, OutSide, InSide, i    for i in range(120, 19, -5):      servo_0.write_angle(i)      time.sleep_ms(50)#上锁def lockd():    global outdor, lock, OutSide, InSide, i    for i in range(10, 176, 5):      servo_1.write_angle(i)      time.sleep_ms(50)#解锁def unlockd():    global outdor, lock, OutSide, InSide, i    for i in range(175, 9, -5):      servo_1.write_angle(i)      time.sleep_ms(50)
#初始状态设置outdor = 0lock = 0servo_0.write_angle(10)servo_1.write_angle(10)human_out()
while True:    OutSide = hc1.distance_mm()    InSide = hc2.distance_mm()    time.sleep_ms(10)#外超声传感器被感应,开门        if outdor == 0 and OutSide < 50 and OutSide > 10:      OutSide = 0    #初始化OutSide,防误判,下同      InSide = 0   #初始化InSide,防误判,下同      outdor = 1      opend()      time.sleep(1)      print(''.join(]))
#内超声传感器第一次被感应,关门,上锁,亮红灯          if outdor == 1 and lock == 0 and InSide < 50 and InSide > 10:      OutSide = 0      InSide = 0      lock = 1      human_in()      closed()      time.sleep(0.5)      lockd()      time.sleep(1)      print(''.join(]))
#内超声传感器第二次被感应,解锁,开门,亮绿灯          if outdor == 1 and lock == 1 and InSide < 50 and InSide > 10:      OutSide = 0      InSide = 0      lock = 0      outdor = 0      unlockd()      time.sleep(0.5)      opend()      time.sleep(11)      closed()      human_out()      print(''.join(]))


七、作品外观结构




八、演示视频。
https://v.qq.com/x/page/b3063itg6sf.html

DFrJ5KYVQaH 发表于 2020-2-10 20:39:33

想法很好,值得推扩

且歌且行 发表于 2020-2-16 09:51:42

这个项目看过好几次了,这回留个爪印,以示膜拜!{:6_215:}

kylinpoet 发表于 2020-2-18 01:34:24

多谢分享,学习了。
页: [1]
查看完整版本: 【2020】非接触式门禁