Нажатие кнопки с Arduino повторяется много раз

У меня есть 5 В -> кнопка -> резистор 10 кОм -> настройка PIN2 с помощью Arduino UNO.

Мой код очень прост:

int count = 0;

void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600); 
}

void loop() {
  int state = digitalRead(2);
  Serial.println(state);
  if (state == HIGH) {
    count++;
    Serial.print("Hi");
    Serial.println(count);
  }
  delay(1000); 
}

Если кнопка нажата, выведите «HiX», но то, что я получаю, очень странно. Когда я нажимаю кнопку только один раз, я получаю следующее:

0
0
0
0
0
1
Hi1
1
Hi2
1
Hi3
1
Hi4
1
Hi5
1
Hi6
1
Hi7
1
Hi8
1
Hi9
1
Hi10
0

Нажатие кнопки регистрируется 10 раз.

Что я делаю не так?

, 👍1

Обсуждение

Вы нажали ее один раз, но, должно быть, держали ее в течение 10 секунд. Вы получаете «Привет» за каждую итерацию цикла. Если вам нужно только одно сообщение при нажатии, вам нужно запомнить предыдущее состояние переключателя в переменной, а затем сравнить его с текущим состоянием., @Dave Tweed

Используйте одну из библиотек «bounce» для Arduino или напишите что-то подобное, см. https://github.com/thomasfredericks/Bounce2/wiki., @Dejvid_no1

Как сказал Ясу в своем ответе, ваш ввод плавает, когда кнопка не нажата., @Dejvid_no1


4 ответа


Лучший ответ:

6

Я не могу комментировать, поэтому пишу это в качестве ответа, но,

Вы делаете именно это, чтобы подключить кнопку?

https://www.arduino.cc/en/uploads/Tutorial/button.png Я хотел бы увидеть вашу схему, но из того, что вы описываете, не хватает подтягивающего соединения.

,

1

Может быть, есть какая-то паразитная емкость, которая удерживает заряд.

Обычно в таких случаях ставьте кнопки на низкий уровень активности + подтягивайте, чтобы избежать случаев, подобных вашему.

,

0

Попробуйте этот код и схему. Это может решить вашу проблему с дребезгом.

схема

const int buttonPin = 2; // Нажимаем кнопку на контакте 2

int buttonState = 0;
int lastButtonState = 0;

int counter = 0;

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP); // Кнопка с подтягиванием
  Serial.begin(9600);
}

void loop()
{
  buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState)
  {
    if (buttonState == HIGH)
    {
      counter++;
      Serial.println("Hi !");
      Serial.print("Number of button pushes:  ");
      Serial.println(counter);
    }
    else 
    {
      Serial.println("Button off");
    }
    delay(50); // Небольшая задержка, чтобы избежать подпрыгивания
  }
  lastButtonState = buttonState;
}
,

1

Думаю, это не проблема отскока... В цикле существует задержка (1000), поэтому через 1 секунду переключатель больше не подпрыгивает. Но переключение на VCC — это проблема. Подключите переключатель к GND и используйте внутренние подтягивающие резисторы (pinMode(2, PULLUP). Затем переключатель тянет его на землю. Теперь он плавает и, вероятно, остается ВЫСОКИМ после размыкания переключателя....

,