找到一种方法来检查 GPIO 输入以打开和关闭 LED,同时程序的其他部分仍在运行
Finding a way to check GPIO input to on and off LED while the other part of the program still runs
我有 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)
我非常感谢现在的任何帮助,也将不胜感激其他方法。
非常感谢:)
使用 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
内将是更改输出状态的代码。
我建议使用第二种方法来快速响应输入状态的变化。
我有 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)
我非常感谢现在的任何帮助,也将不胜感激其他方法。 非常感谢:)
使用 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
内将是更改输出状态的代码。
我建议使用第二种方法来快速响应输入状态的变化。