Мой код кнопки не работает должным образом
Я использую OLED-дисплей, подключенный к кнопке. Я пытаюсь заставить свой дисплей отображать два разных значения независимо, используя кнопку для переключения между ними. Вот фрагмент моего кода из функции цикла:
if (buttonState == HIGH) {
x=x+1;
}
if (x == 1) {
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.setTextSize(2);
display.print(T);
display.print(" degree");
display.display();
display.print(x);
}
else if (x == 2) {
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.setTextSize(2);
display.print(perventage);
display.print(" %");
display.display();
display.print(x);
}
else {
x=1;
}
delay(10);
}
x определяется как 1 изначально за пределами цикла. Что происходит, так это то, что когда схема включена, на экране отображается значение T, тогда что должно произойти, когда я нажимаю кнопку, она переключается на второе значение, которое является процентом, и я снова нажимаю, чтобы вернуться к T. Моя проблема заключается в том, что Arduino не всегда реагирует на нажатие кнопки, иногда для этого требуется 1 щелчок, а иногда для переключения между ними требуется 6 или 8 быстрых щелчков, и он не придерживается определенного количества нажатий для переключения. Что бы вы посоветовали мне изменить, чтобы исправить это.
Редактировать: вот моя электросхема
@Jacob, 👍0
Обсуждение2 ответа
Лучший ответ:
Одна из основных проблем заключается в том, что у вас есть простая фраза "Если кнопка ВЫСОКАЯ, то переключайтесь между цифрами". Чем дольше вы держите кнопку, тем больше раз она будет переключаться между цифрами. Вероятность того, что вы отпустите кнопку с номером, отличным от того, с которого она началась, равна 50/50.
Вместо этого вам нужно искать изменение в состоянии кнопки. Изменился ли он с НИЗКОГО на ВЫСОКИЙ:
static uint8_t oldState = LOW;
uint8_t buttonState = digitalRead(BUTTON_PIN);
if (buttonState != oldState) {
oldState = buttonState;
if (buttonState == HIGH) {
// Это запускается только один раз в момент нажатия
// кнопка - не постоянно, пока вы
// удерживая кнопку.
// Циклический просмотр ваших дисплеев здесь.
}
}
Вы считываете необработанное состояние кнопки без устранения дребезга, поэтому вы можете получать 2 (или 4, или...) импульса так быстро — при одном и том же нажатии кнопки — что дисплей или ваш глаз не могут реагировать что быстро. Вот руководство Ника Гэммона по переключателям и кнопкам, включая устранение дребезга.
Также убедитесь, что вы используете подтягивающий резистор на контакте входа кнопки. Плавающие входные данные являются шумом и дадут вам много ложных сигналов.
- Один метод для 2 ультразвуковых датчиков не работает должным образом
- avrdude ser_open() can't set com-state
- Не могу загрузить скетч в Arduino Nano
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема «Не найдена плата PN53x» Считыватель карт Arduino NFC
- Проблема с Arduino Nano 33 IOT
- Можно ли обновить загрузчик Arduino (Nano) через себя и Arduino IDE или требуется ISP?
Как у вас подключена кнопка?, @Majenko
Он должен переключаться между значениями из 1 нажатия, как это спроектировано из кода, но на самом деле он редко переключается между значениями из 1 нажатия, требуется 4,5,6,8 нажатия только для переключения между значениями. Я не понимаю, почему он так себя ведет, @Jacob
Да, это то, что вы сказали в своем вопросе. Но я спросил: «Как подключена ваша кнопка?», а не «Повторите то, что вы сказали в своем вопросе о том, как вы хотите, чтобы она вела себя»., @Majenko
Пожалуйста, покажите изображение того, как ваша кнопка подключена к Arduino., @Majenko
как кнопка подключена к oled-дисплею?, @jsotola
на рисунке видно, что кнопка не подключена ни к каким линиям данных, @jsotola
извините, мне пришлось добавить провод от одного из верхних контактов к контакту № 2 на картинке, он подключен к моей макетной плате., @Jacob