gpt4 book ai didi

Python GPIO 用按钮触发 LED

转载 作者:行者123 更新时间:2023-11-28 16:30:11 24 4
gpt4 key购买 nike

我正在尝试控制 Raspberry Pi 上的 LED。

我希望 LED 在我按下按钮时亮起,并保持该状态直到我再次按下按钮。

我已经实现了下面的代码并且运行良好。但是,当我按下按钮或按住按钮的速度不够快时,我会遇到问题。

import RPi.GPIO as GPIO
from time import sleep

inpin = 16
outpin = 20

GPIO.setmode(GPIO.BCM)
counter = 0
GPIO.setup(outpin, GPIO.OUT)
GPIO.setup(inpin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
while True:

if GPIO.input(inpin):
if counter == 0:
print "port is low"
GPIO.output(outpin, 0)
counter = 0

else:
print "port is high"
GPIO.output(outpin, 1)
counter = 1
else:
if counter == 1:
print "port is low"
GPIO.output(outpin, 0)
counter = 0
else:
print "port is high"
GPIO.output(outpin, 1)
counter = 1
sleep(0.1)

finally:
GPIO.cleanup()

按照“TessellatingHeckler”建议的方式实现它是完美的。即使有多个输入和输出,它也能完美运行。重要的是保证快速变化状态的“elif”循环。这是工作代码:

import RPi.GPIO as GPIO
from time import sleep



GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(20, GPIO.OUT)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(27, GPIO.OUT)


btn1_button = 'up'
btn1_light = 'off'

btn2_button = 'up'
btn2_button = 'off'



def LED1(output):
GPIO.output(20, output)

def LED2(output):
GPIO.output(27, output)

while True:


######################## BUTTON 1 ########################
if (btn1_button == 'up' and btn1_light == 'off'):
if not GPIO.input(16):
print "LED1 ON"
LED1(1)
btn1_button = 'down'
btn1_light = 'on'


elif (btn1_button == 'down' and btn1_light == 'on'):
if GPIO.input(16):
btn1_button = 'up'


elif (btn1_button == 'up' and btn1_light == 'on'):
if not GPIO.input(16):
print "LED1 OFF"
LED1(0)
btn1_button = 'down'
btn1_light = 'off'


elif (btn1_button == 'down' and btn1_light == 'off'):
if GPIO.input(16):
btn1_button = 'up'

###########################################################

####################### BUTTON 2 ##########################
if (btn2_button == 'up' and btn2_light == 'off'):
if not GPIO.input(17):
print "LED2 ON"
LED2(1)
btn2_button = 'down'
btn2_light = 'on'

elif (btn2_button == 'down' and btn2_light == 'on'):
if GPIO.input(17):
btn2_button = 'up'


elif (btn2_button == 'up' and btn2_light == 'on'):
if not GPIO.input(17):
print "LED2 OFF"
LED2(0)
btn2_button = 'down'
btn2_light = 'off'


elif (btn2_button == 'down' and btn2_light == 'off'):
if GPIO.input(17):
btn2_button = 'up'
sleep(0.1)
###########################################################

GPIO.cleanup()

最佳答案

你用文字写下了这个计划:

  • 按下按钮,灯亮
  • 按下按钮,灯熄灭

但是你用代码写的更像是:

  • 每秒 10 次,
    • 如果按钮弹起,什么也不做
    • 如果按下按钮,则切换灯

这是完全不同的。按住按钮超过 1/10 秒,它开始变得奇怪。我的评论的意思是,您的代码在每次尝试更新所有内容时都会经历循环;您正在跟踪循环中最后一次发生的事情,这意味着您不能保持超过一个循环持续时间的任何内容。相反,您需要将循环与状态跟踪分开,以便状态可以一遍又一遍地保持不变,并且只在按钮更改时让狗吃 cookies 。

驱动系统状态的是按钮,而不是时间流逝。系统可以处于 4 种可能的状态,如下所示:

(Button=Up, Light=Off) <----------------
| |
| Button pushed down |
\/ |
(Button=Down, Light=/On/) |
| |
| Button released |
\/ |
(Button=Up, Light=On) |
| |
| Button pushed down |
\/ |
(Button=Down, Light=/Off/) |
| / \
| Button released |
| |
-------------------------------

如果您明确地对这些状态进行编码并遵循顺序,让按钮成为唯一允许您从一个状态转到下一个状态的东西……您不可能因按住按钮太久而出现任何奇怪的行为。我希望。您当前的代码从 (Button=Down, Light=On) 跳到 (Button=Down, Light=Off) 然后再跳回来。

我这里的代码未经测试,我不完全确定按下和释放按钮时 GPIO.input() 的运行方式。我假设它在大多数情况下为 0/False,在按下按钮时为 1/True。

import RPi.GPIO as GPIO
from time import sleep

inpin = 16
outpin = 20

GPIO.setmode(GPIO.BCM)
GPIO.setup(outpin, GPIO.OUT)
GPIO.setup(inpin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

button='up'
light='off'

while True:

if (button=='up' and light=='off'):
# wait for button press before changing anything
if not GPIO.input(inpin):
GPIO.output(outpin, 1)
button='down';
light='on'

elif (button=='down' and light=='on'):
# stay in this state until button released
if GPIO.input(inpin):
button='up'

elif (button=='up' and light=='on'):
if not GPIO.input(inpin):
GPIO.output(outpin, 0)
button='down'
light='off'

elif (button=='down' and light=='off'):
if GPIO.input(inpin):
button='up'
sleep(0.1)

因此,buttonlight 跟踪系统的状态。每次通过循环,只有一个 if block 会匹配,并且它几乎什么都不做,直到它获得使状态更改为下一个的按钮更改。

第一次通过时,第一个 block 匹配,它检查是否按下了按钮。它一直这样做。

你按下按钮,现在第一个 block 点亮 LED 并更新状态。

现在,每次循环,(button=='down' and light=='on') 匹配。它处于状态 2,只要您按下按钮,它就会一直保持该状态。每次通过循环它都会寻找按钮释放,这是唯一可以触发任何状态更改的东西。

等等

关于Python GPIO 用按钮触发 LED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com