почему при чтении из tkinter вход gpio дает одно и то же значение независимо от того, нажата кнопка или нет - PullRequest
0 голосов
/ 03 ноября 2018

У меня 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()

1 Ответ

0 голосов
/ 23 ноября 2018

Спасибо всем за вашу помощь, и я просто позволю бенефициару узнать, что я обнаружил, в чем проблема в коде. Замените GPIO.setmode (GPIO.BCM) на GPIO.setmode (GPIO.BOARD), и теперь программа работает так, как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...