带触发器的RaspberryPi秒表(TKinter)

时间:2019-01-11 15:30:26

标签: python-3.x triggers raspberry-pi watch gpio

我想为我的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)

然后出现显示并起作用。没有触发。 如果全都放下,我也会得到面板,但它也不会触发任何其他操作。 有什么想法吗?

感谢帮助

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()

希望这会有所帮助。