Поиск способа проверки входа GPIO для включения и выключения светодиода, пока другая часть программы еще работает - PullRequest
0 голосов
/ 11 мая 2018

У меня есть 1 кнопка ввода PIN 18 и 2 выхода PIN 12 и 16, когда вход ВЫСОКИЙ, я хотел бы, чтобы выходы были активированы и деактивированы, когда вход НИЗКИЙ. Я пытался использовать

    if (GPIO.input(18)==True):

    GPIO.output(16, False)
    GPIO.output(12, False)

Тем не менее, выходы активируются, только если вход уже ВЫСОКИЙ, прежде чем я запустил программу, и он не активируется, когда я отпускаю кнопку и нажимаю ее снова. Это фрагмент моего кода прямо сейчас

class Controller(tk.Tk):
def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)

    tk.Tk.wm_title(self, "Controller")

    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand=True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0,weight=1)


    menubar = tk.Menu(container)
    moremenu = tk.Menu(menubar, tearoff=0)
    moremenu.add_command(label="Contact Info", 
                         command=lambda:self.show_frame(ContactPage))
    moremenu.add_command(label="Exit", command=exitmenu)
    menubar.add_cascade(label="More", font=MENU_FONT ,menu=moremenu)
    menubar.add_cascade(label="    ", state="disabled")


    explorer= tk.Menu(menubar, tearoff=0)
    explorer.add_command(label="Manual Ventilator Ctrl",
                         command=lambda:self.show_frame(ManualCtrl))
    explorer.add_command(label="Battery Fault Bypass",
                         command=lambda:self.show_frame(BatteryBypass))
    explorer.add_command(label="Fault History",
                         command=lambda:self.show_frame(Faulthist))
    explorer.add_command(label="Manual Battery Charging",
                         command=lambda:self.show_frame(Manualcharge))
    menubar.add_cascade(label="Explorer", font=MENU_FONT, menu=explorer)
    menubar.add_cascade(label="    ", state="disabled")


    syssetupmenu= tk.Menu(menubar, tearoff=0)
    setup= tk.Menu(menubar, tearoff=0)
    setup.add_command(label="Clock Setup",
                      command=lambda:self.show_frame(Clocksetup))
    setup.add_cascade(label="System Setup", menu=syssetupmenu)
    setup.add_command(label="Factory Default",
                      command=lambda:self.show_frame(Factorydef))
    syssetupmenu.add_command(label="Timer Setting",
                             command=lambda:self.show_frame(Timerset))
    syssetupmenu.add_command(label="Latch Setting",
                             command=lambda:self.show_frame(Latchset))
    syssetupmenu.add_command(label="Change User Password",
                             command=lambda:self.show_frame(Changeuserpw))
    syssetupmenu.add_command(label="Change Access Password",
                             command=lambda:self.show_frame(Changeaccesspw))
    syssetupmenu.add_command(label="Change Lockout Password",
                             command=lambda:self.show_frame(Changeadminpw))
    syssetupmenu.add_command(label="Battery Display Calibration",
                             command=lambda:self.show_frame(Batterydisp))
    syssetupmenu.add_command(label="Daily Auto Charging",
                             command=lambda:self.show_frame(Autocharg))
    syssetupmenu.add_command(label="Fault Record Reset",
                             command=lambda:self.show_frame(Faultrec))
    syssetupmenu.add_command(label="Diagnostic Records",
                             command=lambda:self.show_frame(Diag))
    syssetupmenu.add_command(label="Battery Fault Setpoints",
                             command=lambda:self.show_frame(Batterysetpts))
    menubar.add_cascade(label="Setup", font=MENU_FONT ,menu=setup)


    tk.Tk.config(self, menu=menubar)


    self.frames = {}

    for F in (DefaultScreen, ContactPage, ManualCtrl,BatteryBypass, Faulthist, Manualcharge,
              Clocksetup,Timerset,Latchset,Changeuserpw,Changeaccesspw,Changeadminpw,
              Batterydisp,Autocharg,Faultrec,Diag,Batterysetpts,Factorydef):

        frame = F(container, self)
        self.frames[F] = frame
        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame(DefaultScreen)

def show_frame(self,cont):
    frame = self.frames[cont]

    frame.tkraise()

if (GPIO.input(18)==True):

    GPIO.output(16, False)
    GPIO.output(12, False)

Я был бы очень признателен за любую помощь прямо сейчас, был бы также признателен за альтернативный метод. Большое вам спасибо:)

1 Ответ

0 голосов
/ 11 мая 2018

Используйте функции обнаружения прерываний и фронтов, предоставляемые RPi.GPIO. https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

Вы можете использовать метод tkinter .after для периодической проверки того, произошло ли событие с момента последней проверки.

#Use this when you setup your program
GPIO.add_event_detect(channel, GPIO.RISING)  # add rising edge detection on 

#Use this inside your periodically called function
if GPIO.event_detected(channel):
    print('Button pressed')

Или вы можете зарегистрировать обратный вызов функции, когда происходит событие

GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_function)

тогда внутри my_function будет код для изменения состояния выходов.

Я бы предложил второй метод для быстрого реагирования на изменение состояния ввода.

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