2017-11-08 5 views
1

何もオンにしないでプログラムを開始できるようにするには、ボタンを一度押すと赤に変わり、もう一度押すと切り替えます緑色にしてもう一度押すと、青色に変わります。あなたがボタンをもう一度押すと、それがオフになるはずです。RGBダイオードの1つのボタンスイッチ段を作ります

ここでは私が取り組んできたことはありますが、失敗するようです。
初めてボタンを押すと常に赤色になり、もう一度押すと何も起こりません。ボタンをスパムし続けると、すべての色がランダムに切り替わりますが、決して消灯しません。

void loop() { 
    int toRed = digitalRead(button); 
    if (toRed == HIGH){ 
    switchtoRed(); 
    delay(250); // Give you time to take your finger off the button. 
    int toGreen = digitalRead(button); 
    if (toGreen == HIGH) { 
     switchtoGreen(); 
     delay(250); 
     int toBlue = digitalRead(button); 
     if (toBlue == HIGH) { 
     switchtoBlue(); 
     delay(250); 
     int state = digitalRead(button); 
     if (state == HIGH) { 
      return; 
     } 
     } 
    } 
    } 
} 
+0

*役に立たない問題記述ではないようです。それはどのように*失敗*するのですか? –

+0

悪い説明を申し訳ありませんが、編集がその説明に役立つことを願っています。ありがとう! –

答えて

0

あなたはステートマシンデザインパターンのアプローチ使用して、このような何かを行うことができます。

int nextState = 0; 

void loop(){ 
    while(1){ 
     if(digitalRead(button) == HIGH){ 
      switch(nextState){ 
       case 0: // Red Button 
        switchToRed(); 
       break; 
       case 1: // Green Button 
        switchToGreen(); 
       break; 
       case 2: // Blue Button 
        switchToBlue(); 
       break; 
       case 3: // Switch off 
        switchOff(); 
       break; 
      } 
      nextState = (nextState + 1) % 4;       
      delay(250); 
     } 
     // or you can delay here 
    } 
} 

をそして、あなたはケース3の後に継続したくない場合は、ケース3の場合returnステートメントを使用してループを解除することができます。

+0

華麗で、あなたは次のことを忘れた++; switchToXの後にこれは完全に動作します! –

+0

いいえ私はそれらをすべて実行するためにswitch文の外に置いています。 –

+0

私はそれを見ますが、プログラムはnextState ++とnextState =(nextState + 1)%4なしでは動作しません。スイッチの下。 –

1

コードのロジックに問題があります。ボタンを押すまで、digitalRead機能が待機しているかのように動作しています。代わりに、実際に何が起こっているのかは、関数が繰り返し呼び出されていて、最も外側のボタンテストを実際にテストしているだけです。ボタンを迷惑メールにした場合、それぞれの色を循環させることができます。

代わりに、ボタンをテストし、押されている場合は、変数を増分して、どのようなライトをオンにするかを指定します。何かのように:

int pressed = 0; 
int state = 0; 

void loop() 
    { 
    if(digitalRead(button)==HIGH)  
    { 
    if(pressed==0) 
     { 
     pressed=1; 
     switch(state) 
     { 
     case 0: 
     switchToRed(); 
     state++; 
     break; 
     case 1: 
     switchToGreen(); 
     state++; 
     break; 
     case 2: 
     switchToBlue(); 
     state++; 
     break; 
     case 3: 
     switchToOff(); 
     state=0; 
     break; 
     } 
     } 
    } 
    else 
    { 
    pressed=0; 
    } 
    } 
+0

あなたの説明をありがとう、私のロジックについては正解です、私はCの新人です。 あなたのコードは何らかの理由で動作しますが、RED> GREEN> BLUEから即座に色に変化しません緑色>黄色>緑色>青色>青色のような色の間に他の色があり、消灯するとゆっくりと消えます。 –

+0

私はちょうど遅れを必要としました、今それは正常に動作します。ありがとう! –

関連する問題