Кнопка не нажата, но продолжает печатать или вводить 1/HIGH

У меня есть код Arduino, который выводит 1 в последовательный монитор и даже выводит две единицы. Я даже не нажимал и не щелкал кнопку, но она уже установлена в состояние HIGH и даже активируется в этом состоянии 2 раза за цикл.

/* C++ code */

int MODE = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(7, INPUT);
}

void loop()
{
  int isPushed = digitalRead(7);
  if (isPushed == HIGH) {
    Serial.println(digitalRead(7));
    if (MODE == 0) {
      MODE = 1;
    } else if (MODE == 1) {
      MODE = 0;
    }
  }
  if (MODE == 0) {
    redGreenBlue();
  } else if (MODE == 1) {
    blink();
  }
}

void redGreenBlue(){
  digitalWrite(2, HIGH);
  delay(200);
  digitalWrite(2, LOW);
  delay(200);
  digitalWrite(3, HIGH);
  delay(200);
  digitalWrite(3, LOW);
  delay(200);
  digitalWrite(4, HIGH);
  delay(200);
  digitalWrite(4, LOW);
  delay(200);
}

void blink(){
  //Serial.println("working");
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delay(200);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(200);
}

Предполагалось, что это будет светодиодный переключатель, меняющий цвет с синего, зеленого и красного на белый при нажатии кнопки

, 👍1

Обсуждение

исследование плавающего ввода, @jsotola

Похоже, на этом цифровом входе есть какой-то аппаратный шум. Вы добавили какую-нибудь схему подтягивания к этому выводу, чтобы при подаче питания на аппаратное обеспечение сигнал от оборудования на выводе был низким, а при нажатии кнопки вывод N перешёл в активное высокое состояние?, @Vaibhav


1 ответ


0

Вам понадобится подтягивающий резистор, чтобы избежать наводок, приводящих к ложным показаниям. Вам также потребуется задержка с момента первого обнаружения изменения на этом контакте, чтобы кнопка успокоилась (поищите «дребезг контактов»), прежде чем вы отреагируете на изменение её состояния (попробуйте 50 мс для начала). В противном случае ваш код будет сталкиваться с множеством быстрых изменений, известных как «дребезг контактов» или «вибрация», и вы снова увидите странное поведение кода. Существуют и другие способы борьбы с дребезгом контактов, но задержка — самый простой.

,