Мой код кнопки не работает должным образом

Я использую 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 быстрых щелчков, и он не придерживается определенного количества нажатий для переключения. Что бы вы посоветовали мне изменить, чтобы исправить это.

Редактировать: вот моя электросхема Схема подключения

, 👍0

Обсуждение

Как у вас подключена кнопка?, @Majenko

Он должен переключаться между значениями из 1 нажатия, как это спроектировано из кода, но на самом деле он редко переключается между значениями из 1 нажатия, требуется 4,5,6,8 нажатия только для переключения между значениями. Я не понимаю, почему он так себя ведет, @Jacob

Да, это то, что вы сказали в своем вопросе. Но я спросил: «Как подключена ваша кнопка?», а не «Повторите то, что вы сказали в своем вопросе о том, как вы хотите, чтобы она вела себя»., @Majenko

Пожалуйста, покажите изображение того, как ваша кнопка подключена к Arduino., @Majenko

как кнопка подключена к oled-дисплею?, @jsotola

на рисунке видно, что кнопка не подключена ни к каким линиям данных, @jsotola

извините, мне пришлось добавить провод от одного из верхних контактов к контакту № 2 на картинке, он подключен к моей макетной плате., @Jacob


2 ответа


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

0

Одна из основных проблем заключается в том, что у вас есть простая фраза "Если кнопка ВЫСОКАЯ, то переключайтесь между цифрами". Чем дольше вы держите кнопку, тем больше раз она будет переключаться между цифрами. Вероятность того, что вы отпустите кнопку с номером, отличным от того, с которого она началась, равна 50/50.

Вместо этого вам нужно искать изменение в состоянии кнопки. Изменился ли он с НИЗКОГО на ВЫСОКИЙ:

static uint8_t oldState = LOW;

uint8_t buttonState = digitalRead(BUTTON_PIN);
if (buttonState != oldState) {
    oldState = buttonState;

    if (buttonState == HIGH) {
        // Это запускается только один раз в момент нажатия
        // кнопка - не постоянно, пока вы
        // удерживая кнопку.
        // Циклический просмотр ваших дисплеев здесь.
    }
}
,

1

Вы считываете необработанное состояние кнопки без устранения дребезга, поэтому вы можете получать 2 (или 4, или...) импульса так быстро — при одном и том же нажатии кнопки — что дисплей или ваш глаз не могут реагировать что быстро. Вот руководство Ника Гэммона по переключателям и кнопкам, включая устранение дребезга.

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

,