2016-08-25 18 views
0

機能:Arduinoのボタンの状態のトグル

ユーザー赤いドームボタンを押下し、それゆえそれは「初回時に切り替えなければならない(2状態ボタンではありません) 0 "→" 1 "&を押すと、" 1 "→" 0 "に戻ります。

したがって、押すとシリアルモニタは100msごとに "0"から "1"を出力します。ビヘイビアは、buttonStateがLOWからHIGHに切り替わることを通知します。

さらに、LEDストライプもarduinoに接続されています。したがって、ボタンステートがシリアルモニタにHIGHを表示すると、LED状態は10秒後にHIGHに切り替わり、LOW状態に切り替える前に10秒間HIGH状態のままです。

最後に、buttonStateは、ユーザーが物理的にボタンを押さずに、遅延(25秒)後にHIGHからLOWに切り替える必要があります。

問題:

この時点で、ユーザは、& LOW HIGH状態を切り替えること赤いドームボタンを押さなければなりません。したがって、ボタンの初期状態がLOWの場合、シリアルモニタに「0」が表示され、押されるとボタンはHIGHに切り替わり、シリアルモニタに「1」が表示され、もう一度押すと、 HIGHからLOWになり、シリアルモニタに "0"が表示されます。

したがって、ボタンステートをユーザーがボタンを押さずにHIGHからLOWに切り替える方法についての支援をお願いしたいと思います。

従って、 correctBehaviour:

初期状態 "0" シリアルモニタに表示され、ユーザが押下するボタンbuttonstateシリアルモニタおよび25Sのカウント後 "1" Sを示し、ボタンステートは、ユーザーがボタンを再度押さなくても、LOWに切り替わります。

コード:

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 10s turn on 
     break; 

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

     case 202: // small loop at the end, to do not repeat the LED 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

私はあなたのコードはほぼ正確であると思います。

ケース200:出力状態をトグルして、デフォルトの状態に戻します。

BTW: btncntは、ボタンの押下などではなく、100ミリ秒の間隔をカウントすると誤解を招く名前です。

IMO、遅延(100)。は許容できる妥協点です:まだボタンの押下に反応しますが、場合を使用して、適切にそれをやってなくて - あなたがによって「でもあれば使用して、適切にそれをやってなくて何を意味しています(ミリ秒()20000 lastpressed>){ ...

+0

(millis() - lastpressed> 20000){... "、私はdelay(100)を使用していますが、すべてのボタンを押して確認します。申し訳ありませんが、私は実際にあなたの意味を理解していません – Luke

+0

、BlinkWithoutDelayの例を読んで行使し、理解しています(https://www.arduino.cc/ja/Tutorial/BlinkWithoutDelay)。まばたきについてだけでなく、すべてのノンブロッキング待ちについてです。 – datafiddler

関連する問題