我正在尝试使用Python为我的Raspberry Pi制作门刷卡系统。我将程序分为两部分:门警报和卡刷卡记录系统。这两个程序单独工作,但如何将两个程序合并为一个python文件?我尝试过线程,但它似乎没有用。
以下是节目: 1.)门警报:如果门保持打开一段时间,LED将闪烁,然后警报响起
import time
import RPi.GPIO as gpio
led = 37
buzzer = 11
door = 16
gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP)
def blink(buzzer):
gpio.output(buzzer, True)
time.sleep(0.1)
gpio.output(buzzer, False)
time.sleep(0.1)
return
def blink(led):
gpio.output(led, True)
time.sleep(1)
gpio.output(led, False)
time.sleep(1)
return
while True:
if gpio.input(door):
time.sleep(3)
for i in range(0,5):
blink(led)
for i in range (0,5):
blink(buzzer)
else:
gpio.output(buzzer, False)
gpio.cleanup()
2.。)刷卡记录系统:当有人刷卡时,指示灯闪烁并拍摄照片
import datetime
import time
import os
import RPi.GPIO as gpio
led = 37
t = datetime.datetime.now()
gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(led, gpio.OUT)
def blink(led):
gpio.output(led, True)
time.sleep(0.1)
gpio.output(led, False)
time.sleep(0.1)
while True:
card = raw_input()
f = open("Laptop Sign Out" + '.txt', 'a')
f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
f.write('\n')
f.write(';')
f.write('\n')
f.close()
time.sleep(1)
for i in range(0,3):
blink(led)
os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
time.sleep(3)
gpio.cleanup()
(更新)此外,下面是我尝试线程化:
import time
import RPi.GPIO as gpio
import os
import datetime
from threading import Thread
led = 37
buzzer = 11
door = 16
t = datetime.datetime.now()
gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP)
def blink(buzzer):
gpio.output(buzzer, True)
time.sleep(0.1)
gpio.output(buzzer, False)
time.sleep(0.1)
return
def blink(led):
gpio.output(led, True)
time.sleep(1)
gpio.output(led, False)
time.sleep(1)
return
def doorsensor():
while True:
if gpio.input(door):
time.sleep(3)
for i in range(0,5):
blink(led)
for i in range (0,5):
blink(buzzer)
else:
gpio.output(buzzer, False)
def cardreader():
while True:
card = raw_input()
f = open("Laptop Sign Out" + '.txt', 'a')
f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
f.write('\n')
f.write(';')
f.write('\n')
f.close()
time.sleep(1)
for i in range(0,3):
blink(led)
os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
time.sleep(3)
f1 = Thread(target = doorsensor())
f2 = Thread(target = cardreader())
f2.start()
f1.start()
gpio.cleanup()
答案 0 :(得分:1)
您需要将线程函数作为target
参数传递,而不是它们的返回值:
import sleep
f1 = Thread(target=doorsensor) # Remove parentheses after doorsensor
f1.daemon = True
f1.start()
f2 = Thread(target=cardreader) # Remove parentheses after cardreader
f2.daemon = True
f2.start()
# Use a try block to catch Ctrl+C
try:
# Use a while loop to keep the program from exiting and killing the threads
while True:
time.sleep(1.0)
except KeyboardInterrupt:
pass
gpio.cleanup()
在每个线程上设置daemon
属性,以便只剩下守护程序线程时程序将退出:
线程可以标记为“守护程序线程”。这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出。初始值继承自创建线程。可以通过守护程序属性设置标志。
答案 1 :(得分:0)
如果您尝试同时运行这两个程序,则必须使用线程或多处理,您说您已尝试过。如果您有,我们可以看到您的尝试,因为我们可能会帮助您解决您的问题。
另一个问题是你的所有方法都被命名为Blink,在python中是不允许的,在python中你的所有方法都应该有不同的名称。
修改:对于线程,请务必键入threading.Thread(target = target)
作为您的代码
答案 2 :(得分:0)
我提出了一种无线方法。
我们的想法是将您的while
机构转换为update
个功能,并将它们交替调用。
首先,您的门环变为
def update_door():
if gpio.input(door):
time.sleep(3)
for i in range(0,5):
blink(led)
for i in range (0,5):
blink(buzzer)
else:
gpio.output(buzzer, False)
然后您的刷卡记录系统变为
def update_card():
card = raw_input()
f = open("Laptop Sign Out" + '.txt', 'a')
f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
f.write('\n')
f.write(';')
f.write('\n')
f.close()
time.sleep(1)
for i in range(0,3):
blink(led)
os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
time.sleep(3)
最后,您的主循环变为:
while True:
update_door()
update_card()
但是出现问题:time.sleep
中的update_card
也会延迟update_door
。
在这里,您有三个解决方案:
1 - 如果update_door
延迟,则可以
好吧,好的。
2 - 如果update_door
被延迟,那就不行了,但如果update_card
没有延迟就没问题
然后只需删除time.sleep(3)
。
3 - 您需要update_door
不要延迟,update_card
要延迟
然后,您可以使用time
模块设置手动计时器。
lastCardUpdate = time.time()
while True:
update_door()
now = time.time()
if now - lastCardUpdate >= 3:
update_card()
lastCardUpdate = now
但raw_input
中的update_card
是一种阻止方法,等待用户输入。
如果确实需要每三秒钟发生一次此用户输入,则无法使用此方法。
如果你可以在while
之前移动它,即在update_card
函数之外移动它,那就没关系了。
否则,你确实需要使用线程。
答案 3 :(得分:0)
无论其他任何错误,您都需要在启动后加入其中一个主题。
f1 = Thread(target = doorsensor())
f2 = Thread(target = cardreader())
f2.start()
f1.start()
f1.join()
f1.join()
做了什么?
基本上,它告诉Python等到f1
完成运行。
如果您不这样做,程序将启动f1
和f2
,然后退出。
退出后,Python将释放所有资源,包括那两个执行将停止的线程。