利用支持MicroPython的TPYBoard開發板自制PM2.5檢測儀(蘿蔔教育學科式編程)

秋冬季節,霧霾天氣的持續,讓人們對空氣質量的關注程度提高。而近期人們對於空氣質量的關注總也繞不開一個詞——「PM2.5」。《環境空氣質量標準》將PM2.五、臭氧(8小時濃度)歸入常規空氣質量評價,是我國首次制定關於PM2.5的監測標準。細顆粒物又稱細粒、細顆粒、PM2.5.細顆粒物指環境空氣中空氣動力學當量直徑小於等於 2.5 微米的顆粒物。PM2.5粒徑小、面積大、活性強、易附帶有毒、有害物質(例如,重金屬、微生物等)。PM2.5對人體健康有着致命的危害。蘿蔔教育學科式編程tpyboard。com編程

那麼PM2.5(細顆粒物)是什麼?學習

由於各國標準不同,天氣預報也報空氣質量,預報的空氣質量與實際的空氣質量同樣嗎?但這個問題,想動手製做一個PM2.5檢測儀,有了本身動手製做的PM2.5檢測儀的話,當空氣質量較差或者嚴重污染的時候,提醒家人,同窗和身邊的人儘可能減小戶外活動,真正減小吸入細顆粒物。測試

製做一個PM2.5檢測儀的想法是好,在1個小時內可否製做出一個PM2.5檢測儀呢?利用C/C++是貼近硬件的語言來作的話,要花好長一段時間甚至半年先學習C語言之後,再考慮動手製做,更不用說1個小時內製做出一個PM2.5檢測儀。網站

接下來我介紹一個在1個小時內製做一個PM2.5的方法,也就是利用擁有自家的解析器、編譯器、虛擬機和類庫等,也就是具有二次開發和環境的TPYBoard開發板製做一個PM2.5檢測儀吧。蘿蔔教育學科式編程tpyboard。com編碼


1. PM2.5檢測儀的目的spa

採用TPYBoard開發板爲控制處理器,經過串口由PM2.5灰塵傳感器GP2Y1010AU0F檢測低程度的空氣污染PM2.5可以甄別香菸和室內/室外灰塵,並經過SPI接口由LCD5110顯示屏顯示當前空氣粉塵濃度(ug/m?)。當空氣中粉塵濃度達到所設定限度點亮不一樣的LED燈來知道當前空氣質量等級。調試

本系統電路簡單、工做穩定、集成度高,調試方便,測試精度高,具備必定的實用價值。該檢測儀經過Python腳本語言實現硬件底層的訪問和控制細顆粒物檢測傳感器,每間隔必定時間,傳感器自動進行檢測,檢測到的空氣粉塵濃度數據經過串口上傳至主控板,主控板收集到數據後,一樣使用Python腳本語言將PM2.5的檢測結果顯示到LCD5110上。蘿蔔教育學科式編程tpyboard。comcode


參照1:TPYBoardLED亮燈狀態與 PM2.5日均濃度對應的指數等級對應表:orm

 

參照2: TPYBoard的硬件特色:blog

————————————————————————————
üSTM32F405RG MCU.
ü168 MHz Cortex-M4 CPU with 32-bit hardware floating point.
ü1 MiB flash storage, 192 KiB RAM.
üUSB口, 支持 串口,通用存儲,HID協議。
üSD卡插槽。
üMMA76603軸加速度計.
ü4 LEDs, 1復位按鈕, 1通用按鈕.
ü3.3V0.3A板載 LDO , 可從USB口或者外置電池供電。
ü實時時鐘。
ü30個通用IO口,其中28個支持5V輸入輸出。
ü2個 SPI接口, 2個 CAN接口, 2個I2C接口, 5個USART接口.
ü14個 12-bit ADC引腳。
ü2個DAC 引腳。
————————————————————————————
2. 材料準備

製做PM2.5檢測儀所需材料以下:

1.PM2.5粉塵傳感器1個,檢測PM2.5(細顆粒物)傳感器,TXD串口輸出。
2.TPYBoard開發板1塊,主要用來當主控開發板,讀入傳感器數據。
3.Lcd5110顯示屏1個,主要用來顯示檢測的信息。
4.杜邦線若干。
5.數據線一條。

3.硬件接線方法

3.1 傳感器的針腳

傳感器上一共六根線,從1到6依次是GND,VCC,NC,NC,RX,TX。其中咱們只用三根線,電源(GND,VCC)和串口(TX),傳感器與TPYBorad接線參照圖1,具體用哪一個串口請參照官方網站上文檔TPYBoard 關於串口的使用,小編用的串口爲 UART(2) is on: (TX, RX) = (X3, X4) = (PA2, PA3),由於只須要將數據傳到PTYBoard,因此只用到RED即PTYBoard的X4引腳。蘿蔔教育學科式編程tpyboard。com


3.2 LCD5110的針腳

先看一下LCD5110針腳含義吧(注意:LCD5110的針腳有些不同的
TPYBoard的針腳與5110的針腳對應關係如圖2:
TPYBoard?????? LCD5110??? memo
————————————————————————————
# any ? Pin???? => RST?????? Reset pin (0=reset, 1=normal)
# any ? Pin???? => CE??????? Chip Enable (0=listen for input, ? 1=ignore input)
# any ? Pin???? => DC??????? Data/Command (0=commands, 1=data)
# MOSI? ??????=> DIN?????? data flow (Master out, Slave in)
# SCK????????=> CLK?????? SPI clock
# 3V3 or any Pin ? => VCC?????? 3.3V logic voltage (0=off, 1=on)
# any Pin????? => LIGHT???? Light (0=on, 1=off)
# GND????????=> GND

仍是看不明白的話,直接上針腳編號吧

TPYBoard?????? LCD5110??? memo
————————————————————————————
Y10??????? => RST?????? Reset pin (0=reset, 1=normal)
Y11??????? => CE??????? Chip Enable (0=listen for input, 1=ignore input)
Y9 ???????? => DC??????? Data/Command (0=commands, 1=data)
X8??????? ? => DIN?????? data flow (Master out, Slave in)
X6 ???????? => CLK?????? SPI clock
VCC
Y12??????? => LIGHT???? Light (0=on, 1=off)
GND

 

3.3 PM2.5檢測儀總體接線方法

按照圖一、圖2所示將PM2.5粉塵傳感器以及5110顯示屏與PTYBoard鏈接起來,硬件鏈接完畢,如圖3:


4.PM2.5粉塵傳感器工做原理及數據處理

4.1 PM2.5粉塵傳感器工做原理

PM2.5粉塵傳感器的工做原理是根據光的散射原理來開發的,微粒和分子在光的照射下會產生光的散射現象,與此同時,還吸取部分照射光的能量。蘿蔔教育學科式編程tpyboard。com


當一束平行單色光入射到被測顆粒場時,會受到顆粒周圍散射和吸取的影響,光強將被衰減。如此一來即可求得入射光經過待測濃度場的相對衰減率。而相對衰減率的大小基本上能線性反應待測場灰塵的相對濃度。光強的大小和經光電轉換的電信號強弱成正比,經過測得電信號就能夠求得相對衰減率,進而就能夠測定待測場裏灰塵的濃度。在傳感器的中間有一個洞,這個洞可讓空氣在裏面流通。在洞的兩個邊緣 ,一面安裝有一個激光發射器,另外一面安裝有激光接收器。這樣一來,空氣流過這個小洞,空氣裏的顆粒物呢就會擋住激光,從而產生散射,另外一面的接收器,是依據接收到的激光強度來發出不一樣的信號的(其實就是輸出不一樣的電壓值)。這樣一來,空氣裏的顆粒物越多,輸出的電壓越高,顆粒物越少,輸出的電壓越低。蘿蔔教育學科式編程tpyboard。com


內部結構如圖內部結構仿真圖所示:

 

4.2 PM2.5粉塵傳感器傳感器數據處理

上面說了傳感器的原理,接下來就說說它傳出來的信號和對於接收到的信號的計算吧。

這個傳感器的輸出數據是靠串口進行傳輸的,傳感器會經過串口每10ms不到(通常3~4ms)發送一個數據,數據的類型大體是個「0X00」這樣的16進制的數據。每次的數據會以「0XAA」做爲起始端,以「0XFF」做爲結束端。共7個數據位,7個數據位中包含了起始位,結束位,數據高位,數據低位,數據高校驗位,數據低校驗位和校驗位(校驗位是怎樣計算出來的,下面會講到)。數據格式大體以下:

 

其中校驗位長度=Vout(H)+Vout(L)+Vref(H)+Vref(L)的長度。

數據的組成一共是有7個數據位,可是隻有Vout(H)和Vout(L)這兩個數據纔是咱們真正所須要的。咱們須要依照這兩個數據算出來串口輸出的數字數據,從而經過數模轉換公式來計算出輸出的電壓。進一步的經過比例係數計算出空氣中顆粒物的數量。下面來講一下怎麼計算。

傳感器輸出的數據分爲高位和低位,其中呢Vout(H)爲高位,Vout(L)爲低位。由於串口傳進來的Vout(H)和Vout(L)是16進制的,第一步先轉化成10進制的(這個你們都會,很少說了)。而後根據這兩個輸出值的10進制數計算出串口輸出數值的電壓。
公式以下(其中Vout(H)和Vout(L)是已轉化爲10進制的):

Vout=(Vout(H)*256+Vout(L))/1024*5

這樣就算出來了他輸出出來的電壓了,再根據比例係數A,就能夠計算出空氣中的顆粒物的值了。(A的值通常是在800到1000,具體的數值還要根據你買到的傳感器的精度,準確度和偏差值進行肯定。我如今用的是800。)

5.PM2.5粉塵傳感器的採樣頻率及程序編碼

5.1PM2.5粉塵傳感器的採樣頻率

PM2.5粉塵傳感器的採樣頻率是很是高的,通常3~4ms發送一個16進制的採樣數據,也就是說傳感器通電(接通VCC和GND)後,每隔3~4ms發送一個16進制的採樣數據,這麼高的採樣頻率做爲一個檢測儀來講顯然是沒有必要的。
TPYBoard經過串口接收粉塵傳感器數據,使用串口固然先定義串口,經過打開就能夠接收串口數據,關閉串口就中止接收數據的特色,來自由控制PM2.5粉塵傳感器的採樣頻率。蘿蔔教育學科式編程tpyboard。com


5.2程序編碼

咱們main.py中,採用首先定義串口,其次是打開串口接收採樣數據,最後關閉串口,而且處理採樣數據及顯示,依次循環。

6.運行測試

接線ok後,導入font.py文件和upcd8544.py文件(主要用於5110顯示數據),再運行main.py便可看到當前的空氣質量等級以及PM2.5的濃度值了。

7.源代碼
把我寫的程序的源碼分享給你們,有須要的能夠參考一下。

#main.py
import pyb
import upcd8544
from machine import SPI,Pin
from pyb import UART
from ubinascii import hexlify
from ubinascii import *

#M0 = Pin('X1', Pin.OUT_PP)
i=0
K=1
T=0
E=0
F=0
W=0
P=0
L=0
SHUCHU=0
A=800#A比例係數,在北方通常使用800-1000.南方空氣好一些,通常使用600-800.這個還和你使用的傳感器靈敏度有關的,須要本身測試再定下來。
G=1024/5#G爲固定係數,是爲了把串口收到的數據轉換成PM標準值。
SHI=0#後面會賦值轉換成十進制的數值。
#*******************************主程序**********************************
#pyb.delay(5000)
SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
#DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
#CLK =>SPI(1).SCK  'X6' SPI clock
RST    = pyb.Pin('Y10')
CE     = pyb.Pin('Y11')
DC     = pyb.Pin('Y9')
LIGHT  = pyb.Pin('Y12')
while True:
    u2 = UART(2, 2400)
    pyb.delay(1000)
    #print('kaishi ')
    u2.deinit()
    pyb.delay(10)
    if(u2.any()>0):
        W=1
        _dataRead=u2.readall()
        #print('_dataRead=',_dataRead)
        R=0
        while (W>0):
            #print('截取開始')
            T=_dataRead[R]
            if(T==170):
                E=R+1
                F=R+2
                #R=_dataRead[65]
                #print('十位=',_dataRead[E])
                #print('個位=',_dataRead[F])
                W=0
            R=R+1
        P=_dataRead[E]
        L=_dataRead[F]
        SHI=P*256+L#把串口收到的十六進制數據轉換成十進制。
        SHUCHU=SHI/G*A
    if(SHUCHU<35):
        Quality = 'Excellente'
        print('環境質量:優','PM2.5=',SHUCHU)
        pyb.LED(1).off()
        pyb.LED(2).on()
        pyb.LED(3).off()
        pyb.LED(4).off()
    elif(35<SHUCHU<75):
        Quality = 'Good'
        print('環境質量:良好','PM2.5=',SHUCHU)
        pyb.LED(1).off()
        pyb.LED(2).on()
        pyb.LED(3).off()
        pyb.LED(4).off()
    elif(75<SHUCHU<115):
        Quality = 'Slightly-polluted'
        print('環境質量:輕度污染 ','PM2.5=',SHUCHU)
        pyb.LED(1).off()
        pyb.LED(2).off()
        pyb.LED(3).on()
        pyb.LED(4).off()
    elif(115<SHUCHU<150):
        Quality = 'Medium pollution'
        print('環境質量:中度污染 ','PM2.5=',SHUCHU)
        pyb.LED(1).off()
        pyb.LED(2).off()
        pyb.LED(3).on()
        pyb.LED(4).off()
    elif(150<SHUCHU<250):
        Quality = 'Heavy pollution'
        print('環境質量:重度污染 ','PM2.5=',SHUCHU)
        pyb.LED(1).on()
        pyb.LED(2).off()
        pyb.LED(3).off()
        pyb.LED(4).off()
    elif(250<SHUCHU):
        Quality = 'Serious pollution'
        print('環境質量:嚴重污染 ','PM2.5=',SHUCHU)
        pyb.LED(1).on()
        pyb.LED(2).off()
        pyb.LED(3).on()
        pyb.LED(4).off()
    lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)
    lcd_5110.lcd_write_string('AQI Level',0,0)
    lcd_5110.lcd_write_string(str(Quality),0,1)
    lcd_5110.lcd_write_string('PM2.5:',0,2)
    lcd_5110.lcd_write_string(str(SHUCHU),0,3)
相關文章
相關標籤/搜索