Проблемы с кнопками
Я использовал https://wokwi.com/ для изучения Arduino, и у меня возникла проблема, которая, похоже, происходит независимо от того, что я делаю. Я пытаюсь настроить кнопку и светодиод. Конечная цель здесь — настроить его так, чтобы, когда я нажимаю кнопку и отпускаю ее, светодиод мигал, как указатель поворота в автомобиле. Когда я нажимаю его вниз и снова отпускаю, светодиод должен перестать мигать. Я пробовал массу разного кода, даже используя код, скопированный и вставленный непосредственно с сайта Arduino. В конечном итоге происходит то, что кнопка ненадежна. Иногда кнопка нажимается, иногда не регистрируется. Это очень странное поведение. Я читал об эффекте подпрыгивания, но любой код, который я ввел для игнорирования подпрыгивания, похоже, не оказал никакого влияния на систему. Почему кнопки такие ненадежные? Я знаю, что в реальной жизни это не так, потому что я могу печатать это, предположительно, с помощью кнопок на клавиатуре. Что я делаю не так??
Вот пример. Кнопка совершенно непредсказуема. Почему он так себя ведет?
int state = 0;
void setup()
{
pinMode(9, OUTPUT);
pinMode(6, INPUT);
}
void loop()
{
if (digitalRead(6)) {
state = !state;
}
digitalWrite(9, state);
}
@wgm, 👍2
Обсуждение2 ответа
У вас неправильно подключена кнопка. Ваш резистор подключен к сигналу, идущему на вывод. С контакта должно поступать напряжение 5В. Кнопка должна быть подключена непосредственно к контакту и заземлению. Или вы можете использовать INPUT_PULLUP в pinMode вместо INPUT и полностью исключить резистор.
Ваш код должен проверять, что вывод кнопки находится в состоянии НИЗКИЙ, а не ВЫСОКИЙ. Когда вы нажмете кнопку, на ней будет написано LOW. В ненажатом состоянии будет отображаться ВЫСОКИЙ. Это обычный способ подключения кнопок.
Также обратите внимание, что ваша функция цикла() будет повторяться тысячи раз в секунду. Пока вы все еще держите палец на кнопке, она будет переключаться между состояниями. Это означает, что каждый раз, когда вы нажимаете кнопку, состояние меняется несколько десятков тысяч раз, и нет реального способа узнать, в каком состоянии оно будет, когда вы наконец уберете палец с кнопки.
Вам следует посмотреть «Пример изменения состояния»; в среде разработки Arduino. Он показывает, как отслеживать предыдущее состояние кнопки, чтобы можно было реагировать один раз на каждое нажатие.
Знаете ли вы, что я могу Google, чтобы найти этот пример изменения состояния? Возникли проблемы с поиском. Спасибо за объяснение, @wgm
Я думаю, что Delta_G означает это: https://docs.arduino.cc/built-in-examples/digital/StateChangeDetection, @chrisl
@wgm, откройте Arduino IDE. Перейдите в меню «Файл». Файл->Примеры->Цифровой. Обнаружение изменения состояния будет ближе к середине. Если вы погуглите «Пример изменения состояния Arduino», вы будете завалены информацией и учебными пособиями. Наверняка одним из них является ваша скорость., @Delta_G
*Знаете, что я могу найти в Google, чтобы найти этот пример изменения состояния* - см. мой сайт: http://gammon.com.au/switches - там также говорится о переходах, @Nick Gammon
Это мой первый ответ на этой платформе, так что простите за ошибки :P
Я тоже столкнулся с этой проблемой. Не знаю, будет ли мой ответ все еще полезен, но я нашел решение этой проблемы. Пожалуйста, ознакомьтесь с тем, как я подключил свои кнопки -
Игнорируйте все, кроме кнопок. Они не имеют отношения к этому вопросу. Все черные провода идут к контакту заземления.
Код для кнопок -
#define btnPinYellow 6
#define btnPinGreen 7
#define btnPinBlue 8
#define btnPinRed 9
#define btnPinBlack 10
void setup() {
pinMode(btnPinYellow, INPUT_PULLUP);
pinMode(btnPinGreen, INPUT_PULLUP);
pinMode(btnPinBlue, INPUT_PULLUP);
pinMode(btnPinRed, INPUT_PULLUP);
pinMode(btnPinBlack, INPUT_PULLUP);
Serial.begin(9600);
}
Определив входной контакт кнопки как INPUT_PULLUP, контакт теперь находится в активном состоянии HIGH. Когда мы нажимаем кнопку, кнопка переходит в состояние LOW. Это также должно устранить неустойчивое поведение кнопки, с которым вы сталкивались. Вы можете проверить это с помощью последовательного монитора.
Надеюсь, это решит вашу проблему ^_^
- Остановить мигание светодиодов
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Количество мигающих светодиодов с датчиком LDR
- Что произойдет с ардуино, если не использовать резистор со светодиодом?
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
проблема в строке 20, @jsotola
Я насчитал 15 строк, @wgm
никакое другое предположение было невозможно, не видя кода, @jsotola
у вас логическая ошибка в вашем коде... код похож на "если на улице темно, то щелкните выключателем"... вы будете включать и выключать свет всю ночь напролет, а свет горит шанс остаться включенным на весь день, @jsotola
`
if (!digitalRead(6)) { состояние = !состояние; }`
Это правильно?, @wgmподумайте об этом... если кнопка нажата, то
state
изменится... это происходит 50 000 раз в секунду, один раз на каждой итерацииloop()
...state
будет переключаться взад и вперед, пока вы не отпустить кнопку, @jsotolaвам нужно "запомнить" состояние кнопки между итерациями
loop()
... только если состояние кнопки изменится, то обновить состояние светодиода, @jsotola