树莓派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)  #拉高引脚
    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

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺有缸的高飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值