Странная проблема с кодом Arduino
В настоящее время я только начинаю работать с Arduino, поэтому у меня мало знаний. В этом проекте у меня есть приемник и передатчик с 2 кнопками. Итак, я хотел бы включить что-то, когда я нажимаю кнопку A. Если A нажимается дольше, я бы хотел, чтобы произошло что-то еще. То же самое происходит с кнопкой B, но по некоторым причинам, когда я долго нажимаю A, срабатывает B, и я понятия не имею, почему...
Кстати. этот код создан не мной, а скопирован и отредактирован для моего использования. Если бы кто-нибудь мог мне помочь, я был бы очень рад :)
код:
//ButtonAEvents
long prevA = 0;
long prevB = 0;
int buttonStateA = 0; // 0 = не нажата --- 1 = долго нажата --- 2 коротко нажата
int buttonStateB = 0; // 0 = не нажата --- 1 = долго нажата --- 2 коротко нажата
int ButtonAPin = 2;
int ButtonBPin = 3;
int DURATION_A_IN_MILLIS = 1000;
int DURATION_B_IN_MILLIS = 1000;
// ОДНОРАЗОВАЯ НАСТРОЙКА
void setup()
{
pinMode(ButtonAPin, INPUT);
pinMode(ButtonBPin, INPUT);
Serial.begin(9600);
}
// НАЧАЛО ЦИКЛА
void loop()
{
//КНОПКА ПРОВЕРИТЬ
buttonStateA = 0;
if (digitalRead(ButtonAPin)) {
prevA = millis();
buttonStateA = 1;
while ((millis() - prevA) <= DURATION_A_IN_MILLIS) {
if (!(digitalRead(ButtonAPin))) {
buttonStateA = 2;
break;
}
}
}
if (!buttonStateA) {
// Ничего не нажато
}
else if (buttonStateA == 1) {
// ДЛИТЕЛЬНОЕ НАЖАТИЕ
Serial.println("LongpressA");
digitalWrite(A1, HIGH);
delay(100);
}
else if (buttonStateA == 2) {
//КОРОТКОЕ НАЖАТИЕ
digitalWrite(A1, HIGH);
Serial.println("ShortpressA");
delay(100);
}
//ПРОВЕРИТЬ КНОПКУ B
buttonStateB = 0;
if (digitalRead(ButtonBPin)) {
prevB = millis();
buttonStateB = 1;
while ((millis() - prevB) <= DURATION_B_IN_MILLIS) {
if (!(digitalRead(ButtonBPin))) {
buttonStateB = 2;
break;
}
}
}
if (!buttonStateB) {
// Ничего не нажато
}
else if (buttonStateB == 1) {
//КОРОТКОЕ НАЖАТИЕ
Serial.println("LongpressB");
delay(100);
}
else if (buttonStateB == 2) {
// ДЛИТЕЛЬНОЕ НАЖАТИЕ
digitalWrite(A1, LOW);
Serial.println("ShortpressB");
delay(100);
}
}
@Nea Yjung, 👍2
Обсуждение1 ответ
Не уверен, что это просто академическое упражнение с вашей стороны (что совершенно здорово), но если вы просто пытаетесь двигаться вперед и заставить что-то работать, вы можете рассмотреть одну из многих отличных библиотек кнопок. для Ардуино.
Недавно я использовал библиотеку под названием ButtonKing, которая позволила мне выполнять очень сложные операции с меню на MKR1010 с дисплеем и одним интерфейс кнопок. Также есть несколько других библиотек, которые заботятся об устранении дребезга, длинных щелчках, двойных щелчках и т. д.
- устаревшее преобразование из строковой константы в 'char*'
- Какие есть другие IDE для Arduino?
- Esp8266 Vin контакт
- Плата для разработки STM8 с Arduino IDE
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
- Скрытие пароля WLAN при отправке на GitHub
- Как я могу прервать задержку() при нажатии кнопки?
- Изменение времени тика в FreeRTOS
У вас нет причин для вашей проблемы, поэтому это комментарий: вы поменяли местами слова LongpressB и ShortpressB в операторах последовательной печати, также рекомендуется не использовать ! оператор для целого числа (используйте buttonStateB == 0) или, что еще лучше, в вашем случае оператор switch., @Michel Keijzers
плюс за хорошо написанный вопрос, @jsotola
Какие у вас аппаратные соединения? Предполагается, что контакты кнопки находятся в состоянии HIGH при нажатии и LOW при отсутствии нажатия. Вы также не используете подтягивания/опускания, поэтому они должны быть внешними., @Maximilian Gerhardt
Я протестировал ваш код на своем Arduino Uno с двумя кнопками, которые переходят в НИЗКИЙ уровень при нажатии и вытягиваются извне, инвертировал логику в digitalRead() в коде, и он работает, как и ожидалось. Если нажатие одной кнопки вызывает срабатывание другой, я бы поискал неисправность в настройках вашего оборудования (перекрестные помехи, случайное перемыкание, неправильная полярность кнопки и т. д.). Также проблемой может быть дребезг сигнала (и его можно подавить с помощью конденсаторов)., @Maximilian Gerhardt
Всем спасибо за быстрые ответы! Я изменил положение контактов и убедился, что они не перемкнуты, к сожалению, проблема все еще существует. Должен ли я, возможно, использовать резистор между приемником и ардуино? с уважением, @Nea Yjung
Не могли бы вы отредактировать свой вопрос и добавить принципиальную схему, нарисованную на бумаге или с помощью инструмента «Схема» в меню редактирования вопроса, чтобы мы все могли видеть ваши аппаратные соединения без путаницы / предположений?, @Maximilian Gerhardt
Привет еще раз, я попытался использовать функцию схемы, но я не очень хорошо знаком с символами и электроникой, поэтому я нарисовал ее в Photoshop, надеюсь, это понятно, но извините еще раз ... http://prntscr.com/p7vc8m, @Nea Yjung
Пожалуйста, [отредактируйте](https://arduino.stackexchange.com/posts/68669/edit) свой пост, чтобы включить это изображение и техническое описание чипа RO2A sc2272., @abu-ahmed al-khatiri