一起玩轉樹莓派(21)——火情報警器
很多較高價的電梯大廈和寫字樓中都有完善的防火裝置,你想知道這些裝置是如何對是否産生了火情進行判斷的麼?當有物體燃燒時,會産生火焰和煙霧,如果我們可以通過傳感器對火焰和煙霧進行,實際上就可以做到檢測是否有火情發生。
一. 火焰傳感器
物質在燃燒時産生的火焰具有離散光譜的氣體輻射和連續光譜的固體輻射,雖然不同的燃燒物其産生的火焰的輻射強度,波長等各有差異,但總體來說其波長範圍是有特征的,火焰傳感器即是通過這一原理要檢測輻射波長,來判斷周圍是否有火源。本次實驗,我們使用的火焰傳感器如下圖所示:

此傳感器子產品有4個引腳,除了電源正負極外,還有兩個輸出引腳,分别會輸出數字信号和模拟信号。此子產品也帶一個可變電阻來條件傳感器的靈敏度。
二.煙霧傳感器
煙霧傳感器是一種氣體傳感器,當與煙霧接觸時,其表面導電率會發生變化,最終輸出電壓發生變化。本次實驗使用的煙霧傳感器子產品如下圖所示:
此傳感器子產品也有4個引腳,除了電源正負極外,另外兩個輸出引腳分别為數字信号輸出和模拟信号輸出。
三. 實驗連線
本次實驗,我們使用的兩個傳感器子產品都支援數字信号輸出和模拟信号輸出,為了處理模拟信号,我們又要使用模數轉換子產品了,兩個傳感器的模拟信号都通過PCF8591來轉換。
連線方式如下:
PCF8591與樹莓派:
PCF8591 | 樹莓派 |
---|---|
SCL | |
SDA | |
GND | |
VCC | +5V |
火焰傳感器連線:
火焰傳感器 | ||
---|---|---|
DO | GPIO17(BCM編碼,對應實體編碼11) | |
AO | AIN0 |
煙霧傳感器連線:
煙霧傳感器 | ||
---|---|---|
GPIO18(BCM編碼,對應實體編碼12) | ||
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)
專注技術,懂的熱愛,願意分享,做個朋友