2016-08-24 4 views
0

機能はされていません。Arduinoのライトが一度表示されますが、連続したシーケンスで

ユーザーが赤いドームボタン赤ドームボタンを押下し、buttonStateがHIGHとシリアルモニターであることを知らせるために仮定され、 100msごとに "1"を出力し、5秒後にLEDが点灯します。LEDライトは約10秒間点灯するHIGH状態になり、LEDライトはLEDライトを意味するLOW状態に切り替わりますオフになります。

したがって流量:

正しい挙動:

初期状態 - >シリアルモニタ表示 "0" ユーザ押しボタン - >シリアルモニタ表示 "1" で100msごとに10秒後にLEDの状態がHIGHになります。

及び10Sの遅延の後にLEDの状態がLOWになり、シリアルモニタ表示は、赤色ドームボタンのbuttonstateがHIGH

のままであることを知らせるために100ms毎に「1」のままであります問題:

現在の行動: 初期状態 - >シリアルモニタディスプレイ「0」 ユーザーは、ボタンを押したときに - >シリアルモニターは、単一の「1」を表示し、Dではありません連続した "1"を表示しますが、10秒後にLEDの状態がHIGHになります。

遅延が10秒後にLEDの状態がLOWになります。この時点で、LEDは再びHIGHになるはずはありませんが、10秒後にLEDが10秒後にHIGHとLOWになります。その後、ループになります。 赤いドームボタンのボタンステートがまだHIGHであることを知らせるために、シリアルモニタディスプレイは "1"のままです

したがって、ボタンを一度押すと、連続した "1 10秒遅れ、LEDはHIGH状態になり、さらに10秒遅れ、LED状態はLOWになります。そしてLEDその後もかかわらず、LOWの状態のまま、buttonstateはHIGH

である

コード:あなたはdelay(10000)、その後delay(2000);を持っているとき

const int buttonPin = 2; //the number of the pushbutton pin 
const int Relay  = 4; //the number of the LED relay pin 

uint8_t stateLED = LOW; 
uint8_t  btnCnt = 1; 

int buttonState = 0; //variable for reading the pushbutton status 
int buttonLastState = 0; 
int outputState = 0; 

void setup() { 
    Serial.begin(9600); 
    pinMode(buttonPin, INPUT); 
    pinMode(Relay, OUTPUT); 
    digitalWrite(Relay, LOW); 
} 

void loop() { 

    // read the state of the pushbutton value: 
    buttonState = digitalRead(buttonPin); 
    // Check if there is a change from LOW to HIGH 
    if (buttonLastState == LOW && buttonState == HIGH) 
{ 
    outputState = !outputState; // Change outputState 
} 
buttonLastState = buttonState; //Set the button's last state 

// Print the output 
    if (outputState) 
{ 
    switch (btnCnt++) { 
    case 100: 
    stateLED = LOW; 
    digitalWrite(Relay, HIGH); // after 5s turn on 
    break; 

    case 200: 
    digitalWrite(Relay, LOW); // after 10s turn off 
    break; 

    case 102: // small loop at the end, to do not repeat the cycle 
    btnCnt--; 
    break;  
} 

Serial.println("1"); 
}else{ 
    Serial.println("0"); 
    if (btnCnt > 0) { 
    // disable all: 
    stateLED = LOW; 
    digitalWrite(Relay, LOW); 
} 
    btnCnt = 0; 
} 

delay(100); 
} 

答えて

0

あなたは、何を期待しています。あなたがそれほど長く待っているならば、100msごとにこれらの "1"を印刷する必要がありますか?

ボタンの変更時にoutputStateが変更されますが、ボタンの状態を直接使用することでその部分をスキップすることができます。これはまったく同じです。

私は(テストされていない、それだけでコンセプトだ)そのような何かを想像することができます

const int buttonPin = 2; 
const int Relay  = 4; 

uint8_t stateLED = LOW; 
uint8_t  btnCnt = 1; 

void loop() { 
    if (digitalRead(buttonPin) == HIGH) { 

    switch (btnCnt++) { 
     case 0: case 1: 
     stateLED = HIGH; // no idea, why is that in original code, but whatever 
     break; 

     case 50: 
     stateLED = LOW; 
     digitalWrite(Relay, HIGH); // after 5s turn on 
     break; 

     case 100: 
     digitalWrite(Relay, LOW); // after 10s turn off 
     break; 

     case 102: // small loop at the end, to do not repeat the cycle 
     btnCnt--; 
     break;  
    } 

    Serial.println("1"); 

    } else { 

    if (btnCnt > 0) { 
     Serial.println("0"); 
     // disable all: 
     stateLED = LOW; 
     digitalWrite(Relay, LOW); 
    } 
    btnCnt = 0; 

    } 

    delay(100); 
} 

void setup() { 
    Serial.begin(57600); 
    pinMode(buttonPin, INPUT); 
    pinMode(Relay, OUTPUT); 
    digitalWrite(Relay, LOW); 
} 
+0

uint8_t何ですか?私はまだ(57600)の代わりにSerial.begin(9600)を使用していますか?それは問題ですか?ケース0でstateLED = HIGHを開始する必要はないので、ケース0全体を削除できますか? – Luke

+0

私はテストして、コードも編集しました。私はSerial.begin(57600)をSerial.beign(9600)に変更しました。これによりSerial.printIn( "0")または( "1")が可能になりました。私はあなたの提案がボタンを連続的に押さなければならないときだけLEDを状態HIGHにすることができるので、次のコードを変更しました。そうでなければそれはLOwになります。私が変更したコードでは、ボタンを一度押し下げることができ、「1」は連続したボタンを押さなくても続きます。私のボタンは2つの状態ボタンではないので、トグル状態を作成する必要があります。 – Luke

関連する問題