有一段時間空污的問題被炒得很熱,感覺很像嚴重,雖然各地都有空污監測的設備,隨時上網就可以看到(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那邊開啟之後都顯示 你的草稿碼簿裡有個子目錄不是合法的程式庫
回覆刪除張貼留言