Arduino筆記(73):GP2Y1010AU0F 灰塵感測器檢測PM2.5

有一段時間空污的問題被炒得很熱,感覺很像嚴重,雖然各地都有空污監測的設備,隨時上網就可以看到(https://waqi.info/tw/),以實作感測系統的角度來看,試著用 Arduino搭配 Sharp 的 GP2Y1010AU0F 灰塵感測器,來實作一下我們家室內的空氣品質如何?


[SHARP灰塵/粉塵感測器 GP2Y1010AU0F]

GP2Y1010AU0F 是一款光學空氣品質感測器,設計用來檢測空氣中的塵埃粒子,其內部對角放著紅外線發光二極體和光電電晶體,能夠探測到空氣中塵埃反射光,即使非常細小的如煙草煙霧顆粒也能夠被檢測到,通常應用在空氣淨化系統中,可測量0.8微米以上的粒子,感知花粉、房屋粉塵等。該傳感器具有非常低的電流消耗(最大20mA,典型值11mA),輸出為類比電壓,其值與粉塵濃度成正比。GP2Y1010AU0F 特性如下:
  • 電源電壓:5~7V
  • 輸出電壓(無灰塵): 0.9V(TYP)
  • 工作溫度:-10~65攝氏度
  • 消耗電流:20mA最大
  • 最小粒子檢出值:0.8微米
  • 靈敏度:0.5V/(0.1mg/m3)
  • 清潔空氣中電壓:0.9V  典型值
  • 工作溫度:-10~65℃
根據夏普GP2Y1010AU0F空氣品質感測器datasheet中的採樣值曲線圖和電氣特性表所示,資料輸出電壓範圍在0~3.6v之間,檢測到的灰塵濃度為0~0.8mg/m3之間。如下圖:

來源:Sharp

從上面的採樣圖中我們可以看出,當曲線在輸出電壓為3.6v左右時,電壓變化趨緩,而灰塵濃度變化為0.5~0.8mg/m3。由於AQI指數中普遍將0.5mg/m3作為空氣污染的上限,所以我們將最高值定為0.5mg/m3,即輸出電壓為3.4v。當沒有灰塵時輸出的電壓最低為0v,最高為1.5v,典型值為0.9v。也就是說,我們可以認為當輸出電壓為0.9v 時灰塵濃度為 0mg/m3。依照上圖的電氣特性表其敏感度可以看出:灰塵濃度每增加0.1mg/m3,輸出電壓就會增加0.5v(按照典型值計算)。



[安裝GP2Y1010AU0F Library]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

有關GP2Y1010AU0F函式庫的函式說明如下:
  • double outputV = GP2Y1010AU0F.getOutputV();   //對空氣採樣並獲取輸出電壓
  • double ugm3 = GP2Y1010AU0F.getDustDensity(outputV); // 根據輸入電壓計算灰塵濃度(ug / m3)
  • double aqi = GP2Y1010AU0F.getAQI(ugm3);   //根據灰塵濃度計算空氣質量指數aqi(是將所有粒度的灰塵都按照PM2.5的指標計算的,並不準確)

根據空氣品質指標計算空氣品質等級如下:
  • GRADE_PERFECT:優
  • GRADE_GOOD:良
  • GRADE_POLLUTED_MILD:輕度污染
  • GRADE_POLLUTED_MEDIUM:中度污染
  • GRADE_POLLUTED_HEAVY:重度污染
  • GRADE_POLLUTED_SEVERE:嚴重污染

參考維基百科說明台灣空氣污染指標的級別:

[材料]

  • Arduino UNO  x 1
  • GP2Y1010AU0F  x 1
  • GP2Y1010AU0F 排線 x 1
  • 150歐姆電阻 x 1
  • 220uF 電容 x 1
  • 連接線 x n條

[接線圖]

GP2Y1010AU0FArduino UNO說明
V-LEDVIN(5V)LED供電(連接22uf電容跟150歐姆電阻)
LED-GNDGND接地
LEDPin5LED控制
S-GNDGND傳感器接地
V0A0檢測結果電壓模擬量輸出
VCCVIN(5V)供電


[程式]

#include <GP2Y1010AU0F.h>
#define PIN_LED 5
#define PIN_OUTPUT A0

GP2Y1010AU0F GP2Y1010AU0F(PIN_LED, PIN_OUTPUT);

void setup() {
  Serial.begin(115200);
}

void loop() {
  double outputV = GP2Y1010AU0F.getOutputV(); //採樣獲取輸出電壓
  double ugm3 = GP2Y1010AU0F.getDustDensity(outputV); //計算灰塵濃度
  double aqi = GP2Y1010AU0F.getAQI(ugm3); //計算aqi
  int gradeInfo = GP2Y1010AU0F.getGradeInfo(aqi); //計算級別
  String grade;
  switch (gradeInfo) {
    case GRADE_PERFECT:
      grade = String("GRADE_PERFECT");
      break;
    case GRADE_GOOD:
      grade = String("GRADE_GOOD");
      break;
    case GRADE_POLLUTED_MILD:
      grade = String("GRADE_POLLUTED_MILD");
      break;
    case GRADE_POLLUTED_MEDIUM:
      grade = String("GRADE_POLLUTED_MEDIUM");
      break;
    case GRADE_POLLUTED_HEAVY:
      grade = String("GRADE_POLLUTED_HEAVY");
      break;
    case GRADE_POLLUTED_SEVERE:
      grade = String("GRADE_POLLUTED_SEVERE");
      break;
  }
  //列印到監控視窗
  Serial.println(String("outputV=") + outputV + "\tug/m3=" + ugm3 + "\tAQI=" + aqi + "\tgrade=" + grade);

  //間隔
  delay(1000);
}


[執行結果]

下圖中電壓變化比較大是我對著感測器吹氣,揚起少數灰塵的結果:

[參考資料]

3 留言

  1. 照著樓主的方式接了一台,可是顯示出來的數字卻很奇怪,不是0就是500,這有可能是甚麼問題?
    線根程式全都是抄文章的,不過電阻因為找不到150歐姆的,所以用了100歐姆替代,這樣會差很多嗎?

    回覆刪除
    回覆
    1. 電阻的影響不大。我用的 GP2Y1010AU0F是比較舊款的了,也請看一下型號跟規格是不是一樣?

      刪除
  2. 請問為甚麼我安裝完程式庫之後從arduino那邊開啟之後都顯示 你的草稿碼簿裡有個子目錄不是合法的程式庫

    回覆刪除

張貼留言

較新的 較舊