2017-01-02 7 views
0

ボタン操作をスイッチにしようとしています。このコードは、ライトを「オン」にするように機能しますが、コードはオフにしたくありません。スイッチとしてボタンを使用していますが、スイッチがオンになりますが、オフになりません。(Arduino)

私のコードはこれのように動作します:

  1. ボタンを押すとライトが消灯しているされている場合は、ライトをオン。
  2. ボタンを押してライトが点灯している場合は、ライトをオフにします。

ただし、番号2は機能しません。

int buttonStatus = 0; 
int check = 1; 
int Status = 0; 

void setup() { 
    pinMode(5,OUTPUT); 
    pinMode(7,OUTPUT); 
    pinMode(9,OUTPUT); 
    pinMode(11,OUTPUT); 
    pinMode(13,OUTPUT); 
    pinMode(2,INPUT); 
} 

void loop() { 
    if (check = 1) { 
    buttonStatus = digitalRead(2); 
    if (buttonStatus == HIGH && Status == 0) { 
     Status = 1; 
     buttonStatus = 0; 
    } else if (buttonStatus == HIGH && Status == 1) { 
     Status = 0; 
     buttonStatus = 0; 
    } 
    } 

    if (Status == 1) { 
    digitalWrite(5,HIGH); 
    delay(50); 
    digitalWrite(5,LOW); 
    digitalWrite(7,HIGH); 
    delay(50); 
    digitalWrite(7,LOW); 
    digitalWrite(9,HIGH); 
    delay(50); 
    digitalWrite(9,LOW); 
    digitalWrite(11,HIGH); 
    delay(100); 
    digitalWrite(11,LOW); 
    digitalWrite(13,HIGH); 
    delay(100); 
    digitalWrite(13,LOW); 
    } else { 
    digitalWrite(5,LOW); 
    digitalWrite(7,LOW); 
    digitalWrite(9,LOW); 
    digitalWrite(11,LOW); 
    digitalWrite(13,LOW); 
    } 
} 
+0

両方の場合にライトを消しています... 'digitalWrite(5、HIGH);遅延(50); digitalWrite(5、LOW);は、LEDを素早くオンにした後、LEDを消灯します。 – dda

+0

@ddaそれは私のコードは、次に、別の電源をオンにしてオフに切り替えると私のコードです。 – JulesTheGodOfMC

答えて

0

あなたの説明とコードは、2つの異なることを示しています。私はそれらを補間しようとしていますが、私が間違っていれば教えてください。私は答えを修正しようとします。

このコードを使用すると、ピン5のライトをオン/オフするためのプッシュボタンを使用できます.1回押すとオンになり、もう1回押すとオフになります。ボタンを一方の端をピン2に、もう一方の端をグランドに接続する必要があります(プルアップ抵抗を使用しているため)。

あなたは再びそれをそれを押したときに、ピン5のLEDボタンは、オンになります押したとき、私はまた

byte buttonStatus; 
unsigned long lastEqualButtonTime; 
#define debounceTimeMs 50 

void setup() { 
    pinMode(5,OUTPUT); 
    pinMode(2,INPUT_PULLUP); 
    buttonStatus = digitalRead(2); 
    lastEqualButtonTime = millis(); 
} 

void loop() { 
    byte currentButtonStatus = digitalRead(2); 
    if (currentButtonStatus == buttonStatus) 
     lastEqualButtonTime = millis(); 
    else if ((millis() - lastEqualButtonTime) > debounceTimeMs) 
    { 
     lastEqualButtonTime = millis(); 
     buttonStatus = currentButtonStatus; 

     // Change only on change, not on value 
     if (buttonStatus == LOW) { 
      digitalWrite(5, !digitalRead(5)); 
     } 
    } 
} 

を機械的スイッチ(50ミリ秒)のバウンスに対処するための小さなデバウンス遅延を追加しましたオフになります。

これはあなたが求めた動作です。反対側のコードは、ボタンを押すと一連のLEDが点灯します。この場合、プレスでサイクルを開始し、別のプレスでサイクルを停止したい場合は、コードのような単純なステートマシンを使用する必要があります。私はまた、2と地面の間に再び接続する必要があるボタンに小さなデバウンスを加えました。

byte buttonStatus; 
unsigned long lastEqualButtonTime; 
#define debounceTimeMs 50 

// Statuses 
#define STATE_LEDSOFF 0 
#define STATE_LED5ON 1 
#define STATE_LED7ON 2 
#define STATE_LED9ON 3 
#define STATE_LED11ON 4 
#define STATE_LED13ON 5 

// How much time should each led be on? 
// Expressed in milliseconds 
#define TIME_LED5ON 50 
#define TIME_LED7ON 50 
#define TIME_LED9ON 50 
#define TIME_LED11ON 100 
#define TIME_LED13ON 100 

byte stateMachineStatus; 
unsigned long stateMachineTime; 

void setup() { 
    pinMode(5,OUTPUT); 
    pinMode(7,OUTPUT); 
    pinMode(9,OUTPUT); 
    pinMode(11,OUTPUT); 
    pinMode(13,OUTPUT); 
    pinMode(2,INPUT_PULLUP); 
    buttonStatus = digitalRead(2); 
    lastEqualButtonTime = millis(); 
    stateMachineStatus = STATE_LEDSOFF; 
} 

void loop() { 
    byte currentButtonStatus = digitalRead(2); 
    if (currentButtonStatus == buttonStatus) 
     lastEqualButtonTime = millis(); 
    else if ((millis() - lastEqualButtonTime) > debounceTimeMs) 
    { 
     lastEqualButtonTime = millis(); 
     buttonStatus = currentButtonStatus; 

     // Change only on change, not on value 
     if (buttonStatus == LOW) { 
      // Turn on the LEDs sequence if it was off 
      if (stateMachineStatus == STATE_LEDSOFF) 
      { 
       stateMachineStatus = STATE_LED5ON; 
       stateMachineTime = millis(); 
      } 
      else // Turn it off if it was on 
       stateMachineStatus = STATE_LEDSOFF; 
     } 
    } 

    switch (stateMachineStatus) 
    { 
    case STATE_LEDSOFF: 
     digitalWrite(5,LOW); 
     break; 
    case STATE_LED5ON: 
     digitalWrite(5,HIGH); 
     if ((millis() > stateMachineTime) > TIME_LED5ON) 
     { 
      stateMachineTime += TIME_LED5ON; 
      digitalWrite(5,LOW); 
      stateMachineStatus = STATE_LED7ON; 
     } 
     break; 
    case STATE_LED7ON: 
     digitalWrite(7,HIGH); 
     if ((millis() > stateMachineTime) > TIME_LED7ON) 
     { 
      stateMachineTime += TIME_LED7ON; 
      digitalWrite(7,LOW); 
      stateMachineStatus = STATE_LED9ON; 
     } 
     break; 
    case STATE_LED9ON: 
     digitalWrite(9,HIGH); 
     if ((millis() > stateMachineTime) > TIME_LED9ON) 
     { 
      stateMachineTime += TIME_LED9ON; 
      digitalWrite(9,LOW); 
      stateMachineStatus = STATE_LED11ON; 
     } 
     break; 
    case STATE_LED11ON: 
     digitalWrite(11,HIGH); 
     if ((millis() > stateMachineTime) > TIME_LED11ON) 
     { 
      stateMachineTime += TIME_LED11ON; 
      digitalWrite(11,LOW); 
      stateMachineStatus = STATE_LED13ON; 
     } 
     break; 
    case STATE_LED13ON: 
     digitalWrite(13,HIGH); 
     if ((millis() > stateMachineTime) > TIME_LED13ON) 
     { 
      stateMachineTime += TIME_LED13ON; 
      digitalWrite(13,LOW); 
      stateMachineStatus = STATE_LED5ON; 
     } 
     break; 
    default: 
     stateMachineStatus = STATE_LEDSOFF; 
     break; 

    } 
} 

このように動作します:ボタンを押すとボードがLEDを通ってサイクルを開始します。 5、7、9、11、13、5、7、9、11、13、...ボタンをもう一度押すまで。これを行うと、停止し、次のプレスが5から再開します。

13を停止した後で停止したい場合は、回線105をstateMachineStatus = STATE_LED5ON;からstateMachineStatus = STATE_LEDSOFF;に変更します。

ワンノート:あなたのコードで遅延が低すぎます(そして私がここに入れたものと同じです):1つのLEDと他のLEDとの間の50msは気付くことができません。実際にそれらを順番に表示したい場合は、TIME_LEDxON定義に少なくとも250の値を入れてください。

免責事項:現在、arduino ideをインストールしていないため、これらのコードはテストしていません。いくつかのバグがある場合は、単に教えてください。私はそれらを修正します。

+0

ねえ、そこにいくつかのバグがあります。私たちがチャットできる方法はありますか? – JulesTheGodOfMC

+0

私はチャットルームを作ることができますが、そこに返信するには20人の担当者が必要です。とにかくちょうどここに尋ねると、私は答えようとするでしょう。あなたのために "正しい"ものは何でしたか?最初か二番目? – frarugi87

+0

私はスカイプ、whatsapp何かを意味しました – JulesTheGodOfMC

0

デバウンス遅延を追加してみてください。これはスイッチの一般的な問題です。 https://www.arduino.cc/en/Tutorial/Debounce

+0

どのように役立つかわかりません。 – JulesTheGodOfMC

+0

デバウンスの遅延なしにスイッチを押すと、複数のプレスが読み取られ、処理中に誤動作する可能性があります。 1つの状態ボタンでスイッチを処理する良い方法を示すコード例があります。 – bnss

0

多分浮動ピンのためです。プルアップまたはプルダウン抵抗を内蔵していますか?

これはよくあることです...

+0

それを再構築して画像を送ってください。どこに送るのですか? – JulesTheGodOfMC

+0

私はあなたが何を意味するのか分かりません – JulesTheGodOfMC

+0

ウェブ上の浮遊ピンを検索:) – Chris8447

関連する問題