У меня Raspberry Pi 3 и я создал графический интерфейс tkinter в Python, а в фоновом режиме я опрашиваю вход GPIO, подключенный к переключателю для изменения значения. Тем не менее, программа продолжает считывать одно и то же значение 1 независимо от того, нажата кнопка или нет. Я пробовал два способа опроса gpio, метод после tkinter root и использование другого потока и все те же результаты. Любая помощь будет оценена. Вот код:
from tkinter import ttk
from tkinter import *
import time
from threading import Thread
import RPi.GPIO as GPIO
import logging
import os
cwd = os.path.dirname(os.path.abspath(__file__))
logger = logging.getLogger('Door Sensor')
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(message)s')
file_handler = logging.FileHandler(os.path.join(cwd, "message.log"))
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
def sensor_setup():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(29,GPIO.IN,pull_up_down=GPIO.PUD_UP)
class Mainwindow():
def __init__(self):
self.sensorState = None
self.window = Tk()
self.window.title("Switch Monitor")
self.frame = Frame(self.window)
self.frame.grid()
self.window.columnconfigure(0, weight=1)
self.window.config(cursor="none")
self.window.attributes('-zoomed', True)
self.window.attributes('-fullscreen', True)
self.show_idle_closed_switch()
t = Thread(target = self.switch_monitor)
t.daemon = True
t.start()
def show_idle_closed_switch(self):
self.welcomeLabel = ttk.Label(self.window, text="Switch Closed",font='size, 16', justify='center', anchor='center')
self.welcomeLabel.grid(columnspan=8,row=1, pady=15)
def show_switch_opened(self):
self.welcomeLabel = ttk.Label(self.window, text="Switch Opened",font='size, 16', justify='center', anchor='center')
self.welcomeLabel.grid(columnspan=8,row=1, pady=15)
def forget_welcome_label(self):
self.welcomeLabel.grid_forget()
def switch_monitor(self):
while True:
self.sensorState = GPIO.input(29)
logger.info('sensor value = %s\r\n' % str(self.sensorState))
if self.sensorState == 0:
logger.info('Door Closed, sensor value = 0\r\n')
print("Front Door Closed")
elif self.sensorState == 1:
logger.info('Door Opened, sensor value = 1\r\n')
print("Front Door Opened")
self.forget_welcome_label()
self.show_switch_opened()
self.sensorState = None
time.sleep(45)
if __name__ == '__main__':
sensor_setup()
w = Mainwindow()
w.window.mainloop()