1、实验原理:
检测引脚的电平变化,两种方式
一种是不断扫描获取引脚状态,根据电平状态做出响应;
二是采用边缘检测,当有上升沿和下降沿时做出响应,就相当于硬中断。其中边缘检测可设置三种情况,上升沿触发,下降沿触发,上升沿下降沿都触发;
边缘检测可在任意时刻捕捉到电平变化,而扫描获取只有在读引脚状态的一瞬间才获取引脚状态。
本文采用第二种方式,使用上升下降沿都触发。比如火焰传感器,在无火焰时,输出高电平。在检测到火焰时,电平跳变并输出低电平,树莓派检测到此引脚的下降沿,进入相应的函数做出响应比如输出危险警告;当火焰消失,电平跳变为高,树莓派做出响应消除警告。
2、准备:
IDE:thonny
硬件:倾斜传感器、火焰传感器、烟雾气体传感器。(这些都是输出0和1高低电平,所以有其他这种类型的传感器可随意替换,比如人体红外)
引脚连接:见文内代码
树莓派引脚及编号方式图在这篇博客有:
https://blog.csdn.net/qq_41102371/article/details/105729297.
3、上代码
# encoding: utf-8
import RPi.GPIO as GPIO
import time
#pin_set
GPIO.setmode(GPIO.BCM) #采用BCM编号方式
input_pin_fire=2 #火焰
input_pin_smoke=3 #烟雾
input_pin_tilt=4 #倾斜
output_pin=17 #输出引脚,可接LED
#var
firedata='NO FIRE'
smokedata='NO SMOKE'
tiltdata='NO TILT'
# def init():
GPIO.setup(input_pin_fire, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(input_pin_smoke, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(input_pin_tilt, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(output_pin, GPIO.OUT)
GPIO.setwarnings(False)
def my_callback_fire(input_pin_fire):
global firedata
# print('callback function fire!')
# time.sleep(0.005)
if GPIO.input(input_pin_fire)==1:
firedata='NO FIRE'
GPIO.output(output_pin, 1) #拉高引脚
else:
firedata='FIRE!!!!!!!!!'
GPIO.output(output_pin, 0) #拉高引脚
return
def my_callback_smoke(input_pin_smoke):
global smokedata
# print('callback function smoke!')
# time.sleep(0.005)
if GPIO.input(input_pin_smoke)==1:
smokedata='NO SMOKE'
GPIO.output(output_pin, 1) #拉高引脚
else:
smokedata='SMOKE!!!!!!'
GPIO.output(output_pin, 0) #拉高引脚
return
def my_callback_tilt(input_pin_tilt):
global tiltdata
# print('callback function tilt!')
# time.sleep(0.005)
if GPIO.input(input_pin_tilt)==1:
tiltdata='NO TILT'
GPIO.output(output_pin, 1) #拉高引脚
else:
tiltdata='TILT!!!!!!!!!'
GPIO.output(output_pin, 0) #拉高引脚
return
#GPIO.BOTH为上升下降沿都触发
#GPIO.RISING为上升沿触发
#GPIO.FALLING为下降沿触发
GPIO.add_event_detect(input_pin_fire, GPIO.BOTH, callback=my_callback_fire) #interruput
GPIO.add_event_detect(input_pin_smoke, GPIO.BOTH, callback=my_callback_smoke) #interruput
GPIO.add_event_detect(input_pin_tilt, GPIO.BOTH, callback=my_callback_tilt) #interruput
while True:
print('detecting:')
time.sleep(1)
print('FIRESTATE:',firedata,'\nSMOKESTATE:',smokedata,'\nTLITSTATE:',tiltdata)
GPIO.cleanup()
可以看到,while死循环里面只是打印状态,检测函数没放在循环里,因为有上升下降沿时,会自动执行相应函数
4、上结果
没了!
--------------------------------------------------------------------------------------------诺有缸的高飞鸟202004