2013年12月10日 星期二

Arduino動手做 - 利用GP2Y1010AU0F偵測空氣懸浮微粒汙染PM2.5

近年來,懸浮微粒在空氣汙染的影響上越來越不容忽視

其造成的霧霾天氣不僅讓交通受影響,亦讓許多對空氣品質敏感的過敏患者深受其害

我就是其中一員...

家裡一直都有使用空氣濾淨機

但是這種看不到摸不到的空氣品質難以評估成效或是決定何時該開啟濾淨機

於是找到了這個好東西 ......
 Sharp GP2Y1010AU0F  ,    點我看datasheet

利用LED光源去偵測空氣中懸浮微粒,算是個粗略估計的方法,不會太精確

不過優點就是成本比雷射式的便宜很多


原廠datasheet的電路圖:



腳位的接法如下




接著程式碼的部分是拾人牙慧,並做點修改
int measurePin = 0; //Connect dust sensor to Arduino A0 pin
int ledPower = 2;   //Connect 3 led driver pins of dust sensor to Arduino D2
  
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
  
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
  
void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);
}
  
void loop(){
  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);
  
  voMeasured = analogRead(measurePin); // read the dust value
  
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);
  
  // 0 - 5V mapped to 0 - 1023 integer values
  // recover voltage
  calcVoltage = voMeasured * (5.0 / 1024.0);
  
  // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
  // Chris Nafis (c) 2012
  dustDensity = 0.17 * calcVoltage - 0.1;
  
  Serial.print("Raw Signal Value (0-1023): ");
  Serial.print(voMeasured);
  
  Serial.print(" - Voltage: ");
  Serial.print(calcVoltage);
  
  Serial.print(" - Dust Density: ");
  Serial.print(dustDensity * 1000); // 這裡將數值呈現改成較常用的單位( ug/m3 )
  Serial.println(" ug/m3 ");
  delay(1000);
}



接著上載至arduino就可以在serial monitor看到即時的空氣中懸浮微粒的狀況

若再搭配wifi晶片將數據傳送至Xively就可以像這樣紀錄呈現

Xively的使用方法之後會再寫一篇教學

然後這是同時間氣象局的資料


其實相似度挺高的,當天傍晚懸浮微粒隨著東北季風增強而移入台灣

數值馬上就很明顯的飆高

如果能主動通知至行動裝置達到預警效果就更棒了...找時間再研究研究



20150207update: 

後來因為xively對免費使用者的限制提高所以改成使用開源的thingspeak

簡單的上傳資料呈現範例可以看這篇

Arduno動手做 - 使用Ds18b20監測冰箱溫度並自動上傳數據

然後最近把這感測器裝在arduino nano上發現偶爾會有一些類似雜訊的peak
目前還搞不清楚是arduino問題, 程式問題 or 電路設計問題(因為電路上還有其他元件)
不過我想再arduino程式碼加入篩選雜訊數據的應該可以簡單解決,有更新會再來分享

另外,有網友熱心分享才知道原來sharp這系列已經出了新款GP2Y1050AU0F
所以接法不同看了datasheet是內建MCU的,輸出似乎會比較精確
有機會入手再來試試

2016/11/26 更新
發現還有網友持續在關心這款感測器,在這邊要給個忠顧,請對感測懸浮微粒有興趣的朋友們改用G3感測器(PMS3003),或其系列產品,因為雷射技術為基礎的感測器才能真正準確的感測出特定粒徑之懸浮微粒,且幾乎不需要校正即可使用,我在後續的感測專案都已經放棄本文介紹的GP2Y系列感測器了。

34 則留言:

  1. 我看過這款sensor的datasheet內容並無標示可測得最小微粒子的直徑,不知道為何大家可以假設這款GP2Y1050AU0F能測得2.5um的微粒子呢?

    回覆刪除
    回覆
    1. 因為有人實際和校正過的儀器做過mapping
      本篇電壓-粒徑轉換公式也是從此而來
      可以參考這裡
      http://www.howmuchsnow.com/arduino/airquality/

      這種利用顆粒反射光原理的感測極限在於總訊號的最低靈敏度且幾乎無法分辨粒徑的訊號差異

      刪除
    2. 您好想向您請教一些問題
      參考您的程式,因為礙於需求,程式每次只會執行一次,但第一次輸出結果都會有誤差(濃度值為100ug/m3左右浮動)
      第二次以後執行的結果較為穩定(濃度值為15~18ug/m3左右)
      請問該如何解決執行誤差的問題?

      刪除
  2. 你好:

    不好意思想在請問一下,看完版主貼的參考文章後,還是有點不太懂為什麼公式是電壓-粒徑,而不是電壓-濃度(PM10、PM2.5...)?

    回覆刪除
    回覆
    1. 您好,您可能誤會了圖的表示
      那篇參考文章提供的公式就是電壓/濃度喔 [ volts/dust density(mg/m^3) ]

      刪除
  3. 你好:

    謝謝!! 瞭解了,但還有一些問題想請教,我也是在南港使用這顆sensor,但是打電話問過Sharp的銷售員這顆sensor所測量的是總
    懸浮微粒(TSP),也就是包含PM10、PM2.5等等,而測量出來的結果跟氣象站所提供的PM2.5、PM10相比,
    1.發現只跟PM2.5的圖形相似,與PM10的圖形有點差距
    2.如果是測量TSP的話那測量數值不是應該會比PM2.5以及PM10加起來還高嗎?
    3.想請問一下除了純粹GP2Y1010au0f的電路外,版主還有外加甚麼其他的電路嗎?
    4.版主是將此sensor放置在戶外還是室內?

    謝謝!!

    (PS.1. 我是將sensor放置在室內的窗戶邊,窗戶都有開著,sensor上還有安裝一個25*25*10mm的小風扇,電路也是按照版主的圖接的,測
    量時也有用TSI的PM2.5專業儀器同時測量,雖然結果圖走勢差不多,但是數值差距非常大,不知道是哪裡有問題。
    2.我還是學生,很多東西都還不懂,非常不好意思又打擾了!! )

    回覆刪除
    回覆
    1. 是的,這顆感測器無法分辨粒徑,所以測得的訊號是代表總懸浮微粒的量
      但由於PM2.5的滯空能力會比大粒徑的懸浮微粒來得強
      所以在大範圍的區域中PM2.5的值大家測起來的趨勢會比較一致

      至於訊號水準誤差的問題,我只能坦白說這感測器比較陽春
      所以如果你手上有更專業的儀器就可以自行再做公式校正

      我的sensor主要都是放在室內,但經驗上只要有開窗,甚至非氣密窗即使關著
      室內外PM2.5的值其實不會差很多

      我也不是學電子資訊的,純粹是有興趣研究了一點,互相交流經驗也不錯!

      刪除
  4. 要怎麼用測得的數據結合LED燈 數據愈高LED燈亮愈多這樣

    回覆刪除
    回覆
    1. 提供個簡單的想法給您參考嘍

      首先決定亮燈數量的區間
      譬如pm測得的數值在10以下亮一個燈,100以上五個燈之類的幾組區間
      然後就寫一個判斷式去判斷測得的數值是落在哪個區間
      這可以用if或是switch做到
      同時也就可以用這判斷式觸發符合條件後的動作去控制LED(哪幾顆LED要亮要滅)

      刪除
  5. 因為自己的成品偵測結果會因組裝線路,套件的版本而有所不同,
    例如Uno改成Mini, 用Chris的公式來計算
    後者的空氣品質高了50ug/M3.
    於是上網來找資料發現另一位高手的心得:
    http://www.xlgps.com/article/294254.html

    看來還是得找一台高精度的來抓補正值,
    否則得到的值就只能看趨勢,不能盡信了.

    回覆刪除
  6. 不好意思打擾了
    上文是不是有打錯?!
    dustDensity = 0.17 * calcVoltage - 0.1;
    >>dustDensity = 0.17 * calcVoltage - 0.01;
    他們提供的圖表是在0下面不到0.1
    所以應該要改成0.01吧??
    我是一個高職生
    有錯還請多多指教^_^
    謝謝

    回覆刪除
    回覆
    1. 原點的地方x軸不是0是0.5唷! 你是因此看錯嗎?
      x數值帶0進去的話y是等於-0.1沒錯的!

      刪除
  7. http://www.howmuchsnow.com/arduino/airquality/
    這是程式裡面提供的網址
    鍋子下面的圖表是畫在0.01的地方
    而不是0.1

    回覆刪除
    回覆
    1. 我就假設你跟樓上是同一人了XD 再回一次一樣的內容~
      原點的地方x軸不是0是0.5唷! 你是因此看錯嗎?
      x數值帶0進去的話y是等於-0.1沒錯的!

      刪除
  8. 不好意思 我全部的東西都按照上面的接 可是最後http://www.howmuchsnow.com/arduino/airquality/的數據為什麼跑不出來呢?

    回覆刪除
    回覆
    1. 請問可以把問題敘述得更詳細嗎? 是指arduino ide 的serial monitor上沒有數據嗎?

      刪除
  9. 作者已經移除這則留言。

    回覆刪除
  10. 不好意思,我按照上面的做法,但出來的值卻是負值?
    Raw Signal Value (0-1023): 10.00 - Voltage: 0.05 - Dust Density: -91.70 ug/m3

    回覆刪除
    回覆
    1. 從你的raw data來看確實是太低的電壓值,建議檢查一下接線
      也可以伸個東西進去感測孔內測試測值是否會跟著變化

      刪除
  11. 你好 我剛接觸這個東西 我想了解一下dustDensity = 0.17 * calcVoltage - 0.1; 當中的0.17是怎麼計算的?

    回覆刪除
    回覆
    1. 是搭配比較精確的儀器同時偵測出來的數值去做線性校正所得公式斜率和截距
      每台gp2y101都可以這樣個別做一個校正公式

      刪除
  12. 你好,我未點煙時voMeasured測出來為0,點煙時測出來的值為756,但因為公式有減0.1,所以最後的結果未點煙時為-0.1,請問這樣子是正常的嗎?因為我看datasheet,應該會有一個初始的電壓,也就是說未點煙時voMeasured的值不應該為0才對。

    回覆刪除
    回覆
    1. 這代表你的GP2Y感測器預設電阻值與當初設計標準公式的那台GP2Y不同,這代表你就需要先有一台精確的機器對照才能重新設計你的感測器公式,本文末已有更新,若真的需要做懸浮微粒相關感測,建議改用雷射技術的感測器取代之。

      刪除
  13. 不好意思請問最後為什麼是負的??

    Raw Signal Value (0-1023): 86.00 - Voltage: 0.42 - Dust Density: -28.61 ug/m3



    我們有測試過感應孔伸東西進去值是有反應

    不知道問題出在哪....

    麻煩老師解答^^

    回覆刪除
    回覆
    1. 這代表你的GP2Y感測器預設電阻值與當初設計標準公式的那台GP2Y不同,這代表你就需要先有一台精確的機器對照才能重新設計你的感測器公式,本文末已有更新,若真的需要做懸浮微粒相關感測,建議改用雷射技術的感測器取代之。

      刪除
    2. 好的,感謝老師的解答!!

      刪除
  14. 你好!我的資料出來的時候也常是負值
    Raw Signal Value (0-1023): 26.00 - Voltage: 0.13 - Dust Density: -78.42 ug/m3
    我也看過上面老師您回復有關此問題的答案
    說是有關電壓過低的問題
    那是否可以藉更改公式來解決問題?
    抑或是必須要改成雷射技術的感測器呢?
    因為目前有經費問題所以才想說想是否可以不要更改感測器
    麻煩老師了!><

    回覆刪除
    回覆
    1. 你可以先觀察他的反應特性是不是跟實際懸浮微粒濃度有相關,如果是的話代表就是要重新校正公式沒錯,但這樣你還是得至少有一台雷射的感測器作為標準才行。 老實說目前實在不是很建議繼續使用這款感測器了。

      刪除
  15. 作者已經移除這則留言。

    回覆刪除
  16. 您好:
    不好意思打擾了~~ 最近我們要辦一個有關PM2.5 的環境教育活動。
    對您的DIY PM2.5 檢測器非常有興趣,想邀請您來教學,請問您有聯絡的email嗎?
    謝謝!

    回覆刪除
  17. 您好
    不好意思想請教您,我安裝了gp2y1014之後數值一直偏高於附近空氣盒子的數值,請問該如何調整參數呢?

    回覆刪除
  18. 我使用的數據怎麼都是200-300呢,哪裡有問題,可以幫我解說一下嗎?
    (零件有:arduino uno*1、及SHEEP空氣監測器*1、小電線等......)
    還是SHEEP空氣監測器放置的位置或方向)我是放在室內

    回覆刪除
  19. 您好:
    我想請問有沒有gp2y1014搭配樹莓派製作出來的實體實驗與代碼

    回覆刪除