【基于树莓派的门禁系统】这几天黑客松比赛, 在大神的带领下稳稳地落幕了, 虽然是第二次参加这个活动了, 但是这一次才是我尽全力的去做自己的东西, 这里也感谢xx大牛的指导 。
也不废话了, 直接上图吧
文章图片
大致的一个流程就是以树莓派作为中间人, 利用各个模块的特性去实现开门。 这里其实还是有很多坑的。 比如一开始的nfc模块, 我把所有的库都装完了,但是不管怎么样都报错, 然后就在这里花了很长的时间, 后来发现, nfc模块后面有一个i2c 和spi 的开关,而我们一直开的是spi模块的,然后拨了下开关就好了。
另外就是树莓派的源了吧, 好慢的说。其他的摄像头模块,还有灯都没有什么难度,之前就有接触过。总的来说这次还是准备不充分吧, 有好多东西其实可以在前一天就准备好的, 不然也不用那么手忙脚乱了,好好吸取教训 。 另外,这次买模块是在是让大牛破费了,不过还好可以报销的。 其他的也没有说明好说的的啦
上代码吧,对了,我们还有一个是web app模块, 但是代码什么我就不放上来了。
#!/usr/bin/env python
#coding=utf-8import web
from datetime import *
from os import *
import httplib urls=('/(.*)','index')
app=web.application(urls,globals()) def take_photo():
dt=datetime.now()
s= dt.strftime('%Y%m%d%H%M%S')
mypath=s+'.jpg'
system('raspistill -o '+mypath+' -t 100')
system('mv '+mypath+' /usr/share/nginx/www/'+mypath)
return mypathclass index:
def GET(self,path):
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
mypath=take_photo()
returnmypathif __name__=="__main__":
app.run()
#!/usr/bin/env python
#coding=utf-8import RPi.GPIO as GPIO
import subprocess
from time import sleep
import re
import threading
from os import popen,system
from datetime import *
import httplib
import urlliburl='http://192.168.100.127:8080/open'
url2='http://192.168.100.127:8080/close'
url3='http://192.168.100.127:8080/uid'
pins=25def check_user(usrid):
fp=open('user.txt','r')
d=fp.readlines()
i=0
for user in d:
ifusrid == user[:-2]:
i=1
img=take_photo()
open_door()
sendMessage(usrid,img)
print 'take photo ok and open door ok'
if i==0 :
print 'you have no permission' def open_door():
GPIO.output(pins,GPIO.HIGH)
sleep(3)
GPIO.output(pins , GPIO.LOW)def sendMessage(usrid,img):
urlt=url3
params = urllib.urlencode({'uid': usrid,'img':img})
headers = {"Content-type": "application/x-www-form-urlencoded"
, "Accept": "text/plain"}
conn= httplib.HTTPConnection('192.168.100.127',8080)
conn.request('POST', urlt,params,headers)
conn.close()
print 'send user ok'def check_data(data):
if not data:
return
else:
mystr='NFCID'
dizhi=data.find(mystr)
newstr=data[dizhi+8:dizhi+24]
d=re.split(r' ',newstr)
s=''.join(d[0:8])
check_user(s) def take_photo():
dt=datetime.now()
s= dt.strftime('%Y%m%d%H%M%S')
mypath=s+'.jpg'
system('raspistill -o '+mypath+' -t 100')
system('mv '+mypath+' /usr/share/nginx/www/'+mypath)
return mypath
def read_nfc():
while True:
data=https://www.it610.com/article/subprocess.Popen('nfc-poll' ,shell=True,stdout=subprocess.PIPE)
(stdoutput,errout)=data.communicate()
check_data(stdoutput)
def read_server():
while True:
conn= httplib.HTTPConnection('192.168.100.127',8080)
conn.request(method='GET', url=url)
reponse = conn.getresponse()
res = reponse.read()
if res[0]=='1':
print 'door open'
conn.request(method='GET' ,url=url2)
conn.close()
sleep(1) def read_finger():
print ' this is your finger'
sleep(20)
def nfc_start():
system('nfc-list')
sleep(1)
def main():
global url,url2,url3,pins
GPIO.setmode(GPIO.BCM)
GPIO.setup(pins,GPIO.OUT)
nfc_start()
sleep(1)
t1=threading.Thread(target=read_nfc).start()
t2=threading.Thread(target=read_server).start()
#t3=threading.Thread(target=read_finger).start() if __name__ == '__main__':
main()
对了,还有一个指纹识别模块的,但是大牛说要搞什么调试, 时间会来不及,于是就没做了。 然后,还有一个大坑是我们比赛的时候, 大牛忘记开另外一个模块, 导致我们后来的演示不是很成功,我也是醉了,不过看到自己努力的成果,还是挺开心的。
推荐阅读
- 树莓派|用PythonPi实现门禁系统-概述
- 智能控制|用PythonPi实现门禁系统-场景
- 树莓派|树莓派安装成功后,搜索不到自己的WIFI
- Raspberry pi 用python控制PWM ,驱动BLDC伺服电机
- 智能小车|树莓派智能四轮小车实现超声波测距
- Raspberry pi 用python控制脉冲,驱动BLDC伺服电机
- 用树莓派获取天气状况
- 树莓派使用Python3获取天气信息