一、介紹
?? 氣體傳感器MQ-2是檢測(cè)空氣中可燃?xì)怏w濃度的易燃?xì)怏w和煙霧傳感器菠净。他們經(jīng)常用于家用禁舷、工業(yè)或汽車(chē)中的煙氣和易燃?xì)怏w彪杉,如液化石油氣,異丁烷牵咙,丙烷隔嫡,甲烷和酒精的氣體檢測(cè)設(shè)備。
二崭捍、組件
★Raspberry Pi主板*1
★樹(shù)莓派電源*1
★40P軟排線(xiàn)*1
★PCF8591模數(shù)轉(zhuǎn)換器模塊*1
★煙霧傳感器模塊*1
★有源蜂鳴器模塊*1
★面包板*1
★跳線(xiàn)若干
三氧敢、實(shí)驗(yàn)原理
??MQ-2氣體傳感器是一種表面離子型和N型半導(dǎo)體,它使用氧化錫半導(dǎo)體氣敏材料另凌,當(dāng)環(huán)境溫度在200至300℃時(shí)谱轨,氧化錫會(huì)吸附空氣中的氧氣并形成氧陰離子吸附,從而降低半導(dǎo)體中的電子密度吠谢,從而增加其電阻土童。當(dāng)與煙霧接觸時(shí),如果晶界阻擋層被煙霧調(diào)制并發(fā)生變化工坊,則可能導(dǎo)致表面電導(dǎo)率發(fā)生變化献汗。因此,你可以獲得煙霧存在的信息王污,煙霧濃度越高罢吃,材料的導(dǎo)電性越高,因此輸出電阻越低昭齐。
??在這個(gè)實(shí)驗(yàn)中尿招,如果有害氣體達(dá)到一定濃度,蜂鳴器會(huì)發(fā)出蜂鳴聲警告司浪。
??煙霧報(bào)警傳感器有兩個(gè)LED指示燈泊业。POWER-LED是電源指示燈,接通電源后常亮啊易。DOUT-LED是數(shù)字輸出指示燈吁伺,當(dāng)沒(méi)有檢測(cè)到煙霧時(shí)熄滅,DO輸出高電平租谈;當(dāng)檢測(cè)到煙霧時(shí)篮奄,DO輸出低電平,DOUT-LED指示燈亮割去。而判定是否有煙霧的臨界值可以通過(guò)旋轉(zhuǎn)藍(lán)色元件上的十字螺絲調(diào)節(jié)窟却,調(diào)節(jié)到?jīng)]有煙霧時(shí)DOUT-LED燈剛好熄滅時(shí)即可。
四呻逆、實(shí)驗(yàn)步驟
??第1步:連接電路夸赫。這里要注意,有源蜂鳴器使用的電源為3.3V咖城,煙霧傳感器使用的是5V茬腿。
樹(shù)莓派 | T型轉(zhuǎn)接板 | PCF8591模塊 |
---|---|---|
SDA | SDA | SDA |
SCL | SCL | SCL |
5V | 5V | VCC |
GND | GND | GND |
煙霧傳感器模塊 | T型轉(zhuǎn)接板 | PCF8591模塊 |
---|---|---|
AO | * | AIN0 |
DO | G17 | * |
VCC | 5V | VCC |
GND | GND | GND |
有源蜂鳴器 | T型轉(zhuǎn)接板 |
---|---|
I/O | G18 |
VCC | 3.3V |
GND | GND |
??第2步:PCF8591模塊采用的是I2C(IIC)總線(xiàn)進(jìn)行通信的呼奢,但是在樹(shù)莓派的鏡像中默認(rèn)是關(guān)閉的,在使用該傳感器的時(shí)候切平,我們必須首先允許IIC總線(xiàn)通信握础。
??第3步:開(kāi)始編程。這里先編寫(xiě)一個(gè)PCF8591.py庫(kù)文件悴品,后面再編寫(xiě)一個(gè)python程序引入這個(gè)庫(kù)文件禀综。
??PCF8591.py庫(kù)文件就是PCF8591模塊的程序,單獨(dú)編寫(xiě)是為了便于重用苔严。在這個(gè)腳本中定枷,我們使用了一個(gè)放大器用于模擬輸入和一個(gè)LED燈用于模擬輸出,模擬輸入不能超過(guò)3.3V邦蜜!
??該程序也可以單獨(dú)運(yùn)行依鸥,用于測(cè)試3個(gè)電阻模塊的功能亥至。需用短路帽連接AIN0和INPUT0(電位計(jì)模塊)悼沈,連接AIN1和INPUT1(光敏電阻模塊),以及連接AIN2和INPUT2(熱敏電阻模塊)姐扮。
??連接LED燈絮供,AIN0(模擬輸入0)端口用于接收來(lái)自電位計(jì)模塊的模擬信號(hào),AOUT(模擬輸出)用于將模擬信號(hào)輸出到雙色LED模塊茶敏,以便改變LED的亮度壤靶。
??PCF8591的詳細(xì)內(nèi)容請(qǐng)查看樹(shù)莓派基礎(chǔ)實(shí)驗(yàn)12:PCF8591模數(shù)轉(zhuǎn)換器實(shí)驗(yàn)。
#!/usr/bin/env python
#------------------------------------------------------
#
# 您可以使用下面語(yǔ)句將此腳本導(dǎo)入另一個(gè)腳本:
# “import PCF8591 as ADC”
#
# ADC.Setup(Address) # 查詢(xún)PCF8591的地址:“sudo i2cdetect -y 1”
# i2cdetect is a userspace program to scan an I2C bus for devices.
# It outputs a table with the list of detected devices on the specified bus.
# ADC.read(channal) # Channal范圍從0到3
# ADC.write(Value) # Value范圍從0到255
#
#------------------------------------------------------
#SMBus (System Management Bus,系統(tǒng)管理總線(xiàn))
import smbus #在程序中導(dǎo)入“smbus”模塊
import time
# for RPI version 1, use "bus = smbus.SMBus(1)"
# 0 代表 /dev/i2c-0惊搏, 1 代表 /dev/i2c-1 ,具體看使用的樹(shù)莓派那個(gè)I2C來(lái)決定
bus = smbus.SMBus(1) #創(chuàng)建一個(gè)smbus實(shí)例
#在樹(shù)莓派上查詢(xún)PCF8591的地址:“sudo i2cdetect -y 1”
def setup(Addr):
global address
address = Addr
def read(chn): #channel
if chn == 0:
bus.write_byte(address,0x40) #發(fā)送一個(gè)控制字節(jié)到設(shè)備
if chn == 1:
bus.write_byte(address,0x41)
if chn == 2:
bus.write_byte(address,0x42)
if chn == 3:
bus.write_byte(address,0x43)
bus.read_byte(address) # 從設(shè)備讀取單個(gè)字節(jié)贮乳,而不指定設(shè)備寄存器。
return bus.read_byte(address) #返回某通道輸入的模擬值A(chǔ)/D轉(zhuǎn)換后的數(shù)字值
def write(val):
temp = val # 將字符串值移動(dòng)到temp
temp = int(temp) # 將字符串改為整數(shù)類(lèi)型
# print temp to see on terminal else comment out
bus.write_byte_data(address, 0x40, temp)
#寫(xiě)入字節(jié)數(shù)據(jù)恬惯,將數(shù)字值轉(zhuǎn)化成模擬值從AOUT輸出
if __name__ == "__main__":
setup(0x48)
#在樹(shù)莓派終端上使用命令“sudo i2cdetect -y 1”向拆,查詢(xún)出PCF8591的地址為0x48
while True:
print '電位計(jì) AIN0 = ', read(0) #電位計(jì)模擬信號(hào)轉(zhuǎn)化的數(shù)字值
print '光敏電阻 AIN1 = ', read(1) #光敏電阻模擬信號(hào)轉(zhuǎn)化的數(shù)字
print '熱敏電阻 AIN2 = ', read(2) #熱敏電阻模擬信號(hào)轉(zhuǎn)化的數(shù)字值
tmp = read(0)
tmp = tmp*(255-125)/255+125
# 125以下LED不會(huì)亮,所以將“0-255”轉(zhuǎn)換為“125-255”酪耳,調(diào)節(jié)亮度時(shí)燈不會(huì)熄滅
write(tmp)
time.sleep(2)
??若想深入學(xué)習(xí)模/數(shù)轉(zhuǎn)換等模電知識(shí)浓恳,強(qiáng)烈推薦以下書(shū)籍,國(guó)外大學(xué)最經(jīng)典模電教程碗暗,比國(guó)內(nèi)教程生動(dòng)有趣更易懂颈将。掃碼購(gòu)買(mǎi)或者點(diǎn)擊下面的鏈接。
《模擬電子基礎(chǔ)》點(diǎn)擊購(gòu)買(mǎi):https://u.dangdang.com/OIVk
??第4步:編寫(xiě)控制程序言疗。我們通過(guò)點(diǎn)煙的方式產(chǎn)生可燃性氣體靠近MQ-2氣體傳感器的位置晴圾。屏幕上將顯示0到255之間的值。如果有害氣體達(dá)到一定濃度噪奄,蜂鳴器會(huì)發(fā)出斷續(xù)蜂鳴聲死姚,并且屏幕上會(huì)印有“Danger Gas”沾凄。
??你可以轉(zhuǎn)動(dòng)模塊上電位器的軸來(lái)提高或降低濃度閾值。
??MQ-2氣體傳感器需要加熱一段時(shí)間知允。等到屏幕上打印的值保持穩(wěn)定并且傳感器變熱撒蟀,這意味著它可以正常且敏感的工作。注意:氣體傳感器發(fā)熱是正常的温鸽,實(shí)際上保屯,溫度越高傳感器就越敏感。
#!/usr/bin/env python
import PCF8591 as ADC
import RPi.GPIO as GPIO
import time
import math
DO = 17
Buzz = 18
GPIO.setmode(GPIO.BCM)
def setup():
ADC.setup(0x48)
GPIO.setup (DO, GPIO.IN)
GPIO.setup (Buzz, GPIO.OUT)
GPIO.output (Buzz, 1) #高電平不響涤垫,低電平觸發(fā)報(bào)警蜂鳴
def Print(x):
if x == 1:
print ''
print ' *********'
print ' * Safe~ *'
print ' *********'
print ''
if x == 0:
print ''
print ' ***************'
print ' * Danger Gas! *'
print ' ***************'
print ''
def loop():
status = 1
count = 0
while True:
print 'ADC.read(0)==' , ADC.read(0) #有煙霧時(shí)姑尺,該值增大
tmp = GPIO.input(DO);
print 'tmp==' ,tmp
#無(wú)煙霧時(shí)為高電平,tmp=1,打印safe蝠猬,有煙霧時(shí)為低電平切蟋,打印Danger Gas!
if tmp != status:
Print(tmp)
status = tmp
if status == 0:
count += 1
if count % 2 == 0:
GPIO.output(Buzz, 0) #檢測(cè)到煙霧后榆芦,報(bào)警聲為斷續(xù)蜂鳴聲柄粹,低電平為響
else:
GPIO.output(Buzz, 1) #高電平不響
else:
GPIO.output(Buzz, 1)
count = 0
time.sleep(0.2)
def destroy():
GPIO.output(Buzz, 1)
GPIO.cleanup()
if __name__ == '__main__':
try:
setup()
loop()
except KeyboardInterrupt:
destroy()
??