stm1024 发表于 2024-3-17 14:38:39

【树莓派5测评】 06.GPIO操作2

本帖最后由 stm1024 于 2024-3-17 15:41 编辑

前面测试了GPIO作为输出,控制LED亮灭的操作,当然就会有输入的问题,其实和GPIO输出一样,同样用到了gpozero库,只是需要使用的是button类,下面是实现方法。在编辑器Geany中编写如下代码,然后保存为ioinput.py,然后运行:
from gpiozero import Button
用一根杜邦线连接,如下图(不用在意这个扩展板):

杜邦线的一端连接GPIO4号通道,然后另外一端,分别连接和断开GND,会显示不同的状态,如下图所示:

这种方式可以用于检测低电平类型的信号,虽然能起到一定的作用,但是肯定不能覆盖更多的情况,例如,如果按下时是高电平呢?
可以使用如下方式初始化:
button = Button(4,pull_up=False)这时,如果杜邦线与3V3连接,则会显示pressed,否则显示Released。
另外一个问题是,这种方式还是使用的是轮询方式,实时性不好,可以使用wait_for_press()函数,阻塞进程:
from gpiozero import Button
from time import sleep
button = Button(4,pull_up=False)
x=0;
while True:
    button.wait_for_press()
    x=x+1
    print("button pressed! %d" % (x))
这样的话,没有按下时,会阻塞,但是按下时,会飞速计数,这样也不好,如何实现类似中断的方式呢?再增加一个wait_for_release()方法:
from gpiozero import Button
from time import sleep
button = Button(4,pull_up=False)

x=0
while True:
    button.wait_for_press()
    x=x+1
    print("button pressed! %d" % (x))
    button.wait_for_release()
这样在按下并保持的时候,如果不松开,则会阻塞在wait_for_release()这里,只有真正释放按键以后,才可以继续下一轮循环。当然,如果要做的更好的话,可能还得加点延时消抖啥的。

stm1024 发表于 2024-3-18 11:15:31

xiaoshen-372360 发表于 2024-3-18 09:14
支持一下大佬

感谢大佬的支持,共同学习进步:lol

xiaoshen-372360 发表于 2024-3-18 09:14:30

支持一下大佬
页: [1]
查看完整版本: 【树莓派5测评】 06.GPIO操作2

Baidu
map