2016-04-15 90 views
1

所以我開始混淆電容式傳感器,因爲它的一些非常酷的東西。計算傳感器數據(電容式傳感器)的平均值

我在網上關注了一些關於如何設置和使用Arduino的CapSense庫的教程,我剛剛對這段代碼寫了一個簡短的問題,我在這裏寫了這些代碼來獲取數據的平均值。

void loop() {      
    long AvrNum; 
    int counter = 0; 

    AvrNum += cs_4_2.capacitiveSensor(30); 
    counter++; 

    if (counter = 10) { 
    long AvrCap = AvrNum/10; 
    Serial.println(AvrCap); 
    counter = 0; 
    } 
} 

這是我的循環語句和串行它似乎是它的工作,但數字只是看起來對我來說可疑低。我正在使用一個10M電阻(棕色,黑色,黑色,綠色,棕色),並且正在觸摸發送和接收引腳連接到的一片金屬箔(電工膠帶),並且獲得約650個數字, 30.

基本上我問這段代碼是否看起來是正確的,如果這些數字有意義...?

+2

不,這是不對的。 'AvrNum'是未經初步處理的,因此導致未定義的行爲。 'counter = 10'應該是'counter == 10'。 – kaylum

+0

嚴格地說,代碼會更好''長AvrCap = AvrNum /計數器;' –

回答

1

語言中所使用的初始化Arduino環境實際上只是C++的一個非強制子集,隱藏在IDE提供的框架代碼中的main()函數。您的代碼是一個將被編譯並鏈接到框架的模塊。當框架開始運行時,它首先通過調用函數setup()來初始化自己,然後通過模塊進行初始化。一旦初始化,框架進入一個無限循環,在每次迭代時調用你的模塊功能loop()

您的代碼正在使用loop()中的局部變量,並期望它們將保持呼叫時的值。雖然這可能發生在實踐中(並且可能因爲框架的main()的那部分可能僅僅是while(1) loop();),但這是調用未定義行爲的惡魔。 C++沒有對未初始化變量的值作出任何承諾,甚至讀取它可能會導致發生任何事情。甚至顯然工作。

爲了解決這個問題,累加器AvrNumcounter必須存儲在loop()堆棧以外的某處。他們可以被宣佈爲static,或者被移到外面的模塊。外部是更好的恕我直言,特別是在受限制的Arduino環境。

您還需要在完成平均值後清除累加器。這是求平均值濾波器的最簡單形式,其中可以總結N個樣本的固定長度塊,然後使用每個第N個樣本的平均值。

我相信這個片段(未經測試)會爲你工作:

long AvrNum; 
int counter; 

void setup() { 
    AvrNum = 0; 
    counter = 0; 
} 

void loop() {      

    AvrNum += cs_4_2.capacitiveSensor(30); 
    counter++; 

    if (counter == 10) { 
    long AvrCap = AvrNum/10; 
    Serial.println(AvrCap); 
    counter = 0; 
    AvrNum = 0; 
    } 
} 

我提供了一個setup(),雖然它是多餘的C++語言的保證全局變量開始生活初始化爲0

+0

看起來像它的正確讀取一切!謝謝您的幫助。使用全局變量很有意義。我發現這個for循環的另一個解決方案,你能告訴我這個檢查出來....我把它作爲另一個答案... – KellysOnTop23

+0

是的,這是我的不好。我把它作爲答案發布,這很酷嗎? – KellysOnTop23

2

你的線路if (counter = 10)無效。它應該是if (counter == 10)

第一次設置爲10,當然會(當然)評估爲true。
計數器的第二個測試等於10,直到計數器,確實不會評價爲真,等於10

此外,kaylum提到的其他問題,沒有AvrNum

+0

好吧,除了初始化'AvrNum',我做了所有這些事情,因爲如果我初始化爲0,那麼它不會循環回去並刪除先前存儲的傳感器數據?我想平均得到大約十個讀數左右。 – KellysOnTop23

+0

初始化'AvrNum'是必需的。是的,你會失去你以前的數據 - 要解決這個問題,做'if((counter%10)== 0)'和'AvrCap = AvrNum/counter;') – KevinDTimm

0

這就是我花了一些時間後想出的結果。手動計算後,它會獲取所有數據。

long AvrArray [9]; 

     for(int x = 0; x <= 10; x++){ 
     if(x == 10){ 
      long AvrMes = (AvrArray[0] + AvrArray[1] + AvrArray[2] + AvrArray[3] + AvrArray[4] + AvrArray[5] + AvrArray[6] + AvrArray[7] + AvrArray[8] + AvrArray[9]); 
      long AvrCap = AvrMes/x; 
      Serial.print("\t"); 
      Serial.println(AvrCap); 
      x = 0; 
     } 

     AvrArray[x] = cs_4_2.capacitiveSensor(30); 
     Serial.println(AvrArray[x]); 

     delay(500); 
+0

這是嚴重破壞,值得自己的問題,以便它可以解剖和解釋爲什麼。你可以從這個問題鏈接到這個問題,這是通常的方法,後續問題最好在SO上處理。 – RBerteig

+0

嘿!我會在短短一秒鐘內完成 – KellysOnTop23