如何利用树莓派3B实现智能门禁对讲系统的设计

描述

  该项目为实时系统,仅允许通过授权/受邀人员,使用人脸识别或NFC卡。

  工作步骤:

  人脸接近对讲机

  看着相机

  系统将脸与授权人进行比较

  如果找到对应的数据,那么门就会打开,允许一个人可以进入

  还有另一种通过方式;

  持有通行卡的人将其放置到RFID位置,如果在其数据库中找到此卡的代码,门就会打开

  准备

  继电器连接

  将继电器连接到RPI3。在我的例子中,我使用GPIO12引脚作为数据,5v作为电源,你可以选择任何GND。

  您可以使用shell脚本测试中继,只需创建一个简单的sh脚本:

树莓派

  粘贴下面的代码并运行它。

  脚本代码:

  

树莓派

  相机连接

  连接相机模块并在raspi-config中启用它:

  从终端打开工具:raspi-config

  

树莓派

  选择Enablecamera并点击Enter,然后转到,系统Finish将提示您重新启动。

  要测试系统是否已安装并正常工作,请尝试以下命令:

  

树莓派

  LED连接

  将您的LED连接到您想要的任何GPIO+GND。在我的例子中,我将GPIO16用于绿色LED,将GPIO26用于红色。完成后,测试:

  为绿色和红色LED创建2个简单的Python脚本,内容如下:

  绿灯.py

  

树莓派

  红色led2.py

  

树莓派

  接着就可以进行测试了。如果LED发光,则一切正常。

  

树莓派

  人脸识别脚本

  pip3使用(或用于Python2)从pypi安装此模块:pip2

  

树莓派

  例如,在 Documents 中创建目录“pic”和“unknown”,并在其中放置一些您认识的人的面部照片。就我而言,它是(“/home/pi/Documents/pic/”)和(“/home/pi/Documents/unknown/”)。

使用以下代码创建一个 python 脚本:

import face_recognition 
import picamera 
import numpy as np 
import os 
camera = picamera.PiCamera() 
camera.resolution = (320, 240) 
output = np.empty((240, 320, 3), dtype=np.uint8) 
print("Loading known face image(s)") 
ep_image = face_recognition.load_image_file("/home/pi/Documents/pic/ep.jpg") 
ep_face_encoding = face_recognition.face_encodings(ep_image)[0] 
vl_image = face_recognition.load_image_file("/home/pi/Documents/pic/vl.jpg") 
vl_face_encoding = face_recognition.face_encodings(vl_image)[0] 
face_locations = [] 
face_encodings = [] 
while True: 
   print("Capturing image.") 
   camera.capture(output, format="rgb") 
   face_locations = face_recognition.face_locations(output) 
   print("Found {} faces in image.".format(len(face_locations))) 
   face_encodings = face_recognition.face_encodings(output, face_locations) 
   for face_encoding in face_encodings: 
       match = face_recognition.compare_faces([ep_face_encoding,vl_face_encoding], face_encoding) 
       name = "" 
       os.system("python /home/pi/led2.py &") 
       import time 
       date_string = time.strftime("%Y-%m-%d-%H:%M:%S") 
       camera.capture("/home/pi/Documents/unknown/image-" + date_string + ".jpg") 

测试

  

树莓派

  RFID连接

  引脚:

  

树莓派

  我们需要这个以将我们的RFID模块连接到RaspberryPi1。

  ready:

  

树莓派

  read.py :当脚本找到授权卡时,它在远程 RPI 3 上打开用户图片(运行 LED 脚本),然后开门。

import MFRC522 
import signal 
import os 
continue_reading = True 
MIFAREReader = MFRC522.MFRC522() 
cardA = [46,44,187,26,163] 
cardB = [176,203,130,124,133] 
cardC = [20,38,121,207,132] 
def end_read(signal, frame): 
 global continue_reading 
 continue_reading = False 
 print "Ctrl+C captured, ending read." 
 MIFAREReader.GPIO_CLEEN() 
signal.signal(signal.SIGINT, end_read) 
while continue_reading: 
 (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) 
 if status == MIFAREReader.MI_OK: 
   print "Card detected" 
 (status,backData) = MIFAREReader.MFRC522_Anticoll() 
 if status == MIFAREReader.MI_OK: 
   print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4]) 
   if  backData == cardA: 
     print "Evghenii" 
     os.system("sshpass -p *password* ssh root@10.0.0.60 fbi -T 1 -d /dev/fb1 -noverbose /home/pi/Documents/pic/ep.jpg") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/Documents/open.sh 2>/dev/null") 
#      os.system("sshpass -p *password* ssh root@10.0.0.60 sleep 2") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 killall fbi") 
   elif backData == cardB: 
     print "Vlad" 
     os.system("sshpass -p *password* ssh root@10.0.0.60 fbi -T 1 -d /dev/fb1 -noverbose /home/pi/Documents/pic/vl.jpg") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/Documents/open.sh 2>/dev/null") 
#     os.system("sshpass -p *password* ssh root@10.0.0.60 sleep 2") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 killall fbi") 
   elif backData == cardC: 
     print "is Card C" 
   else: 
     print "wrong Card" 
     os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/led2.py 2>/dev/null") 

  • 使用这个例子:

  

树莓派

  按钮 + 通讯
#!/usr/bin/python 
import RPi.GPIO as GPIO 
from subprocess import call 
from datetime import datetime 
import time 
import os 
shutdownPin = 29 
shutdownMinSeconds = 5 
# button debounce time in seconds 
debounceSeconds = 0.01 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
buttonPressedTime = None 
def buttonStateChanged(pin): 
   global buttonPressedTime 
   if not (GPIO.input(pin)): 
       # button is down 
       if buttonPressedTime is None: 
           buttonPressedTime = datetime.now() 
   else: 
       # button is up 
       if buttonPressedTime is not None: 
           elapsed = (datetime.now() - buttonPressedTime).total_seconds() 
           buttonPressedTime = None 
           if elapsed >= shutdownMinSeconds: 
               call(['shutdown', '-r', 'now'], shell=True) 
           elif elapsed >= debounceSeconds: 
               os.system("bash /home/pi/timed.sh") 
# subscribe to button presses 
GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=buttonStateChanged) 
while True: 
   # sleep to reduce unnecessary CPU usage 
   time.sleep(5) 

功能.sh

#!/bin/bash 
sshpass -p password ssh epogonii@ipadress -p1337 notify-send -i /usr/share/icons/gnome/32x32/actions/ring2.png Smart-Intercom Guest_at_the_door 
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority /usr/bin/feh --hide-pointer -x -q -D 5 -B black -F /home/pi/doorway.png & 
sh /home/pi/Documents/open.sh > log.out 2> /dev/null 
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority xdotool key "x" 
sh /home/pi/tgphoto.sh FaceRec /var/www/html/last.jpg > log.out 2> /dev/null

  

树莓派

  此处为智能对讲增加了按钮。它会将您的最后一张照片发送给通讯机器人,并向Ubuntu桌面PC发送通知。

  

树莓派

  为按钮添加计时

  为了通过按钮在特定时间禁用入口,我制作了以下bash脚本:

  

树莓派

  action.sh-早上7点到晚上19​​点开门

  error.sh-在晚上19​​点到早上7点之间停止使用,显示限制图像error.sh脚本

  

树莓派
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分