這個傳感器接線算比較簡單的,程序也不麻煩。不過這東西是顆粒物傳感器吧,不是神馬PM2.5(總懸浮顆粒物),不是神馬PM10(可吸入顆粒物)。插個螺絲刀進去度數也是變的,不是說的很清楚原理是反光嘛…………這個在弄的時候也狠狠的參照了官方文檔:git
1、連線:函數
藍V-LED:過150Ω電阻接5Vspa
綠LED-GND:接GNDcode
白LED:接一個用於你輸出週期信號的PIN(不是用PWM),我接的是3blog
黃S-GND:接GND文檔
黑VO:接一個模擬輸入PIN,我接的A0it
紅:VCC:接5Vio
在5V和GND之間接一個220μF的電容。class
2、程序:test
一、輸出週期信號:
官方文檔上說,這個東西須要的信號是10±1ms週期內0.32±0.02ms高電平。因此,能夠知道,最少須要9毫秒(9000-320),而剩下的2毫秒咱們假定各類write,delay函數以及其餘計算函數在2毫秒內能夠完成。因此,第一次延時爲320,第二次爲8680。
int ParticulateWork() { digitalWrite(ledPower, HIGH); delayMicroseconds(320); digitalWrite(ledPower, LOW); delayMicroseconds(8680); return analogRead(dustPin); }
二、讀取和計算:
double ParticulateTest(int testcount) { double result = 0.0; for (int i = 0; i < testcount; i++) { result += ParticulateWork(); } //取平均值並映射爲電壓。 result = result * VoMax / testcount / 1024 ; //if (result <= CalibrationVoltage) { // return 0.0; //}else{ // //將平均電壓帶入公式:(CalibrationVoltage爲無塵電壓,RatioK爲係數。) // result = (result - CalibrationVoltage) * 10.0 * RatioK * 1000; // return result; //} return result; }
先不要關注註釋掉的部分,也不要關注公式是怎麼來的——先來校準一下你的傳感器,沒有專業設備來校準這十幾塊的東西時,我是這樣作的:
堵住兩側的孔洞,調節傳感器孔洞右下角的電位器,觀察上面函數的輸出值(注意格式化輸出位數:Serial.println(ParticulateTest(10),6);),反正我是沒調節到0,調節到某一個範圍時,輸出值比較穩定了,此時,記錄輸出中的最小值,把這個值做爲無塵電壓。固然,這個值不是準確值,我也沒法獲得準確值,因此後面函數中還作了比較。
如今,關注一下注釋掉的部分,這公式就是一個顆粒物濃度和電壓的一次函數。我用VS寫代碼,因此選定它們以後,按下CTRL+K、CTRL+U取消註釋,如今再次運行代碼,你將獲得當前空氣中顆粒物濃度(微克每立方米),而後點上一顆煙,朝着檢測孔吹一下,(無論你笑沒笑,反正我是這麼幹的),輸出數值接近250,對你沒看錯就是二百五……無論你笑沒笑,若按照現行標準,151-200μg/m3已是重度污染,大於250就是嚴重污染。因此,我認爲這個公式仍是有必定的準確度的。
最後,解釋一下這個公式,它是我從官方文檔上扒下來的,這樣說是否是像頗有理有據了?那麼我來解釋一下這個道理:首先計算電壓偏移,而後*10,我不知道爲啥文檔上這麼寫的……而後*K,我也不知道爲啥是0.5,文檔上也是這麼寫的,只有最後一個1000我知道,由於測量單位是毫克每立方米把它換算成微克每立方米就要*1000。因此呢?道理解釋完了,頗有道理吧。其實,整體來講,10也好K也好都是一個係數,講道理應該是根據電路計算得來的,用來放大結果到符合客觀事實的。但不管如何,我以爲它符合個人要求,知道一口二手菸過來已經重度污染了這就能夠了。下面是個人蔘數:
double CalibrationVoltage = 0.003; //註釋掉換算部分實測得出的 double RatioK = 0.5; //官方文檔上扒下來的 double VoMax = 1.5; //官方文檔上扒下來的,實測1.47
好了,又能夠愉快的玩耍一個新玩具了……