基於樹莓派(Raspberry Pi)平臺的MQ-2煙霧報警系統以及結合Zabbix監控的實現(一)
達成目標:
利用Rapberry Pi 驅動MQ-2煙霧報警模塊,對信息進行采集和提取,而後Zabbix監控系統來收集和處理信息采集到的信息。
1.準備樹莓派(Raspberry Pi)一個
2.MQ-2有害氣體檢測模塊
3.杜邦線若幹
4.SD卡一張以及一個讀卡器
二、各個器件介紹
1.樹莓派(Raspberry Pi)
??Raspberry Pi是一個英國小型組織慈善組織The Raspberry Pi Foundation發行的一款針對電腦業余愛好者,學生,以及小型企業等用戶的迷你電腦,預裝的是Linux操作系統,體積非常小巧,在最新款的Raspberry Pi 3 Model B,搭載了高通的ARMv8的高性能CUP,並且包含1GB RAM,引腳數上升到40個。
較上一代的優點:
1.首先處理器是新一代四核心Broadcom BCM2837 64位ARMv8 處理器,並且處理器速度最高可達1.2GHz,必要時還可以超頻。</font>
2.第二是新添加了板載BCM43143 WiFi芯片,無需WiFi網絡適配器。
Raspberry Pi官網:https://www.raspberrypi.org/
2.MQ-2有害氣體檢測模塊
??這是一款廣泛應用於家庭和工廠的氣體泄漏檢測裝置,適用於液化氣、甲烷、丙烷、丁烷、酒精、氫氣、煙霧等有害氣體的檢測。
- 有四個引腳:
VCC:輸入5V正極電流
GND:接電源負極
DO:TTL高低電平輸出端
AO:模擬電壓輸出端
- TTL輸出靈敏度調節:
此電位器只針對TTL,也就是DO輸出靈敏度進行調節。
順時針調節靈敏度增高,逆時針調節靈敏度降低。- 具有以下優點:
???廣泛的探測範圍
???高靈敏、快速的相應恢復
???優異的穩定性、壽命成長
???簡單的驅動電路 ???
三、Raspberry Pi部署操作系統
1.概述
? ?絕大多數開源Linux社區都有樹莓派Arm架構的操作系統,比如基於Debian的Raspbian系統和Ubuntu mate系統,這是兩款對樹莓派支持性最好的系統,並且在國內也有鏡像源,對於一個開發板來說,這是可能是最重要的。
2.部署Raspbian系統
? ? 首先,到前面我貼上去的官網上下載系統鏡像文件,點進DOWNLOADS,看到有兩種系統:“NOOBS”和“Raspbian ”,我選擇了Raspbian,,然後會看到兩個版本的鏡像,其中左邊有“DESKTOP”是帶有桌面的操作系統,相反右邊的是最小化安裝的系統鏡像,建議身邊如果能方便的獲取顯示器,來通過HDML接入,那麽就選擇有桌面的操作系統,因為我這裏主要是完成項目,所以就不選帶桌面系統的鏡像了。
? ? 官方系統鏡像界面的截圖:
3.燒制系統
??下載好之後,通過一個軟件“Win32DiskImager”,來燒錄系統,在Device選擇讀卡器顯示的外部設備,Image File選擇剛剛下載好,並且解壓完成的鏡像文件,然後點擊Write,進行寫入操作,因為我是最小化的鏡像系統,所以只需幾分鐘就完成系統的燒錄,你們稍等片刻,也就完成了。
??燒錄軟件截圖:
註意:一般情況下Raspbian系統是不帶有SSH遠程連接功能的,因此想要開啟功能,需要進入燒錄好的鏡像系統
文件當中(通過讀卡器),新建一個空白的文本文件,名為“ssh”,不需要改後綴,然後就可以進行下一步了
??插上網線,通過路由器可以得知分配給開始Raspbian的IP,然後通過SSH遠程登錄。
這裏需要註意的是,默認用戶是“pi”,密碼是“raspberry”,SSH遠程連接“ssh [email protected] ”,輸入密碼即可
??下面是以pi用戶連接樹莓派後的截圖:
4.更改默認登錄用戶
??一般情況下,我們都是以root用戶的身份去操作系統的,這樣權利更大,也更方便做一些普通用戶很難做到的事情,根據下面:
-
首先切換root用戶,激活root用戶的密碼配置選項:
pi@raspberrypi:~ $ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully -
然後解鎖root用戶:
pi@raspberrypi:~ $ sudo passwd --unlock root
passwd: password expiry information changed. -
最後切換root用戶:
pi@raspberrypi:~ $ su root
Password: - 但是由於Raspbian系統默認是以“pi”用戶登錄樹莓派的,也就是說即使上面激活了root用戶,也無法通過:“ssh [email protected]”去登陸,因此還需要進行下面操作。
進入文件:
vim /etc/systemd/system/getty.target.wants/getty\@tty1.service>找到: ExecStart=-/sbin/agetty --noclear %I $TERM
>改為: ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
??下圖為更改配置後的截圖:
5.配置鏡像源
??配置鏡像源,是為了方便後面部署各類軟件,解決依賴關系。
好在官方給出了軟件鏡像名單:
??http://www.raspbian.org/RaspbianMirrors
??這裏包括了世界各地的大學或者教育機構網站提供了Raspbian軟件鏡像,極大的方便了喜歡玩轉樹莓派的愛好者,我在其中節選了幾個大學提供的鏡像地址,供大家參考:
http://mirror.sysu.edu.cn/raspbian/raspbian 中山大學鏡像源(南方用戶)
http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ 清華大學鏡像源(北方用戶)
http://mirrors.ustc.edu.cn/raspbian/raspbian/ 中科大鏡像源(中部用戶)
http://mirrors.cqu.edu.cn/Raspbian/raspbian/ 重慶大學鏡像(中西部用戶)
??因為我離北京比較近,所以選擇了清華的鏡像源,速度快 穩定。
進入文件: vim /etc/apt/sources.list
>註釋其他語句,並且,加上下面的語句:
>deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian stretch main contrib non-free rpi- 要註意的是 : 配置上的源,後面有個“stretch”字段,它代表的是第九代Debian系統,其他字段的有:第七代系統“wheezy”,第八代系統“Jessie”,因為在Raspberry Pi的官網一般下載的都是最新的系統,並且這一代系統極大的擴展和發揮了Raspberry性能,因此建議安裝這個版本的系統。
??通過命令:“lsb_release -a” 可以看到系統的版本,所以務必配置鏡像文件之前,查一下系統版本哦。
這是我的系統版本:
6.配置無限路由(WiFi)
??Raspberry內置WiFi設備,因此只需要在網絡配置文件當中,把WiFi名稱和密碼寫進去,那麽每次啟動機器都會去讀取文件,自動連接WiFi。
- 找到文件並寫入: vim /etc/wpa_supplicant/wpa_supplicant.conf
>network={
ssid="WiFi名稱"
psk="WiFi密碼"
}
7.鍵盤布局配置
??由於Raspberry原產地為英國,因此鍵盤布局為英式鍵盤,許多鍵位都不一樣,因此需要更改鍵盤布局,首先執行下面兩個操作:
首先安裝輸入法配置,才可以更換鍵盤布局:
>apt install fcitx- 然後輸入:
>raspi-config
>>進入偽圖形化配置界面,選擇配置“keyboard layout”,選擇US鍵盤布局,保存後退出,重啟即可。
四、部署和應用GPIO庫
1.部署Pip和GPIO
??在Raspbian系統當中,為了Raspberry愛好者方便的自定義自己的板子,因此選擇原生支持了當今最主流的編程語言Python,無論是Python2,還是Python3都有安裝,為了方便的安裝GPIO庫,強烈建議先安裝pip工具,這個工具類似於apt和yum,可以自動解決安裝第三方庫時的依賴關系,非常好用。
??我將在下面使用Python3作為代碼執行的平臺,下面是包含的所有Python工具
安裝pip:
??apt install pip3
>註意:如果出現問題,顯示無法安裝,則使用下面命令:
>>apt-get install *pip -y通過pip安裝GPIO模塊:
??pip3 install gpio- 驗證GPIO模塊是否安裝成功並導入:
??#python3
??\>>>import RPi.GPIO as GPIO
??\>>>GPIO.setmode(GPIO.BOARD)*發現上述命令都沒有報錯,並且按下Table鍵,補全所有內置方法
特別註意:為什麽不是安裝RPi.GPIO???
RPi.GPIO庫是我在Raspberry官網上看到的支持I/O狀態讀取的一個庫,但是我按照網上很多博客上查的,執行安裝命令:“pip install RPi.GPIO”,總是報錯,要麽就是安裝成功以後會在“import ”這個模塊的時候,出現錯誤,很是費解,以為是版本的問題,發現自己安裝的是最新版本,但總是調不起來這個庫,我因此也沒有什麽好的解決方法,偶然發現,直接執行命令,安裝“pip installgpio”貌似是安裝了另一個版本的GPIO庫,並且是可以正常調用的,我在之後在Centos7虛擬機上做了測試,發現也是可以的,那麽我就選擇用“gpio”代替“RPi.GPIO”。
下面為是所有可用方法的截圖:
2.常用的GPIO用法
下面簡單介紹其中比較常用的GPIO用法:
1.導入GPIO模塊
import RPi.GPIO as GPIO
2.將GPIO引腳設置為BOARD模式
GPIO.setmode(GPIO.BOARD)
3.設置GPIO引腳通道 作為輸入
GPIO.setup(pin,GPIO.IN)
4.設置初始化為高電平
GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH)
5.軟件實現上/下拉:
GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
6.邊緣檢測,該函數是對一個引腳進行監聽
GPIO.add_event_detect(channel, GPIO.RISING)
7.清除所有資源
GPIO.cleanup()
下面給出Raspberry Pi的引腳圖:
??上面有個地方指出的:“GPIO引腳設置為BOARD模式”,這裏還有另一種定義引腳的方式,在RPi.GPIO中,同時支持樹莓派上的兩種GPIO引腳編號。第一種編號是BOARD編號,這和樹莓派電路板上的物理引腳編號相對應。使用這種編號的好處是:硬件將是一直可以使用的,而不用擔心樹莓派的版本問題。在更替版本或者系統的時候,不必重寫代碼。
??第二種編號是BCM規則,是更底層的工作方式,它和Broadcom的片上系統中信道編號相對應。在使用一個引腳時,用戶需要查找信道號和物理引腳編號之間的對應規則。對於不同的樹莓派版本,編寫的腳本文件也可能是無法通用的。
例如:上圖當中的“GPIO 16”和“36”號引腳就是指的同一個,而對應的前者就是通過BCM定義的,後者是通過“BOARD”定義的。
五、應用實踐
1.Raspberry Pi 和 MQ-2之間的連線
??在這裏需要知道的是,Python的GPIO庫只能接受引腳的高低電平的變化,因此只需要接線三個引腳就好:5V電源,地線,和DO接口,我選擇以“BOARD”規則定義引腳,也就是36號引腳連接MQ-2的DO口,認真對應上面給出的引腳圖,下面是我接好後的圖:
??MQ-2連線:
??Raspberry連線:
2.模塊測試
??接下來開始寫Python代碼,用於測試連線,以及模塊的功能是否完好,根據上面的介紹的簡答的幾個GPIO庫方法,以及簡單的邏輯,寫出如下代碼:
#! /usr/bin/env python3
import RPi.GPIO as GPIO # 導入庫,並進行別名的設置
import time
CHANNEL=36 # 確定引腳口。按照真實的位置確定
GPIO.setmode(GPIO.BOARD) # 選擇引腳系統,這裏我們選擇了BOARD
GPIO.setup(CHANNEL,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#初始化引腳,將36號引腳設置為輸入下拉電阻,因為在初始化的時候不確定的的引電平,因此這樣設置是用來保證精準,(但是也可以不寫“pull_up_down=GPIO.PUD_DOWN”)
# 帶有異常處理的主程序
try:
while True: # 執行一個while死循環
status=GPIO.input(CHANNEL) # 檢測36號引腳口的輸入高低電平狀態
#print(status) # 實時打印此時的電平狀態
if status == True: # 如果為高電平,說明MQ-2正常,並打印“OK”
print ( ‘ 正常 ‘ )
else: # 如果為低電平,說明MQ-2檢測到有害氣體,並打印“dangerous”
print ( ‘ 檢測到危險氣體 ! ! ! ‘ )
time.sleep(0.1) # 睡眠0.1秒,以後再執行while循環
except KeyboardInterrupt: # 異常處理,當檢測按下鍵盤的Ctrl+C,就會退出這個>腳本
GPIO.cleanup() # 清理運行完成後的殘余
- 開始執行程序:
\#chmod +x test.py \#./test.py
??然後會跳出"OK"的字樣,每0.1秒一次,當通過打火機的去伸到MQ-2報警器跟前時,就會彈出一個“DANGEROUS”,說明檢測到有害氣體了,下面放圖,我的實驗結果:
??說明模塊工作正常,可以檢測有害氣體,並且這個程序也是基本上沒有什麽問題的,後面需要停止的話,按下“Ctrl+C”停止腳本運作就好了。
註意
??在Python2當中,因為語法的變化,當腳本當中有中文的情況下,在開頭加上“# encoding=utf-8”;並且“print( )”方法是沒有括號的,只有引號,並且異常處理後面可能有語法也不一樣,需要讀者註意因。
??實際在後面結合Zabbix進行數據的監控和統計,是不需要輸出的,因此這裏只是為了效果直觀,而加進去“print( )”語句,為了達到目的,我後面會把它放在Cron計劃任務當中,在一開機的時候,就開始後臺執行這個程序,並且沒有輸出,但是會實時記錄引腳的高低電平。
??對於如何獲取到這個值,並以什麽方式進行存儲,在後面我會研究,這裏可能會遇到Zabbix的二次開發的問題。
??????????????????? --------Zabbix項目部分我會在後面幾個星期做好,未完待續.......
基於樹莓派(Raspberry Pi)平臺的MQ-2煙霧報警系統以及結合Zabbix監控的實現(一)