2017-12-04 6 views
0

私はこのゲームを(私の場合は)6人の隣同士のゲームである "停止"にしています。 1(knop1)、led 1が燃えると、ledが速く点滅し始めます。Arduinoのゲーム "Stop It"

私はそれを理解しました しかし、私はゲームを完全に停止するためにいつでも押すことができる必要がある第2ボタン(knop2)が必要ですが、私はこれに失敗し続けます。

この

はコードです...私は多くのことを試してみましたが、それらの一つ一つは、また やや複雑なコードを気の毒に失敗しました:

#define NOTE_E4 330   //Declareren van de noten 
    #define NOTE_G4 392 
    #define NOTE_A4 440 
    #define NOTE_0 000 
    //---------------------------------------------------------------------------------------------------------------------------------------- 
    int noten[] = {    //De noten 
    NOTE_E4, NOTE_G4, NOTE_A4, NOTE_E4, NOTE_A4 
    }; 
    //---------------------------------------------------------------------------------------------------------------------------------------- 
    int duur[] = {    //de duur van elke noot 
    225, 225, 950, 225, 925 
    }; 
    //---------------------------------------------------------------------------------------------------------------------------------------- 
    const int buzzer = 9;   //Hier staat de pin van de buzzer voor het lied 
    const int snelheid = 1.5; //Snelheid, een hoger getal laat alles trager gaan, een lager getal laat het sneller gaan 

    int led1 = 2; 
    int led2 = 3; 
    int led3 = 4; 
    int led4 = 5; 
    int led5 = 6; 
    int led6 = 7; 
    int gluid = 9; 
    int run = 0; 
    int knop = 12; 
    int knop2 = 11; 
    int n = 220; 

    //---------------------------------------------------------------------------------------------------------------------------------------- 

    void setup() {    
     pinMode(led1, OUTPUT); 
     pinMode(led2, OUTPUT); 
     pinMode(led3, OUTPUT); 
     pinMode(led4, OUTPUT); 
     pinMode(led5, OUTPUT); 
     pinMode(led6, OUTPUT); 
     pinMode(knop, INPUT_PULLUP); 
     Serial.begin(9600); 
     Serial.println("We shall begin. \n "); 
     delay(500); 
     for (int i=0;i<5;i++){    //5 staat voor het max aantal noten 
     int wacht = duur[i] * (snelheid * 0.9); 
     tone(buzzer,noten[i],wacht);   //tone(pin,frequentie,duur) 
     delay(wacht);}      //delay zorgt er hier voor dat de vorige noot niet word afgespeeld tijdens de vorige noot 
     delay(100); 
     Serial.println("Press the red button to start."); 
     Serial.println("You can press the black button any time to stop."); 
    } 

    //---------------------------------------------------------------------------------------------------------------------------------------- 

    void loop(){ 
     if (n <= 10) 
     { 
      n = 60; 
     } 

else if (n == 20) { 
Serial.begin(9600); 
Serial.println("You won! Congratz!"); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, HIGH); 
digitalWrite(led2, HIGH); 
digitalWrite(led1, HIGH); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, HIGH); 
digitalWrite(led2, HIGH); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, HIGH); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, LOW); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, LOW); 
digitalWrite(led4, LOW); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, LOW); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, HIGH); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, HIGH); 
digitalWrite(led2, HIGH); 
digitalWrite(led1, LOW); 
delay(150); 
digitalWrite(led6, HIGH); 
digitalWrite(led5, HIGH); 
digitalWrite(led4, HIGH); 
digitalWrite(led3, HIGH); 
digitalWrite(led2, HIGH); 
digitalWrite(led1, HIGH); 
delay(150); 
digitalWrite(led6, LOW); 
digitalWrite(led5, LOW); 
digitalWrite(led4, LOW); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
digitalWrite(buzzer, LOW); 
n = 10; 
digitalWrite(led6, LOW); 
digitalWrite(led5, LOW); 
digitalWrite(led4, LOW); 
digitalWrite(led3, LOW); 
digitalWrite(led2, LOW); 
digitalWrite(led1, LOW); 
digitalWrite(buzzer, LOW); 
digitalWrite(gluid, LOW); 
n = 220; 
delay(500); 
} 
else 
    if(digitalRead(knop) == LOW) 
    { 

    if(run == 0){  
     run = 255; 
     Serial.println("Next stage."); 
     n = n - 20; } 

    else{ 
     run = 0; 
     } 
     } 
    if(run > 0) 

    { 
    { 
     digitalWrite(led6, HIGH); 
     delay(n); 
     digitalWrite(led6, LOW); 
     delay(n); 
     tone(gluid, 700); 
    } 
    { 
     digitalWrite(led5, HIGH); 
     delay(n); 
     digitalWrite(led5, LOW); 
     delay(n); 
     tone(gluid, 900); 
    } 
    { 
     digitalWrite(led4, HIGH); 
     delay(n); 
     digitalWrite(led4, LOW); 
     delay(n); 
     tone(gluid, 700); 
    } 
    { 
     digitalWrite(led3, HIGH); 
     delay(n); 
     digitalWrite(led3, LOW); 
     delay(n); 
     tone(gluid, 900); 
    } 
    { 
     digitalWrite(led2, HIGH); 
     delay(n); 
     digitalWrite(led2, LOW); 
     delay(n); 
     tone(gluid, 700); 
    } 
    { 
     digitalWrite(led1, HIGH); 
     delay(n); 
     digitalWrite(led1, LOW); 
     delay(n); 
     tone(gluid, 600); 
    }  
    } 
} 
+0

「遅延」は使用しないでください。 –

+0

ミリスやマイクロを使うべきですか? –

答えて

1

キーがにあるにあなたのコードを再編成状態機械。 loop()が繰り返し呼び出されることを忘れないでください。それが呼び出されるたびに、ゲームの現在の状態が何であるかを確認し、入力に応じて次の状態に戻って戻ります。

説明するために、私ははるかに単純なゲームを使用します。停止ボタンが押されるまで、スタートボタンを押して1つのLEDを点滅させます。あなたはloop()への各呼び出しで(ほぼ)すべてをやろうという点で

// The WRONG WAY 
void loop() { 
    while (digitalRead(knop1) == HIGH) {} // wait for start button 
    while (digitalRead(knop2) == HIGH) { 
     digitalWrite(led1, HIGH); 
     delay(250); 
     digitalWrite(led1, LOW); 
     delay(250); 
    } 
} 

上記のコードは、あなたのコードのようなものです。これにより、入力を監視することが難しくなります。たとえば、点滅サイクルが完了するたびに停止ボタンを確認する方法に注意してください。これは、応答時間があまり良くない可能性があることを意味します(実際に、ユーザーがボタンをすばやく押して離した場合は、完全に見逃す可能性があります)。

ステートマシンのアプローチでは、1つまたは2つのグローバル変数を使用して、ゲームの現在の状況を把握しています。それぞれの点で、状態と入力をチェックして、状態を変更する必要があるかどうかを判断します。

// The BETTER WAY 
enum { stopped, blink_on, blink_off } state = stopped; 
unsigned long target = 0; 

void loop() { 
    switch (state) { 
     case stopped: 
      if (digitalRead(knop1) == LOW) { 
       digitalWrite(led1, HIGH); 
       state = blink_on; 
       target = millis() + 250; 
      } 
      break; 
     case blink_on: 
      if (digitalRead(knop2) == LOW) { 
       digitalWrite(led1, LOW); 
       state = stopped; 
      } else if (millis() >= target) { 
       digitalWrite(led1, LOW); 
       state = blink_off; 
       target = millis() + 250; 
      } 
      break; 
     case blink_off: 
      if (digitalRead(knop2) == LOW) { 
       state = stopped; 
      } else if (millis() >= target) { 
       digitalWrite(led1, HIGH); 
       state = blink_on; 
       target = millis() + 250; 
      } 
      break; 
    } 
} 

ステートマシンコードを整理する他の方法もありますが、基本的には同等です。たとえば、状態を確認する前に入力を確認することができます。トランジションを除外して重複したコードを排除することもできます。私はこのサンプルでこれらのことを行っていません。一般的に状態マシンがどのように機能するかを明確にしたいからです。

コードをステートマシンとして編成したら、いつでもすべての入力に応答するのが比較的簡単です。

+0

Hmmありがとう、私はこれを見ていますが、これまでのところ望みの結果ではありません –

+0

実験の後、私は最初のボタンをもう一度押す(knop1)場合を除き、 'case stopped'はループを続けることはありません。 そして、led6が点灯しているときにボタンを押してスピードゥンをやろうとすると、どちらもうまくいきません。本当にばかげて聞こえたら、ごめんなさいxD これはちょっと新鮮です –