2017-10-28 7 views
1

午後にプログラミングの宿題を扱うのに忙しかったので、以下のコードで問題を解決できないようです。ArduinoボードのLEDがボタンのクリックで消灯しない

練習問題は、ボタンを押してLEDを切り替える必要があることです。私のコードでは、ボタンをクリックするとLEDが点灯しますが、ボタンをもう一度クリックすると消灯しません。

int pinButton = 5; 
int LED = 10; 
int currentState; 
int previousState; 

void setup() { 
    Serial.begin(9600); 
    pinMode(pinButton, INPUT); 
    pinMode(LED, OUTPUT); 
} 

void toggleLed(){ 
    if (previousState == 1 && currentState == 0){ 

    digitalWrite(LED, HIGH); 
    Serial.println(currentState); 
    Serial.println(previousState); 
    delay(100); 

    } else { 

    digitalWrite(LED, LOW); 
    Serial.println(currentState); 
    Serial.println(previousState); 
    delay(100); 

    } 
} 

void loop() { 

int currentState = digitalRead(pinButton); 

if (currentState == 0 && previousState == 1) { 

    Serial.println("Knop is losgelaten"); 

    toggleLed(); 

} 

previousState = currentState; 

} 

私は声明この場合にはpreviousStatecurrentStateは常に、それぞれ1と0になりますので、最初に他のコードブロックは、意味がないことを推測します。

あなたはどんなヒントを持っていますか?

このArduinoは途中でArduino Unoです。

答えて

0

あなたのコードでは、ボタンを押した後に再び消灯していないことがわかります。もしあなたが "while"ステートメントにifステートメントを入れていたら、それはなくなってしまいます。

+0

「while」ステートメントに入れても機能しません。 –

0

EDIT:コメントの追加の質問に対処するために、多くの点で拡張されています。

  1. あなたはcurrentStateという名前の2つの異なる変数、グローバル1とloop()に地元のものを持っています。グローバルなものは、プログラムの先頭近くに定義され、別の関数の中では定義されません。 loop()では、この行で始まる:

    int currentState = digitalRead(pinButton);

    をあなたがそこにintを含めましたので、これは実際にはグローバルなものと同じ名前を持つようにたまたま二変数を作成します。 currentStateの2つのバージョンの値は、個別に変更することができます。 loop()の中で、currentStateを参照するたびに、あなたはローカルコピーを参照します。他のすべての場所(toggleLedなど)は、グローバルコピーを参照します。あなただけの(私はあなたがする意味と仮定するものである)グローバルなものを設定したい場合は、intをドロップする必要があります。

    currentState = digitalRead(pinButton);

    これは新しいを作成せずにcurrentStateのグローバルバージョンが変更されます1。

  2. あなたはデバウンスを行っていないので、ボタンの種類によって散発的な結果が見られることがあります。多くのボタンやスイッチでは、オンとオフとの間の遷移にノイズが生じることがあります。デバウンスはそのノイズをフィルタリングします。 を編集してください:toggleLed()の遅延はおそらくデバウンスには十分ですが、通常はデバウンスはの前に行われ、は状態の変化に応答します。

  3. おそらくpreviousStateを初期化する必要があります。明示的な初期化は、コードを読まなければならない人、特に知らない人にとっては明白になります。 Cのすべての規則も同様です。また、0ではなく、LOWに初期化することをお勧めします。それは私の最後のポイントにつながります。

  4. 戻り値digitalRead()は、HIGHまたはLOWです。 Unoでは、HIGHまたはLOWの代わりに1または0を使用しても問題はありませんが、他の特定のボードにコードを移植しても問題はないと思います。詳細を非表示にする定数はHIGHLOWですが、それらは一貫して使用する場合にのみ役立ちます。 HIGHLOWいくつかの時間と10を使用すると、コードを理解するのが難しくなり、コードを別のボードで試してみると移植性の問題が発生する可能性があります。

+0

アドリオンに感謝します。しかし、私はあなたが提案するいくつかの点についてあなたに従っていません。 previousStateはコードの最上部で初期化されます。 HIGHまたはLOWはUnoでは重要ではなく、1と0を使用することもできます。あなたは最初の声明で何を意味するかについてもう少し説明できますか?私はまだそれの少し新しいです。私はローカルintとグローバルintについて聞いたことがあるが、私はそれがどのように動作するのか理解していない。事前にどうもありがとうございました。 –

+0

私はあなたの追加の質問に答えるための答えを広げました。 –

0

「LED」と定義されているピンの状態を読み取ることで実現できます。 HIGH状態であればLOw、LOWであればLOWにします。

void toggleLed(){ 
// check if pin state is low, turn it on 
if (digitalRead(LED) == 0) 
digitalWrite(LED, HIGH); 
} else { 
digitalWrite(LED, LOW); 
} 
} 
関連する問題