2016年8月18日 星期四

地震研究之Arduino端資料壓縮程式




 為減少取樣遺漏重要資料 Arduino端取樣改為1000Hz,計算特定週期(目前設定400ms)內之極大極小值,送至PC端連接原本之processing繪圖程式,這兩筆資料為這400ms內的最大最小值, PC端繪圖可正確繪出振幅

本程式未來可延長Arduino端計算週期 (400ms延長至1min),可大幅降低PC端資料率,節省傳輸頻寬,並可直接將兩個極值送進SQL伺服器以透過網頁顯示,不會因電腦程式重啟而遺失重要資訊


// 2016-07-28 04:29 UTC+8
// 測量A0A1的空氣電壓, 修改自地震預測研究所所長林湧森程式。
// 2016-08-18 18:30 UTC+8 modified by ghostyguo
//


int sampleCount;        //Count for sampling
int maxValue, minValue;  //Keep extreme values
int whoIsLast = 0;       //-1=min, 1=max, 0=undefined;

void setup()
{
    Serial.begin(9600);
    startNewCycle();
}

void startNewCycle()
{
    maxValue = -10000; //12bit ADC < -1024
    minValue = 10000;  //12bit ADC > 1024
    whoIsLast = 0;
    sampleCount = 0;
}

void loop()
{
    int sampleValue = analogRead(A0) - analogRead(A1);
    if (minValue > sampleValue) {
        minValue = sampleValue;
        whoIsLast = -1;  //minValue is latestly update
    }
    if (maxValue < sampleValue) {
        maxValue = sampleValue;
        whoIsLast = 1;  //maxValue is latestly update
    }
    if (++sampleCount>400) { //400 samples
        if (whoIsLast == -1) {
            Serial.println(maxValue);  //send max then min
            Serial.println(minValue);    
        } else if (whoIsLast == 1) {
            Serial.println(minValue);  //send min then max
            Serial.println(maxValue);     
        } else {
            Serial.println("Extreme Value Error"); //Something wrong
        }
        startNewCycle();
    }
    delay(1); // sampling at 1000Hz
}

測試圖:

沒有留言:

張貼留言