智能家居入門DIY——【3、GP2Y10之顆粒物傳感器】

        這個傳感器接線算比較簡單的,程序也不麻煩。不過這東西是顆粒物傳感器吧,不是神馬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

好了,又能夠愉快的玩耍一個新玩具了……

相關文章
相關標籤/搜索