-2

UdemyでArduinoを学んでいたAnsh Goelです。私はこの分野の初心者です。バウンス電圧の問題を解決するために、ボタンをデバウンスするためのコードを作成していました。しかし、コードにエラーがあります。コンパイル時エラーはありませんが、実行時エラーです。

また、Serial.print() を使用してコードをチェックして、エラーの場所を見つけようとしたところ、エラーが 2 番目のネストされた if 条件にあることがわかりました。簡単にするために、コードのどこにエラーがあるかについても言及しました。そこで、Serial.print("A") 関数をシリアル モニタにも取得できません。

私の主な動機は、コードを実行して、ボタンが押されたときに遅延を使用して電圧のバウンスを停止できるようにすることです。

41号線からです

これは、ボタンをデバウンスするために使用したコードです

 const int btn_pin = 2;
const int debounce_delay = 50; //ms

// We need to remember the previous button state between loops
int btn_prev = HIGH;
int btn_state = HIGH;
unsigned long last_debounce_time = 0;

// Counter
int counter = 0;

void setup() {

  Serial.begin(9600);

  // Set up pins
  pinMode(btn_pin, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {

  int btn_read;

  // Read current button state
  btn_read = digitalRead(btn_pin);

  //Remember when the button change state

  // If the button was previously HIGH and now LOW, it's been pressed
  if ( (btn_prev == HIGH) && (btn_read == LOW )) {


    //Store the time it took to take the action for button press
    last_debounce_time = millis();
  }
    //Wait before changing the state of the button



// IN THIS CONDITION THERE IS ERROR SOMEWHERE I AM NOT GETTING IT

    if(millis() > (last_debounce_time + debounce_delay)){
      if(btn_read != btn_state) {


    Serial.println("A");
        // Then store the button change value to the global variable
        btn_state = btn_read;

        if(btn_state == LOW) {

          // Increment and print counter
          counter++;
          Serial.println(counter);
          digitalWrite(13,HIGH);
          delay(500);
          digitalWrite(13,LOW);
          delay(500);      
        }
      }
    }



  // Remember the previous button state for the next loop iteration
  btn_prev = btn_state;
}

テスト目的で、これは TinkerCad の回路設計であり、オンラインで確認できます。

TinkerCad 回路設計

問題を解決するのを手伝ってください、それは私にとってあなたの側からの大きな助けになるでしょう.

4

1 に答える 1

1

コードが誤動作する可能性のある場所がいくつかあります。

  • あなたはループのために適切にループしていません
  • あなたのロジックは機能しません
  • デジタル読み取りが機能しない
  • 印刷がうまくいかない

まず、デバウンス チェックを削除して、これが機能するかどうかを確認します。

//if(millis() > (last_debounce_time + debounce_delay)){

他のすべての問題を確認するには、残りの if の前に次の右を追加します。

  • 無限のデータを取得しないように遅延します
  • ミリ秒、last_debounce_time、debounce_delay、および btn_read を出力します
  • エンドライン

次に、実行してボタンを押します。出力により、何が問題であるかがわかります

于 2020-05-03T13:30:14.390 に答える