2016年8月20日 星期六

地震研究之Arduino端資料壓縮程式 - 最快取樣速度




程式修改為一開始先計算400ms內共可執行幾次sampling(),用來設定sampleCountLimit,然後在 loop() 中每隔sampleCountLimit次送出取樣的最大與最小值。實測Arduino效能,可在400ms內取樣1723次。




// 測量A0A1的空氣電壓
// 修改自地震預測研究所所長 林湧森 2016-07-28 04:29 UTC+8
// 修改者 : ghostyguo
// 使用最快取樣速度, 每隔400ms送出最大與最小值
// 修改時間 : 2016-08-20 22:30 UTC+8

int sampleCount;
int maxValue, minValue; //keep extreme value
int whoIsLast = 0; //-1=min, 1=max, 0=undefined;
int sampleCountLimit;

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

void SetupRunningParameters()
{
    // find sampleCountLimit in 400ms
    unsigned long startMicros=micros();
    startNewCycle();
    while (micros()-startMicros<400000L) {
        sampling();
    }
    sampleCountLimit = sampleCount;
    // uncomment the following lines to see the sampleCountLimit
    // Serial.print("#");
    // Serial.println(sampleCountLimit);
}

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

void loop()
{
    sampling();
    if (sampleCount>sampleCountLimit) {
        if (whoIsLast == -1) {
            Serial.println(maxValue);
            Serial.println(minValue);    
        } else if (whoIsLast == 1) {
            Serial.println(minValue);
            Serial.println(maxValue);     
        } else {
            Serial.println("Extreme Value Error");   
        }
        startNewCycle();
    }
}
void sampling()
{
    int sampleValue = analogRead(A0) - analogRead(A1);
    if (minValue > sampleValue) {
        minValue = sampleValue;
        whoIsLast = -1;
    }
    if (maxValue < sampleValue) {
        maxValue = sampleValue;
        whoIsLast = 1;
    }
    ++sampleCount;
}

沒有留言:

張貼留言