2017-07-18 15 views
1

。私は時間の文字列を表示している間、私は 'Sparkfun APDS9660ジェスチャーセンサー'から 'Up'ジェスチャーを検索する機能を使用しています。私が 'Up'ジェスチャーをしたら、ディスプレイをクリアして文字列 "camera"を表示したいと思います。タスクを完了している間に、「カメラ」機能(コード内)にとどまり、「時間」機能の表示に戻るためのダウンジェスチャーを行うまで、私はそれを望みます。リピート機能を

void handleGesture() { 
    if (apds.isGestureAvailable()) 
    { 
    if(DIR_UP) 
    { 
     Serial.println("UP"); 
     Serial.println("Camera"); 
     display.setTextSize(1); 
     display.setTextColor(WHITE); 
     display.setCursor(0,20); 
     display.println("Camera"); 
     display.display(); 
     Q = 0; 

     while(Q == 0) 
     { 
     if (DIR_RIGHT) 
     { 
      digitalWrite(13, HIGH); 
      delay(1000);    
      digitalWrite(13, LOW); 
      delay(1000); 
     } 

     if (DIR_LEFT) 
     { 
      digitalWrite(12, HIGH); 
      delay(1000);    
      digitalWrite(12, LOW); 
      delay(1000); 
     } 

     if (DIR_DOWN) 
     { 
      break; 
     } 
     } 
    } 
    } 
} 

私は 'whileループ'を使用してコードを繰り返し、次に 'break'を使用してコードを終了しようとしています。誰かがもっと良い解決策を知っていればコメントしてください。すべての返信の

+0

はまた、コードに基づいてアドバイスをhttp://forum.arduino.cc/index.php?topic=490075 – per1234

答えて

0

ため

おかげで私は、この特定のセンサを使用していないので、私はあなたが正しくジェスチャーを読んでいるかどうかについてはコメントすることはできません。

私はあなたがいると仮定します、とhandleGesture()ことをセンサーによって発生割り込みのイベントハンドラとして機能しています。ハンドラ内でwhilebreakよりも良い解決策は、あなたのプログラムがいくつかの明示的な状態(「カメラモード」と「時間モード」)の1つになるようにすることです。

ジェスチャハンドラはそれらを切り替えるだけで、実際のロジックはloop(またはモード固有の関数)になります。

これは、基本的にプログラムを状態マシンにします。例えば:それは明確に異なる機能が何をしているか分離(ハンドラはあなたのプログラムのモードを交換、ジェスチャーを処理)し、それが簡単に追加することができますので、

enum mode { 
    camera, 
    time 
}; 

mode currentMode; 

void loopCamera() { 
    // 'Camera mode' code goes here 
} 

void loopTime() { 
    // 'Time mode' code goes here 
} 

void setup() { 
    // Set initial mode 
    currentMode = time; 

    // Other setup follows... 
} 

void loop() { 
    switch (currentMode) { 
     case camera: 
      loopCamera(); 
      break; 
     case time: 
      loopTime(); 
      break; 
    } 
} 

void handleGesture() { 
    if (apds.isGestureAvailable()) { 
     if (DIR_UP) { 
      // Insert one-time code for switching to camera mode here 
      currentMode = camera; 
     } else if (DIR_DOWN) { 
      // Insert one-time code for switching to time mode here 
      currentMode = time; 
     } 
    } 
} 

これは、ハンドラ内で、あなたのプログラムロジックのすべてを置くことに好適です機能(モードなど)を将来的に提供します。

+0

@ Aidan.Thankあなたに尋ねました。私はそれを書いたが、それはまだ計画どおりに動作しません。私はそれが割り込みと関係があると推測しています。ピクチャとビデオのフラッシュは(スワイプされずに)繰り返され、分割された秒の時間が約1秒間消えて再び表示されます。私はまだ何か間違っています。 –

+0

私は答えにコードを入れます。なぜなら、それはコメントのために大きいからです。 –