我想为我的carrera赛道制作一个秒表,我将其制作得更大一些。 因此,我购买了带有附加7英寸触摸屏和用于触发的单独模块的Raspberry Pi 3。 一切都可以单独运行。
现在,我在网上也发现了一款出色的秒表。真的很棒。
在我自己编写的另一个脚本中,使用gpios触发也很不错。
现在我想将两者结合起来,然后失败。
有人对我的错误有任何想法或建议的解决方案吗?
这是我的代码
#!/usr/bin/python
import tkinter as tk
import RPi.GPIO as GPIO
import time
GPIO_TRIGGER_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_TRIGGER_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setwarnings(False)
def update_timeText():
if (state):
global timer
timer[2] += 1
if (timer[2] >= 100):
timer[2] = 0
timer[1] += 1
if (timer[1] >= 60):
timer[0] += 1
timer[1] = 0
timeString = pattern.format(timer[0], timer[1], timer[2])
timeText.configure(text=timeString)
root.after(10, update_timeText)
def start():
global state
state = True
print('Pressed Start')
def stop():
global state
state = False
print('Pressed Stop')
def reset():
global timer
timer = [0, 0, 0]
timeText.configure(text='00:00:00')
print('Pressed Reset')
while GPIO.input(GPIO_TRIGGER_PIN) == True:
if GPIO.input(GPIO_TRIGGER_PIN):
print('CAR DETECTED')
time.sleep(0.1)
state = False
# BULDING TKinter GUI
root = tk.Tk()
root.wm_title('Stopwatch')
timer = [0, 0, 0]
pattern = '{0:02d}:{1:02d}:{2:02d}'
timeText = tk.Label(root, text="00:00:00", font=("Helvetica", 150))
timeText.pack()
startButton = tk.Button(root, text='Start', command=start)
startButton.pack()
stopButton = tk.Button(root, text='Stop', command=stop)
stopButton.pack()
resetButton = tk.Button(root, text='Reset', command=reset)
resetButton.pack()
update_timeText()
root.mainloop()
当前,我在控制台中将触发器作为输出“ CAR DETECTED”。但是,我没有TKinter面板。 如果我删除
while GPIO.input(GPIO_TRIGGER_PIN) == True:
if GPIO.input(GPIO_TRIGGER_PIN):
print('CAR DETECTED')
time.sleep(0.1)
然后出现显示并起作用。没有触发。 如果全都放下,我也会得到面板,但它也不会触发任何其他操作。 有什么想法吗?
感谢帮助
答案 0 :(得分:0)
并不是我真正的专业领域,但是由于没有其他人回答,因此我会尝试一下。
我认为您想使用GPIO.add_event_callback()
*添加一个在事件发生时被调用的回调。
# Callback function
def on_trigger(channel_number):
# Just update the flag
global state
state = False
# Set the callback
GPIO.add_event_callback(GPIO_TRIGGER_PIN , callback=on_trigger)
然后,删除while
循环。
*根据文档,您需要darksidesync库才能使用此功能。除了回调,您还可以创建一个单独的线程。就个人而言,我更喜欢回调。
from threading import Thread
def thread_function(arg):
global state
# Listen for state change
while GPIO.input(GPIO_TRIGGER_PIN) == True:
if GPIO.input(GPIO_TRIGGER_PIN):
# Update var
state = False
print('CAR DETECTED')
time.sleep(0.1)
thread = Thread(target = thread_function)
thread.start()
希望这会有所帮助。