一起玩转树莓派(21)——火情报警器
很多公寓和写字楼中都有完善的防火装置,你想知道这些设备是如何对是否产生了火情进行判断的么?当有物体燃烧时,会产生火焰和烟雾,如果我们可以通过传感器对火焰和烟雾进行,实际上就可以做到检测是否有火情发生。
一. 火焰传感器
物质在燃烧时产生的火焰具有离散光谱的气体辐射和连续光谱的固体辐射,虽然不同的燃烧物其产生的火焰的辐射强度,波长等各有差异,但总体来说其波长范围是有特征的,火焰传感器即是通过这一原理要检测辐射波长,来判断周围是否有火源。本次实验,我们使用的火焰传感器如下图所示:
此传感器模块有4个引脚,除了电源正负极外,还有两个输出引脚,分别会输出数字信号和模拟信号。此模块也带一个可变电阻来条件传感器的灵敏度。
二.烟雾传感器
烟雾传感器是一种气体传感器,当与烟雾接触时,其表面导电率会发生变化,最终输出电压发生变化。本次实验使用的烟雾传感器模块如下图所示:
此传感器模块也有4个引脚,除了电源正负极外,另外两个输出引脚分别为数字信号输出和模拟信号输出。
三. 实验连线
本次实验,我们使用的两个传感器模块都支持数字信号输出和模拟信号输出,为了处理模拟信号,我们又要使用模数转换模块了,两个传感器的模拟信号都通过PCF8591来转换。
连线方式如下:
PCF8591与树莓派:
PCF8591 | 树莓派 |
---|---|
SCL | SCL |
SDA | SDA |
GND | GND |
VCC | +5V |
火焰传感器连线:
火焰传感器 | PCF8591 | 树莓派 |
---|---|---|
GND | GND | |
VCC | +5V | |
DO | GPIO17(BCM编码,对应物理编码11) | |
AO | AIN0 |
烟雾传感器连线:
烟雾传感器 | PCF8591 | 树莓派 |
---|---|---|
GND | GND | |
VCC | +5V | |
DO | GPIO18(BCM编码,对应物理编码12) | |
AO | AIN1 |
四. 编码
本次实验与本系列博客中之前介绍的实验从技术上来说,并没有什么难度,编码如下:
#SMBus (System Management Bus,系统管理总线)
import smbus #在程序中导入“smbus”模块
import RPi.GPIO as GPIO
import time
bus = smbus.SMBus(1) #创建一个smbus实例
# 通过PCF8591读取模拟信号
# 火焰传感器的模拟数据
def readFire():
#发送一个控制字节到设备 表示要读取AIN0通道的数据
bus.write_byte(0x48,0x40)
bus.read_byte(0x48) # 空读一次,消费掉无效数据
return bus.read_byte(0x48) # 返回某通道输入的模拟值A/D转换后的数字值
# 烟雾传感器的模拟数据
def readSmoke():
#发送一个控制字节到设备 表示要读取AIN1通道的数据
bus.write_byte(0x48,0x41)
bus.read_byte(0x48) # 空读一次,消费掉无效数据
return bus.read_byte(0x48) # 返回某通道输入的模拟值A/D转换后的数字值
# 通过GPIO读取数字信号
# 设置使用的引脚编码模式
GPIO.setmode(GPIO.BOARD)
# 数字输出引脚 BCM 17
P1 = 11
# 数字输出引脚 BCM 18
P2 = 12
# 引脚初始化
GPIO.setup(P1, GPIO.IN)
GPIO.setup(P2, GPIO.IN)
while True:
print('--------分割线----------')
print('火焰传感器数字信号:', GPIO.input(P1))
data1 = readFire()
print('火焰传感器模拟信号:', data1)
print('烟雾传感器数字信号:', GPIO.input(P2))
data2 = readSmoke()
print('烟雾传感器模拟信号:', data2)
time.sleep(2)
专注技术,懂的热爱,愿意分享,做个朋友