1. 程式人生 > >基於樹莓派(Raspberry Pi)平臺的MQ-2煙霧報警系統以及結合Zabbix監控的實現(一)

基於樹莓派(Raspberry Pi)平臺的MQ-2煙霧報警系統以及結合Zabbix監控的實現(一)

Raspberry Pi Zabbix和嵌入式系統的結合 Python3 樹莓派和MQ-2氣體檢測

一、前期準備




達成目標:

  利用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系統,這是兩款對樹莓派支持性最好的系統,並且在國內也有鏡像源,對於一個開發板來說,這是可能是最重要的。

? ?我個人強烈推薦Raspbian系統,它本身的命令其實和服務器端的Debian操作命令相同,但是更大的優點在於:國內有諸多知名大學網站都有Raspbian系統鏡像源,很是方便;因為開始我玩兒的是Centos系列的操作系統,比較熟悉命令以及其他配置方式,並且在Centos的官方網站也有專門為Raspberry Pi開發的基於Arm架構的系統鏡像,但是安裝完你會發現,鏡像源很是不方便 0.0。

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監控的實現(一)