如何解决Raspberry Pi长按与短按可控制LED
首先,免责声明,我对Raspberry Pi和Python绝对是陌生的,所以我可能在这里做了些废话,抱歉。
作为第一个练习,我尝试制作一个二进制计数器,该计数器通过按下物理GPIO按钮来逐个点亮4个LED,每次都会增加一个,我已经成功做到了,我想要添加更多功能,例如,如果我按住按钮的时间更长(在这种情况下为2秒),则计数器将重置为0,并且所有LED都将熄灭。
这是我现在所做的代码,但是行为与我的意图不完全相同...
import RPi.GPIO as GPIO
from time import sleep,time
led0 = 40
led1 = 35
led2 = 33
led3 = 31
btn = 7
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(led0,GPIO.OUT)
GPIO.setup(led1,GPIO.OUT)
GPIO.setup(led2,GPIO.OUT)
GPIO.setup(led3,GPIO.OUT)
GPIO.setup(btn,GPIO.IN,pull_up_down=GPIO.PUD_UP)
start_time = 0
counter = 0
time_counter = 0
time_flag = False
button_flag = True
try:
while True:
if GPIO.input(btn) == 0: # Button is pressed
if time_flag == True:
time_counter = time() - start_time
#print (f"time_counter = {round(time_counter,2)}s")
if button_flag == True:
time_flag = True
start_time = time()
counter += 1
#print (time_counter)
if time_counter > 2:
counter = 0
if counter == 16:
counter = 0
print (format(counter,'02d'),format(counter,'04b')) # bin(counter)[2:].zfill(4)
button_flag = False
sleep(0.05)
GPIO.output(led0,counter & 0x01)
GPIO.output(led1,counter & 0x02)
GPIO.output(led2,counter & 0x04)
GPIO.output(led3,counter & 0x08)
else:
button_flag = True
time_counter = 0
except KeyboardInterrupt:
GPIO.cleanup()
问题是我希望长时间按住按钮才能执行特定的代码,但是依次发生的是,如果我长时间按住按钮,一开始什么都没有发生,因此我需要按一下再次使其执行我想要的操作,并重置计数器以关闭所有LED。
这是一个演示该问题的GIF,在第一部分中,我只是使用快速单击进行增量操作,之后我按住该按钮很长时间(2秒钟),但是该按钮无法正常工作,因此我必须单击再次使其生效。
将感谢您的任何建议!
解决方法
我认为问题是当您按住按钮时,button_flag
将在1次循环后设置为False
。这样,当仍按下按钮时,if button_flag == True
块下的代码将不再运行。释放按钮后,else
块将运行并将time_counter
设置为0。那么您的if time_counter > 2
条件将永远不会满足,因此也就不会将counter
设置为0。>
您应该将时间检查移到time_flag检查块中。而且,如果time_counter达到其极限,则在发生超时后立即将LED的变化反映出来
import RPi.GPIO as GPIO
from time import sleep,time
led0 = 40
led1 = 35
led2 = 33
led3 = 31
btn = 7
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(led0,GPIO.OUT)
GPIO.setup(led1,GPIO.OUT)
GPIO.setup(led2,GPIO.OUT)
GPIO.setup(led3,GPIO.OUT)
GPIO.setup(btn,GPIO.IN,pull_up_down=GPIO.PUD_UP)
start_time = 0
counter = 0
time_counter = 0
time_flag = False
button_flag = True
try:
while True:
if GPIO.input(btn) == 0: # Button is pressed
if time_flag == True:
time_counter = time() - start_time
#print (f"time_counter = {round(time_counter,2)}s")
if time_counter > 2:
counter = 0
GPIO.output(led0,counter & 0x01)
GPIO.output(led1,counter & 0x02)
GPIO.output(led2,counter & 0x04)
GPIO.output(led3,counter & 0x08)
if button_flag == True:
time_flag = True
start_time = time()
counter += 1
#print (time_counter)
if counter == 16:
counter = 0
print (format(counter,'02d'),format(counter,'04b')) # bin(counter)[2:].zfill(4)
button_flag = False
sleep(0.05)
GPIO.output(led0,counter & 0x01)
GPIO.output(led1,counter & 0x02)
GPIO.output(led2,counter & 0x04)
GPIO.output(led3,counter & 0x08)
else:
button_flag = True
time_counter = 0
except KeyboardInterrupt:
GPIO.cleanup()
,
希望这段代码能帮到你
import RPi.GPIO as GPIO
from time import sleep,time
btn = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(btn,pull_up_down=GPIO.PUD_DOWN)
while True:
if(GPIO.input(btn) == 1):
start = time()
sleep(0.02)
while(GPIO.input(btn) == 1):
sleep(0.01)
length = time() - start
print("press : "+str(length))
else:
print("await")
sleep(1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。