树莓派3B多传感器:倾斜、火焰、烟雾(4) | 您所在的位置:网站首页 › 树莓派2引脚图 › 树莓派3B多传感器:倾斜、火焰、烟雾(4) |
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) #拉高引脚returndef 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) #拉高引脚returndef 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) #interruputwhile True:print('detecting:') time.sleep(1)print('FIRESTATE:',firedata,'\nSMOKESTATE:',smokedata,'\nTLITSTATE:',tiltdata)GPIO.cleanup()可以看到,while死循环里面只是打印状态,检测函数没放在循环里,因为有上升下降沿时,会自动执行相应函数 4、上结果--------------------------------------------------------------------------------------------诺有缸的高飞鸟202004 |
CopyRight 2018-2019 实验室设备网 版权所有 |