边缘检测
边缘是指信号状态的改变,从低到高(上升沿)或从高到低(下降沿)。通常情况下,我们更关心于输入状态的该边而不是输入信号的值。这种状态的该边被称为事件。
先介绍两个函数:
wait_for_edge() 函数。
wait_for_edge()被用于阻止程序的继续执行,直到检测到一个边沿。也就是说,上文中等待按钮按下的实例可以改写为:
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:
print(‘Timeout occurred’)
else:
print(‘Edge detected on channel’, channel)
add_event_detect() 函数
该函数对一个引脚进行监听,一旦引脚输入状态发生了改变,调用event_detected()函数会返回true,如下代码:
GPIO.add_event_detect(channel, GPIO.RISING) # add rising edge detection on a channel
do_something()
// 下面的代码放在一个线程循环执行。
if GPIO.event_detected(channel):
print(‘Button pressed’)
上面的代码需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的。
不过可采用另一种办法轻松检测状态,这种方式是直接传入一个回调函数:
def my_callback(channel):
print(‘This is a edge event callback function!’)
print(‘Edge detected on channel %s’%channel)
print(‘This is run in a different thread to your main program’)
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)
如果你想设置多个回调函数,可以这样:
def my_callback_one(channel):
print(‘Callback one’)
def my_callback_two(channel):
print(‘Callback two’)
GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)
注意:回调触发时,并不会同时执行回调函数,而是根据设置的顺序调用它们。
综合例子:点亮LED灯
好了,上面说明了一大堆函数库的用法,那么现在就应该来个简单的实验了。这个实验很简单,点亮一个LED灯。
编写代码之前,首先你需要将led灯的针脚通过杜邦线连接到树莓派的引脚上,比如你可以连接到11号引脚。
新建一个main.py文件,写入如下代码:
import RPi.GPIO as GPIO //引入函数库
import time
RPi.GPIO.setmode(GPIO.BOARD) //设置引脚编号规则
RPi.GPIO.setup(11, RPi.GPIO.OUT) //将11号引脚设置成输出模式
while True
GPIO.output(channel, 1) //将引脚的状态设置为高电平,此时LED亮了
time.sleep(1) //程序休眠1秒钟,让LED亮1秒
GPIO.output(channel, 0) //将引脚状态设置为低电平,此时LED灭了
time.sleep(1) //程序休眠1秒钟,让LED灭1秒
GPIO.cleanup() //程序的最后别忘记清除所有资源
保存,并退出文件。执行python3 main.py,即可观看效果。Ctrl+C可以关闭程序。
此外,不妨也试试其它的函数吧,增强印象。
使用PWM
这个python函数库还支持PWM模式的输出,我们可以利用PWM来制作呼吸灯效果。详情看代码:
import time
import RPi.GPIO as GPIO //引入库
GPIO.setmode(GPIO.BOARD) //设置编号方式
GPIO.setup(12, GPIO.OUT) //设置12号引脚为输出模式
p = GPIO.PWM(12, 50) //将12号引脚初始化为PWM实例 ,频率为50Hz
p.start(0) //开始脉宽调制,参数范围为: (0.0 《= dc 《= 100.0)
try:
while 1:
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc) //修改占空比 参数范围为: (0.0 《= dc 《= 100.0)
time.sleep(0.1)
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
except KeyboardInterrupt:
pass
p.stop() //停止输出PWM波
GPIO.cleanup() //
评论
查看更多