RaspberryPi Секундомер (TKinter) с триггером - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы построить секундомер для моей трассы Каррера, которую я построил немного больше. Поэтому я купил Raspberry Pi 3 с дополнительным 7-дюймовым сенсорным экраном и отдельными модулями для запуска. Все отлично работает индивидуально.

Теперь я нашел в сети отличный секундомер, который я тоже использовал. Работает действительно отлично.

В другом скрипте, который я написал сам, запуск с помощью 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 голосов
/ 11 января 2019

Не совсем моя область знаний, но, поскольку никто не ответил, я сделаю попытку.

Я думаю, что вы хотите использовать 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()

Надеюсь, это поможет.

...