2017-07-05 5 views
0

ボタンを押した後にボタンの状態を変更しようとすると、何も機能しません。私はあなたがあなたのボタンが押されていない場合でも、あなたのトグル状態を更新prev = current;ボタンの状態を更新しようとすると、自分のボタンがトグルとして機能しないのはなぜですか?

#include <Servo.h>; 

//HIGH not pressed 
//LOW pressed 

int pushD3 = 3; 
int pushD4 = 4; 
int pushD5 = 5; 
int pushD6 = 6; 
int val4 = 0; 
int val5 = 0; 
int ledPin = 13; 
int prev = 0; 
int current = 0; 
Servo ZServo; 

void setup() { 
    ZServo.attach(9); 
    pinMode(pushD3, INPUT_PULLUP); 
    digitalWrite(3, HIGH); 
    pinMode(pushD4, INPUT_PULLUP); 
    digitalWrite(4, HIGH); 
    pinMode(pushD5, INPUT_PULLUP); 
    digitalWrite(5, HIGH); 
    pinMode(pushD6, INPUT_PULLUP); 
    digitalWrite(6, HIGH); 
    pinMode(ledPin, OUTPUT); 
} 

void loop() { 
    if (digitalRead(3) == LOW) { 
    current = 1 - current; 
    } 
    if (current == 1 && prev == 0) { 
    checkButtons_slow(); 
    delay(100); 
    } 
    if (current == 0 && prev == 1) { 
    //ZServo.write(110); 
    delay(500); //half a second 
    } 
    prev = current; 
} 

void checkButtons_slow() { 
    val4 = digitalRead(pushD4); 
    val5 = digitalRead(pushD5); 
    if (val4 == LOW) { 
    ZServo.write(87); 
    } else if (val5 == LOW) { 
    ZServo.write(99); 
    } else { 
    ZServo.write(91); //GUESSED ON 92; SHOULD TECHNICALLY BE 90 
    } 
} 
+0

をあなたは、任意のピンを設定しないでください。 'checkButtons_slow()'はどこで定義されていますか?何が起こるはずですか? – stevieb

+0

@stevieb私はそれをしましたが、私はそれが正しいと確信しているので、私はコードに入れていませんでした。編集はそのすべてを表示します。 – mkpappu

+0

ありがとうございます。スケッチ全体を表示するか、問題を正確に再現するのに必要なすべてのコードを含む最小限の例を表示することが常にベストです。 [SSCCE](http://sscce.org/)を参照してください。 – stevieb

答えて

0

ラインでこれを行います。それがロジックが機能しない理由です。また、トグルボタンロジックのためにボタンが離された時点を把握する必要があります。

あなたはスイッチバウンスの次の犠牲者でもあります。典型的なスイッチは開いた状態から閉じた状態まできれいには行きませんし、押された(そして離された)ときに小さくて速い開閉信号を生成することができます。これは多くの単純な押下/押下ボタン操作には影響しませんが、複数の状態スイッチのキラーです。

これを避ける簡単な方法は、スイッチを読み取る速度を制限することです。私は30msのレートがかなり良いことを発見しました。

int last_time = 0; 
bool was_pushed = false; 

void loop() { 

    if (millis() - last_time > 30) // filter out signal bounce. 
    { 
    last_time = millis(); 
    if (digitalRead(3) == LOW) 
    { 
     if (!was_pushed)   // prevent toggling until button is released.  
     current = !current; 
     was_pushed = true; 
    } 
    else 
    { 
     was_pushed = false; 
    } 
    if (current != prev) 
    { 
     prev = current;   // keep the previous toggle state only on change. 
     if (current) 
     { 
     checkButtons_slow(); 
     delay(100); 
     } 
     else 
     { 
     //ZServo.write(110); 
     delay(500); //half a second 
     } 
    } 
    } 
} 
+0

私のコードをこれで置き換えると、何も起こりません。私が 'checkButtons_slow();'を 'ZServo.write(80);に置き換えると、ボタンをクリックすると' ZServo.write(80);のためにサーボが動きますが、 – mkpappu

+0

これは完全なスケッチではありません。それでもあなたの現在のsetup()を含める必要があります。 –

+0

私は知っています。私はループ()をそれに置き換えました。 – mkpappu

0

私はあなたの実装とマイケルの少し混乱を見つけ、なぜやっていない:

bool state = false; 
bool buttonPressed = false; 
void loop(){ 
    if (digitalRead(3) == LOW && !buttonPressed){ 
     state=!state; 
     buttonPressed = true; 
    } 
    if(digitalRead(3) == HIGH){ 
     buttonPressed = false; 
    } 

    // Then your logic 
    if (state) { 
    checkButtons_slow(); 
    delay(100); 
    } else{ 
     //ZServo.write(110); 
     delay(500); //half a second 
    } 
} 
関連する問題