2016-04-15 14 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'はuninitalisedで使われるので、Undefined Behaviorになります。そして、 'counter = 10'は' counter == 10'でなければなりません。 – kaylum

+0

厳密に言うと、コードは 'long AvrCap = AvrNum/counter; 'の方が良いでしょう。 –

答えて

1

言語のない初期化を他の問題に言及しなくなるまで、真と評価されませんArduino環境は実際には、IDEによって提供されるフレームワークコードの中に隠されたmain()関数を持つC++の弱められたサブセットです。あなたのコードは、コンパイルされ、フレームワークにリンクされるモジュールです。フレームワークの実行が開始されると、関数setup()を呼び出すことによって、フレームワークが最初に初期化され、次にモジュールが初期化されます。初期化されると、フレームワークは無限ループに入り、各反復でモジュール関数loop()を呼び出します。

コードではloop()のローカル変数を使用しており、コールからコールへの値を保持することを期待しています。これは実際には起こるかもしれませんが(フレームワークのmain()の部分がおそらくちょうどwhile(1) loop();なので)、これは未定義の動作の悪魔を呼び出しています。 C++は初期化されていない変数の値についての約束をしておらず、それを読んでいても何かが起こる可能性があります。明らかに働いています。

これを修正するには、アキュムレータAvrNumcounterloop()のスタック以外の場所に保存する必要があります。彼らはstaticと宣言するか、外部に移動しました。外側は、特に制約の厳しいArduino環境で、より良いIMHOです。

また、アキュムレータをクリアする必要があります。これは、平均化フィルタの最も単純な形式です。ここでは、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; 
    } 
} 

これはグローバル変数が0

+0

正しく読んでいるように見えます!助けてくれてありがとう。グローバル変数を使用することは大変意味があります。私はこのループを使って別の解決法を見つけました。あなたが私にこのチェックアウトを教えてもらえますか?私は別の答えとしてそれを入れました... – KellysOnTop23

+0

うん、それは私の悪です。私は答えとしてそれを掲示した、それはクールですか? – KellysOnTop23

2

お客様の回線if (counter = 10)は無効です。 if (counter == 10)

最初の設定は10になり、(もちろん)真と評価されます。
10に等しいカウンタの第二テスト、カウンタは、実際に、10

に等しい。また、kaylumは、で使用AvrNum

+0

私は' AvrNum'を初期化する以外はすべて行いました。以前に格納されたセンサデータ?私は約10回程度の平均値を求めたかったのです。 – KellysOnTop23

+0

「AvrNum」を初期化する必要があります。はい、あなたは以前のデータを失うでしょう - その問題を解決するには 'if((カウンター%10)== 0)'と 'AvrCap = AvrNum/counter;') – KevinDTimm

0
に初期化生活を始めることをC++言語の保証と重複しているが、私は、 setup()を提供

これは私がそれにもう少し時間をかけた後にやって来ることです。いくつかの手作業による計算の後、すべてのデータを取得します。

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

Gotcha!私はちょうどその秒でそれをやるでしょう – KellysOnTop23

関連する問題