Нажатие кнопки с 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
Обсуждение4 ответа
Лучший ответ:
Я не могу комментировать, поэтому пишу это в качестве ответа, но,
Вы делаете именно это, чтобы подключить кнопку?
Я хотел бы увидеть вашу схему, но из того, что вы описываете, не хватает подтягивающего соединения.
Может быть, есть какая-то паразитная емкость, которая удерживает заряд.
Обычно в таких случаях ставьте кнопки на низкий уровень активности + подтягивайте, чтобы избежать случаев, подобных вашему.
Попробуйте этот код и схему. Это может решить вашу проблему с дребезгом.
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;
}
Думаю, это не проблема отскока... В цикле существует задержка (1000), поэтому через 1 секунду переключатель больше не подпрыгивает. Но переключение на VCC — это проблема. Подключите переключатель к GND и используйте внутренние подтягивающие резисторы (pinMode(2, PULLUP). Затем переключатель тянет его на землю. Теперь он плавает и, вероятно, остается ВЫСОКИМ после размыкания переключателя....
- Как переключить светодиод при нажатии кнопки?
- Определение того, была ли нажата и отпущена кнопка
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
Вы нажали ее один раз, но, должно быть, держали ее в течение 10 секунд. Вы получаете «Привет» за каждую итерацию цикла. Если вам нужно только одно сообщение при нажатии, вам нужно запомнить предыдущее состояние переключателя в переменной, а затем сравнить его с текущим состоянием., @Dave Tweed
Используйте одну из библиотек «bounce» для Arduino или напишите что-то подобное, см. https://github.com/thomasfredericks/Bounce2/wiki., @Dejvid_no1
Как сказал Ясу в своем ответе, ваш ввод плавает, когда кнопка не нажата., @Dejvid_no1