找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2393|回復(fù): 0
收起左側(cè)

利用支持MicroPython的TPYBoard開發(fā)板自制PM2.5檢測(cè)儀

[復(fù)制鏈接]
ID:130183 發(fā)表于 2019-1-4 09:02 | 顯示全部樓層 |閱讀模式
    秋冬季節(jié),霧霾天氣的持續(xù),讓人們對(duì)空氣質(zhì)量的關(guān)注程度提升。而近期人們對(duì)于空氣質(zhì)量的關(guān)注總也繞不開一個(gè)詞——“PM2.5”!董h(huán)境空氣質(zhì)量標(biāo)準(zhǔn)》將PM2.5、臭氧(8小時(shí)濃度)納入常規(guī)空氣質(zhì)量評(píng)價(jià),是我國(guó)首次制定關(guān)于PM2.5的監(jiān)測(cè)標(biāo)準(zhǔn)。細(xì)顆粒物又稱細(xì)粒、細(xì)顆粒、PM2.5.細(xì)顆粒物指環(huán)境空氣中空氣動(dòng)力學(xué)當(dāng)量直徑小于等于 2.5 微米的顆粒物。PM2.5粒徑小、面積大、活性強(qiáng)、易附帶有毒、有害物質(zhì)(例如,重金屬、微生物等)。PM2.5對(duì)人體健康有著致命的危害。

    那么PM2.5(細(xì)顆粒物)是什么?

    因?yàn)楦鲊?guó)標(biāo)準(zhǔn)不一樣,天氣預(yù)報(bào)也報(bào)空氣質(zhì)量,預(yù)報(bào)的空氣質(zhì)量與實(shí)際的空氣質(zhì)量一樣嗎?但這個(gè)問題,想動(dòng)手制作一個(gè)PM2.5檢測(cè)儀,有了自己動(dòng)手制作的PM2.5檢測(cè)儀的話,當(dāng)空氣質(zhì)量較差或者嚴(yán)重污染的時(shí)候,提醒家人,同學(xué)和身邊的人盡量減少戶外活動(dòng),真正減少吸入細(xì)顆粒物。

    制作一個(gè)PM2.5檢測(cè)儀的想法是好,在1個(gè)小時(shí)內(nèi)能否制作出一個(gè)PM2.5檢測(cè)儀呢?利用C/C++是貼近硬件的語(yǔ)言來(lái)做的話,要花好長(zhǎng)一段時(shí)間甚至半年先學(xué)習(xí)C語(yǔ)言以后,再考慮動(dòng)手制作,更不用說(shuō)1個(gè)小時(shí)內(nèi)制作出一個(gè)PM2.5檢測(cè)儀。

    接下來(lái)我介紹一個(gè)在1個(gè)小時(shí)內(nèi)制作一個(gè)PM2.5的方法,也就是利用擁有自家的解析器、編譯器、虛擬機(jī)和類庫(kù)等,也就是具備二次開發(fā)和環(huán)境的TPYBoard開發(fā)板制作一個(gè)PM2.5檢測(cè)儀吧。


    1. PM2.5檢測(cè)儀的目的

    采用TPYBoard開發(fā)板為控制處理器,通過(guò)串口由PM2.5灰塵傳感器GP2Y1010AU0F檢測(cè)低程度的空氣污染PM2.5能夠甄別香煙和室內(nèi)/室外灰塵,并通過(guò)SPI接口由LCD5110顯示屏顯示當(dāng)前空氣粉塵濃度(ug/m?)。當(dāng)空氣中粉塵濃度達(dá)到所設(shè)定限度點(diǎn)亮不同的LED燈來(lái)知道當(dāng)前空氣質(zhì)量等級(jí)。

    本系統(tǒng)電路簡(jiǎn)單、工作穩(wěn)定、集成度高,調(diào)試方便,測(cè)試精度高,具有一定的實(shí)用價(jià)值。該檢測(cè)儀通過(guò)Python腳本語(yǔ)言實(shí)現(xiàn)硬件底層的訪問和控制細(xì)顆粒物檢測(cè)傳感器,每間隔一定時(shí)間,傳感器自動(dòng)進(jìn)行檢測(cè),檢測(cè)到的空氣粉塵濃度數(shù)據(jù)通過(guò)串口上傳至主控板,主控板收集到數(shù)據(jù)后,同樣使用Python腳本語(yǔ)言將PM2.5的檢測(cè)結(jié)果顯示到LCD5110上。


    參照1:TPYBoardLED亮燈狀態(tài)與 PM2.5日均濃度對(duì)應(yīng)的指數(shù)等級(jí)對(duì)應(yīng)表:

1.png


    參照2: TPYBoard的硬件特點(diǎn):

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

    制作PM2.5檢測(cè)儀所需材料如下:

    1.PM2.5粉塵傳感器1個(gè),檢測(cè)PM2.5(細(xì)顆粒物)傳感器,TXD串口輸出。
    2.TPYBoard開發(fā)板1塊,主要用來(lái)當(dāng)主控開發(fā)板,讀入傳感器數(shù)據(jù)。
    3.Lcd5110顯示屏1個(gè),主要用來(lái)顯示檢測(cè)的信息。
    4.杜邦線若干。
    5.數(shù)據(jù)線一條。

    3.硬件接線方法

    3.1 傳感器的針腳

    傳感器上一共六根線,從1到6依次是GND,VCC,NC,NC,RX,TX。其中我們只用三根線,電源(GND,VCC)和串口(TX),傳感器與TPYBorad接線參照?qǐng)D1,具體用哪個(gè)串口請(qǐng)參照官方網(wǎng)站上文檔TPYBoard 關(guān)于串口的使用,小編用的串口為  UART(2) is on: (TX, RX) = (X3, X4)  = (PA2,  PA3),因?yàn)橹恍枰獙?shù)據(jù)傳到PTYBoard,所以只用到RED即PTYBoard的X4引腳。

2.png

    3.2 LCD5110的針腳

    先看一下LCD5110針腳含義吧(注意:LCD5110的針腳有些不一樣的
    TPYBoard的針腳與5110的針腳對(duì)應(yīng)關(guān)系如圖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

    還是看不明白的話,直接上針腳編號(hào)吧

    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.png


    3.3 PM2.5檢測(cè)儀整體接線方法

    按照?qǐng)D1、圖2所示將PM2.5粉塵傳感器以及5110顯示屏與PTYBoard連接起來(lái),硬件連接完畢,如圖3:

4.png

    4.PM2.5粉塵傳感器工作原理及數(shù)據(jù)處理

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

    PM2.5粉塵傳感器的工作原理是根據(jù)光的散射原理來(lái)開發(fā)的,微粒和分子在光的照射下會(huì)產(chǎn)生光的散射現(xiàn)象,與此同時(shí),還吸收部分照射光的能量。


    當(dāng)一束平行單色光入射到被測(cè)顆粒場(chǎng)時(shí),會(huì)受到顆粒周圍散射和吸收的影響,光強(qiáng)將被衰減。如此一來(lái)便可求得入射光通過(guò)待測(cè)濃度場(chǎng)的相對(duì)衰減率。而相對(duì)衰減率的大小基本上能線性反應(yīng)待測(cè)場(chǎng)灰塵的相對(duì)濃度。光強(qiáng)的大小和經(jīng)光電轉(zhuǎn)換的電信號(hào)強(qiáng)弱成正比,通過(guò)測(cè)得電信號(hào)就可以求得相對(duì)衰減率,進(jìn)而就可以測(cè)定待測(cè)場(chǎng)里灰塵的濃度。在傳感器的中間有一個(gè)洞,這個(gè)洞可以讓空氣在里面流通。在洞的兩個(gè)邊緣 ,一面安裝有一個(gè)激光發(fā)射器,另一面安裝有激光接收器。這樣一來(lái),空氣流過(guò)這個(gè)小洞,空氣里的顆粒物呢就會(huì)擋住激光,從而產(chǎn)生散射,另一面的接收器,是依據(jù)接收到的激光強(qiáng)度來(lái)發(fā)出不同的信號(hào)的(其實(shí)就是輸出不同的電壓值)。這樣一來(lái),空氣里的顆粒物越多,輸出的電壓越高,顆粒物越少,輸出的電壓越低。


    內(nèi)部結(jié)構(gòu)如圖內(nèi)部結(jié)構(gòu)仿真圖所示:

5.png


    4.2 PM2.5粉塵傳感器傳感器數(shù)據(jù)處理

    上面說(shuō)了傳感器的原理,接下來(lái)就說(shuō)說(shuō)它傳出來(lái)的信號(hào)和對(duì)于接收到的信號(hào)的計(jì)算吧。

    這個(gè)傳感器的輸出數(shù)據(jù)是靠串口進(jìn)行傳輸?shù),傳感器?huì)通過(guò)串口每10ms不到(一般3~4ms)發(fā)送一個(gè)數(shù)據(jù),數(shù)據(jù)的類型大致是個(gè)“0X00”這樣的16進(jìn)制的數(shù)據(jù)。每次的數(shù)據(jù)會(huì)以“0XAA”作為起始端,以“0XFF”作為結(jié)束端。共7個(gè)數(shù)據(jù)位,7個(gè)數(shù)據(jù)位中包含了起始位,結(jié)束位,數(shù)據(jù)高位,數(shù)據(jù)低位,數(shù)據(jù)高校驗(yàn)位,數(shù)據(jù)低校驗(yàn)位和校驗(yàn)位(校驗(yàn)位是怎樣計(jì)算出來(lái)的,下面會(huì)講到)。數(shù)據(jù)格式大致如下:

6.png


    其中校驗(yàn)位長(zhǎng)度=Vout(H)+Vout(L)+Vref(H)+Vref(L)的長(zhǎng)度。

    數(shù)據(jù)的組成一共是有7個(gè)數(shù)據(jù)位,但是只有Vout(H)和Vout(L)這兩個(gè)數(shù)據(jù)才是我們真正所需要的。我們需要依照這兩個(gè)數(shù)據(jù)算出來(lái)串口輸出的數(shù)字?jǐn)?shù)據(jù),從而通過(guò)數(shù)模轉(zhuǎn)換公式來(lái)計(jì)算出輸出的電壓。進(jìn)一步的通過(guò)比例系數(shù)計(jì)算出空氣中顆粒物的數(shù)量。下面來(lái)說(shuō)一下怎么計(jì)算。

    傳感器輸出的數(shù)據(jù)分為高位和低位,其中呢Vout(H)為高位,Vout(L)為低位。因?yàn)榇趥鬟M(jìn)來(lái)的Vout(H)和Vout(L)是16進(jìn)制的,第一步先轉(zhuǎn)化成10進(jìn)制的(這個(gè)大家都會(huì),不多說(shuō)了)。然后根據(jù)這兩個(gè)輸出值的10進(jìn)制數(shù)計(jì)算出串口輸出數(shù)值的電壓。
    公式如下(其中Vout(H)和Vout(L)是已轉(zhuǎn)化為10進(jìn)制的):

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

    這樣就算出來(lái)了他輸出出來(lái)的電壓了,再根據(jù)比例系數(shù)A,就可以計(jì)算出空氣中的顆粒物的值了。(A的值一般是在800到1000,具體的數(shù)值還要根據(jù)你買到的傳感器的精度,準(zhǔn)確度和誤差值進(jìn)行確定。我現(xiàn)在用的是800。)

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

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

    PM2.5粉塵傳感器的采樣頻率是非常高的,一般3~4ms發(fā)送一個(gè)16進(jìn)制的采樣數(shù)據(jù),也就是說(shuō)傳感器通電(接通VCC和GND)后,每隔3~4ms發(fā)送一個(gè)16進(jìn)制的采樣數(shù)據(jù),這么高的采樣頻率作為一個(gè)檢測(cè)儀來(lái)說(shuō)顯然是沒有必要的。
    TPYBoard通過(guò)串口接收粉塵傳感器數(shù)據(jù),使用串口當(dāng)然先定義串口,通過(guò)打開就可以接收串口數(shù)據(jù),關(guān)閉串口就停止接收數(shù)據(jù)的特點(diǎn),來(lái)自由控制PM2.5粉塵傳感器的采樣頻率。


    5.2程序編碼

    我們main.py中,采用首先定義串口,其次是打開串口接收采樣數(shù)據(jù),最后關(guān)閉串口,并且處理采樣數(shù)據(jù)及顯示,依次循環(huán)。

    6.運(yùn)行測(cè)試

    接線ok后,導(dǎo)入font.py文件和upcd8544.py文件(主要用于5110顯示數(shù)據(jù)),再運(yùn)行main.py即可看到當(dāng)前的空氣質(zhì)量等級(jí)以及PM2.5的濃度值了。

    7.源代碼
    把我寫的程序的源碼分享給大家,有需要的可以參考一下。
  1. #main.py
  2. import pyb
  3. import upcd8544
  4. from machine import SPI,Pin
  5. from pyb import UART
  6. from ubinascii import hexlify
  7. from ubinascii import *

  8. #M0 = Pin('X1', Pin.OUT_PP)
  9. i=0
  10. K=1
  11. T=0
  12. E=0
  13. F=0
  14. W=0
  15. P=0
  16. L=0
  17. SHUCHU=0
  18. A=800#A比例系數(shù),在北方一般使用800-1000.南方空氣好一些,一般使用600-800.這個(gè)還和你使用的傳感器靈敏度有關(guān)的,需要自己測(cè)試再定下來(lái)。
  19. G=1024/5#G為固定系數(shù),是為了把串口收到的數(shù)據(jù)轉(zhuǎn)換成PM標(biāo)準(zhǔn)值。
  20. SHI=0#后面會(huì)賦值轉(zhuǎn)換成十進(jìn)制的數(shù)值。
  21. #*******************************主程序**********************************
  22. #pyb.delay(5000)
  23. SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
  24. #DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
  25. #CLK =>SPI(1).SCK  'X6' SPI clock
  26. RST    = pyb.Pin('Y10')
  27. CE     = pyb.Pin('Y11')
  28. DC     = pyb.Pin('Y9')
  29. LIGHT  = pyb.Pin('Y12')
  30. while True:
  31.     u2 = UART(2, 2400)
  32.     pyb.delay(1000)
  33.     #print('kaishi ')
  34.     u2.deinit()
  35.     pyb.delay(10)
  36.     if(u2.any()>0):
  37.         W=1
  38.         _dataRead=u2.readall()
  39.         #print('_dataRead=',_dataRead)
  40.         R=0
  41.         while (W>0):
  42.             #print('截取開始')
  43.             T=_dataRead[R]
  44.             if(T==170):
  45.                 E=R+1
  46.                 F=R+2
  47.                 #R=_dataRead[65]
  48.                 #print('十位=',_dataRead[E])
  49.                 #print('個(gè)位=',_dataRead[F])
  50.                 W=0
  51.             R=R+1
  52.         P=_dataRead[E]
  53.         L=_dataRead[F]
  54.         SHI=P*256+L#把串口收到的十六進(jìn)制數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制。
  55.         SHUCHU=SHI/G*A
  56.     if(SHUCHU<35):
  57.         Quality = 'Excellente'
  58.         print('環(huán)境質(zhì)量:優(yōu)','PM2.5=',SHUCHU)
  59.         pyb.LED(1).off()
  60.         pyb.LED(2).on()
  61.         pyb.LED(3).off()
  62.         pyb.LED(4).off()
  63.     elif(35<SHUCHU<75):
  64.         Quality = 'Good'
  65.         print('環(huán)境質(zhì)量:良好','PM2.5=',SHUCHU)
  66.         pyb.LED(1).off()
  67.         pyb.LED(2).on()
  68.         pyb.LED(3).off()
  69.         pyb.LED(4).off()
  70.     elif(75<SHUCHU<115):
  71.         Quality = 'Slightly-polluted'
  72.         print('環(huán)境質(zhì)量:輕度污染 ','PM2.5=',SHUCHU)
  73.         pyb.LED(1).off()
  74.         pyb.LED(2).off()
  75.         pyb.LED(3).on()
  76.         pyb.LED(4).off()
  77.     elif(115<SHUCHU<150):
  78.         Quality = 'Medium pollution'
  79.         print('環(huán)境質(zhì)量:中度污染 ','PM2.5=',SHUCHU)
  80.         pyb.LED(1).off()
  81.         pyb.LED(2).off()
  82.         pyb.LED(3).on()
  83.         pyb.LED(4).off()
  84.     elif(150<SHUCHU<250):
  85.         Quality = 'Heavy pollution'
  86.         print('環(huán)境質(zhì)量:重度污染 ','PM2.5=',SHUCHU)
  87.         pyb.LED(1).on()
  88.         pyb.LED(2).off()
  89.         pyb.LED(3).off()
  90.         pyb.LED(4).off()
  91.     elif(250<SHUCHU):
  92.         Quality = 'Serious pollution'
  93.         print('環(huán)境質(zhì)量:嚴(yán)重污染 ','PM2.5=',SHUCHU)
  94.         pyb.LED(1).on()
  95.         pyb.LED(2).off()
  96.         pyb.LED(3).on()
  97.         pyb.LED(4).off()
  98.     lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)
  99.     lcd_5110.lcd_write_string('AQI Level',0,0)
  100.     lcd_5110.lcd_write_string(str(Quality),0,1)
  101.     lcd_5110.lcd_write_string('PM2.5:',0,2)
  102.     lcd_5110.lcd_write_string(str(SHUCHU),0,3)
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表