有一段時間空污的問題被炒得很熱,感覺很像嚴重,雖然各地都有空污監測的設備,隨時上網就可以看到(https://waqi.info/tw/),以實作感測系統的角度來看,試著用 Arduino搭配 Sharp 的 GP2Y1010AU0F 灰塵感測器,來實作一下我們家室內的空氣品質如何?
從上面的採樣圖中我們可以看出,當曲線在輸出電壓為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函式庫的函式說明如下:
根據空氣品質指標計算空氣品質等級如下:
參考維基百科說明台灣空氣污染指標的級別:
[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℃
來源: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]
本實作需要安裝以下程式庫:- lixplor / arduino-GP2Y1010AU0F-lib
有關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條
[接線圖]
| GP2Y1010AU0F | Arduino UNO | 說明 |
|---|---|---|
| V-LED | VIN(5V) | LED供電(連接22uf電容跟150歐姆電阻) |
| LED-GND | GND | 接地 |
| LED | Pin5 | LED控制 |
| S-GND | GND | 傳感器接地 |
| V0 | A0 | 檢測結果電壓模擬量輸出 |
| VCC | VIN(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);
}




照著樓主的方式接了一台,可是顯示出來的數字卻很奇怪,不是0就是500,這有可能是甚麼問題?
回覆刪除線根程式全都是抄文章的,不過電阻因為找不到150歐姆的,所以用了100歐姆替代,這樣會差很多嗎?
電阻的影響不大。我用的 GP2Y1010AU0F是比較舊款的了,也請看一下型號跟規格是不是一樣?
刪除請問為甚麼我安裝完程式庫之後從arduino那邊開啟之後都顯示 你的草稿碼簿裡有個子目錄不是合法的程式庫
回覆刪除張貼留言