創作內容

29 GP

Arduino PM2.5 空氣品質偵測器實作

作者:貓貓風 ฅ●ω●ฅ│2018-09-13 14:30:39│巴幣:58│人氣:5230
.




















系統架構:

由MCU當Master   PMS5003T當 Slave ,持續詢問當前Sensor數值

最後再藉由 UART將數值傳輸至PC端





採用的偵測器型號為   PMS5003T G5T

---------------------------        功能介紹              ----------------------------------------------------------------
溫濕度和雷射式粉塵 PM2.5 二合一傳感器,攀藤 G5 的加強版, 攀藤 PMS5003T G5T  粉塵濃度感測器 是一款數字式通用顆粒物濃度傳感器,可以用於獲得單位體積內空氣中懸浮顆粒物的質量和數量,並以數字接口形式輸出。本傳感器可嵌入各種與空氣中懸浮顆粒物濃度相關的儀器儀表或環境改善設備,為其提供及時準確的濃度數據。

本傳感器採用激光散射原理。用激光照射在空氣中的懸浮顆粒物上產生散射,同時在某一特定角度收集散射光,得到散射光強隨時間變化的曲線。進而微處理器利用基於米氏(MIE )理論的算法,得出顆 粒物的等效粒徑及單位體積內不同粒徑的顆粒物數量。



PMS5003T 通訊格式

Header
  
Frame
  
PM1.0 CF=1
  
PM2.5 CF=1
  
PM10 CF=1
  
0x42
  
0x4D
  
2*13+2(DATA+CRC)
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
PM1.0 ATS
  
PM2.5 ATS
  
PM10 ATS
  
>0.3um微粒
  
>0.5um微粒
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
>1.0um微粒
  
>2.5um微粒
  
溫度
  
濕度
  
Other
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
Hi byte
  
Lo byte
  
版本
  
錯誤代碼
  
CRC
  
 
Hi byte
  
Lo byte
  
 
Note:
(1) 溫度 、 濕度 轉換完後數值需要除以10才是實際數值
(2) CRC計算方式為 從 Header 加到 濕度 Lo byte
(3)金屬顆粒物作為等效顆粒換算的濃度值,可作為工業生產車間等環境下的測試資料
    標定為@CF=1
(4) ATS: 為大氣環境下各項粒子的濃度

範例: 如果 PM 1.0 欄位取得的數值為 0x00 [Hi byte]  0x3C[Lo byte]

則接收端須將兩個byte轉換成整數 ,有兩種方式

MD1 => Lo byte | Hi byte << 8   (用OR運算來轉換)

MD2 => Lo byte + Hi byte * 256  

因此如果收到 0x00 0x3C 這組封包,經過上面提到的方法解析完後會變成 60

以下為 MCU 端代碼


  1. #include <SPI.h>    
  2. #include <Wire.h>     
  3.     
  4. #include <SoftwareSerial.h>    
  5. SoftwareSerial PMS(10, 11); // RX, TX    
  6.     
  7.     
  8. //PM2.5    
  9. long pmat10 = 0;    
  10. long pmat25 = 0;    
  11. long pmat100 = 0;    
  12. unsigned int temperature = 0;    
  13. unsigned int humandity = 0;    
  14.     
  15. void retrievepm25(){    
  16.   int count = 0;    
  17.   unsigned char c;    
  18.   unsigned char high;    
  19.   while (PMS.available()) {     
  20.     c = PMS.read();    
  21.     if((count==0 && c!=0x42) || (count==1 && c!=0x4d)){    
  22.       Serial.println("check failed");    
  23.       break;    
  24.     }    
  25.     if(count > 27){     
  26.       Serial.println("complete");    
  27.       break;    
  28.     }    
  29.      else if(count == 10 || count == 12 || count == 14 || count == 24 || count == 26    
  30.      || count == 16 || count == 18 || count == 20 || count == 22    
  31.      ) {    
  32.       high = c;    
  33.     }    
  34.     else if(count == 11){    
  35.       pmat10 = 256*high + c;    
  36.       Serial.print("PM1.0=");   
  37.       Serial.print(pmat10);   
  38.       Serial.println(" ug/m3");   
  39.     }    
  40.     else if(count == 13){    
  41.       pmat25 = 256*high + c;    
  42.       Serial.print("PM2.5=");   
  43.       Serial.print(pmat25);   
  44.       Serial.println(" ug/m3");     
  45.     }    
  46.     else if(count == 15){    
  47.       pmat100 = 256*high + c;    
  48.       Serial.print("PM10=");   
  49.       Serial.print(pmat100);   
  50.       Serial.println(" ug/m3");  
  51.     }    
  52.      else if(count == 17){    
  53.       int u03 = 256*high + c;    
  54.       Serial.print("PM10=");   
  55.       Serial.print(pmat100);   
  56.       Serial.println(" ug/m3");    
  57.     }    
  58.      else if(count == 19){    
  59.       int u05 = 256*high + c;    
  60.       Serial.print("PM10=");   
  61.       Serial.print(pmat100);   
  62.       Serial.println(" ug/m3");   
  63.     }    
  64.      else if(count == 21){    
  65.       int u10 = 256*high + c;    
  66.       Serial.print("PM10=");   
  67.       Serial.print(pmat100);   
  68.       Serial.println(" ug/m3");     
  69.     }    
  70.      else if(count == 23){    
  71.       int u25 = 256*high + c;    
  72.       Serial.print("PM10=");   
  73.       Serial.print(pmat100);   
  74.       Serial.println(" ug/m3");    
  75.     }    
  76.      else if(count == 25){            
  77.       temperature = (256*high + c)/10;     
  78.       Serial.print("Temp=");   
  79.       Serial.print(temperature);   
  80.       Serial.println(" (C)");   
  81.   
  82.     }    
  83.     else if(count == 27){                
  84.       humandity = (256*high + c)/10;    
  85.       Serial.print("Humidity=");   
  86.       Serial.print(humandity);   
  87.       Serial.println(" (%)");    
  88.     }       
  89.     count++;    
  90.   }    
  91.   while(PMS.available()) PMS.read();    
  92.   Serial.println();    
  93. }      
  94.   
  95. void setup() {    
  96.   Serial.begin(9600);    
  97.   PMS.begin(9600);    
  98. }    
  99.     
  100.     
  101.     
  102. void loop() {    
  103.   retrievepm25();    
  104.   delay(1000);    
  105.     
  106. }   

最後為將 MCU 端取得數值傳輸至PC呈現結果

主頁面:  即時呈現Sensor端取得的各項數值與連線狀態
         右半部為個數值在近20秒內的變化曲線





篩選頁面: 可以用來查找某段時間點內各項氣體濃度的變化狀態




點選 diagram 可以繪製及時圖像



設定頁面: 由於裝置連上每台PC所給定的Comport都不一樣
                 因此這邊設計成可供使用者依照目前連上的埠號,動態設定





指標頁面:  提供不同PM濃度對應到的指數與顏色


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4128498
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:涼涼風|arduino|C#

留言共 13 篇留言

貓兔子(っ・ω・)っ
厲害

09-13 16:20

貓貓風 ฅ●ω●ฅ
桑Q09-13 16:30
卡姆辛
雖然看不懂 但是好像很厲害[e28][e28][e28]

09-13 20:53

貓貓風 ฅ●ω●ฅ
事沒什麼難度@@ 跟其他Slave比起來 這都包裝的很好09-13 20:57
Fuwawa
你真的豪厲害 窩豪怕

09-13 21:46

貓貓風 ฅ●ω●ฅ
沒有很厲害啦 > _ <09-13 21:50
喵喵
看不懂,但是涼涼風好像很懂韌體,在相關的公司工作了?

09-13 22:25

貓貓風 ฅ●ω●ฅ
不太有相關 主要事做半導體生產設備的09-13 22:30
白金公主-馨梨
空氣品質...每當看到這問題我就希望空心菜提早下台

09-14 07:25

貓貓風 ฅ●ω●ฅ
最近某些地方常常都是紫色警報@@09-14 08:23
宇宙吃貨胖宅貓
這邊好專業喵.....

09-14 10:23

貓貓風 ฅ●ω●ฅ
對不起 嚇到你惹 OAO!?09-14 10:24
小刀
我猜高雄一定是紫色,貓貓風好厲害!

09-14 13:07

貓貓風 ฅ●ω●ฅ
下次帶去高雄測就知道XD09-14 13:47
珀伽索斯(Ama)
看到這些還真的覺得你好厲害XD

09-15 11:32

貓貓風 ฅ●ω●ฅ
[e1]09-17 18:48
重度百合控的緣~/銨銨
怕...看不懂~

09-15 21:39

貓貓風 ฅ●ω●ฅ
就 PM2.5偵測OAO09-17 18:48
蒼藍之戀
有辦法把數值顯示在LCD上面嗎?

12-27 14:28

貓貓風 ฅ●ω●ฅ
可以唷12-27 14:35
貓貓風 ฅ●ω●ฅ
接個LCD 把取得的值print在上面就可以12-27 14:37

您好,請問手機接收顯示是用Googleplay下載的APP嗎? 謝謝!

07-23 12:52

貓貓風 ฅ●ω●ฅ
目前是用自己寫的app, 當然也可以使用Play 商店的接受資料,不過要外接藍芽07-23 13:35
貓貓風 ฅ●ω●ฅ
我只有寫PC程式 手機我是抓 HC-05 terminal 你可以找看看07-23 22:11

了解,謝謝!
因為幫忙做學生環境教育也有DIY一個類似的PM2.5空氣盒子(拿別人現成的開放創作自購零件),目前用LCD顯示。想進階改用手機與Ardunio+BT來顯示,剛好搜尋到您也有這個創作,不知您的APP可否授權第三者使用。謝謝!

07-23 15:13


好的,謝謝!

07-23 22:47

我要留言提醒:您尚未登入,請先登入再留言

29喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:BOS無限制大賽 決賽優... 後一篇:Arduino SSD1...

追蹤私訊切換新版閱覽

作品資料夾

MoeTakoヾ(●゜▽゜●)♡
來一起陪雪糕畫畫喵✧◝(⁰▿⁰)◜✧看更多我要大聲說昨天20:24


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】