Подключение кнопки и считывание нажатия кнопки

Пример как подключить кнопку, считывать ее нажатие и управлять светодиодом, распаянным на плате.
Понадобятся: плата Arduino, тактовая кнопка, резистор 10 кОм, макетная плата.

Схема подключения


Принцип работы
Когда тактовая кнопка не нажата контакты на ножках кнопки не замкнуты. Выход 2 через подтягивающий резистор подключен к земле. На выходе мы считываем LOW.
Когда кнопка нажата, то она соединяет выход 2 с выходом 5 Вольт на плате. Мы считываем с выхода 2 HIGH.
Можно также соединить наоборот - выход 2 через подтягивающий резистор к 5 вольтовому выходу и через кнопку к земле. В этом случае при не нажатой кнопке мы будем считывать HIGH и при нажатой LOW.
Если выход 2 не подключить через подтягивающий резистор ни к земле, ни к 5 вольтовому выходу, то на выходе будет считываться HIGH или LOW случайным образом.

// объявляем константы с номерами выходов
const int buttonPin = 2;  // выход подключенный к кнопке
const int ledPin = 13;    // выход к которому подключен распаянный на плате светодиод

// переменные
int buttonState = 0;  // здесь мы храним значение нажата или не нажата кнопка

void setup() {
  // инициализируем выход со светодиодом как OUTPUT
  pinMode(ledPin, OUTPUT);
  // инициализиуем выход подключенный к кнопке как INPUT
  pinMode(buttonPin, INPUT);
}

void loop() {
  // считываем положение кнопки
  buttonState = digitalRead(buttonPin);

  // если кнопка нажата, то 
  if (buttonState == HIGH) {
    // включаем светодиод
    digitalWrite(ledPin, HIGH);
  } else {
    // выключаем:
    digitalWrite(ledPin, LOW);
  }
}

Пример с антидребезгом

// объявляем константы с номерами выходов
const int buttonPin = 2;  // выход подключенный к кнопке
const int ledPin = 13;    // выход к которому подключен распаянный на плате светодиод

// переменные
int ledState = HIGH;        // текущее значение выхода светодиода
int buttonState = 0;  // текущее значение выхода, подключенного к кнопке
int lastButtonState = LOW;  // предыдущее значение выхода, подключенного к кнопке

// эти переменные будут иметь тип unsigned long,  
// т.к. время измеряется в миллисекундахи  int  переполняется
unsigned long lastDebounceTime = 0;  // время последней смены значения на выходе светодиода
unsigned long debounceDelay = 50;    // порог игнорирования дребезга. увеличить если есть "дребезг"

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  //устанавливаем начальное значение на выходе светодиода
  digitalWrite(ledPin, ledState);
}

void loop() {
  // считываем значание с выхода подлюченного к кнопке
  int reading = digitalRead(buttonPin);

  // проверяем если была нажата кнопка
  // (если значение сменилось с  LOW на HIGH), и подождали ли мы достаточно
  // чтобы отсечь дребезг:

  // Если значение изменилось либо от нажатия, либо от "дребезга"
  if (reading != lastButtonState) {
    // сбрасываем антидребезг таймер
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // если значение не менялось больше порогового, считаем его текущим

    // если значение на выходе кнопки изменилось
    if (reading != buttonState) {
      buttonState = reading;

      // переключаем светодиод, если на выходе кнопки HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // устанавливаем значение на выходе светодиода
  digitalWrite(ledPin, ledState);

  //сохраняем считанное значение как последниее, для следующего цикла
  lastButtonState = reading;
}

Более продвинутый пример с антидребезгом можно найти на старом форуме

Cм. также Библиотека для работы с кнопкой shButton

1 лайк

Может сразу еще один резистор и конденсатор добавить в схему? Чтобы вопрос дребезга сразу закрыть

IMHO лучше бы привести традиционную схему с замыканием кнопки на землю.

3 лайка

можно коротко услышать что такое дребезг? и зачем с ним бороться

https://arduinomaster.ru/datchiki-arduino/ustranenie-drebezg-kontaktov-knopki/

Кратковременные множественные замыкания-размыкания контактов кнопки при её нажатии вследствие несовершенства материи.

это типа того что когда контакты подгорают и в момент замыкания может быть много быстрых замыканий размыканий?, я правильно полнял?

Все правильно

Для неподгоревших контактов то же самое. Тут дело, скорее, в упругости материала и склонности любого макроскопического объекта к колебаниям при ударе.

Вот один из возможных “аппаратных” вариантов подавления дребезга. Пользую его сам.

В схеме кнопка “по классике” прижимает пин к GND, о чем ранее писал andriano

Соответственно, для использования этой схемы скетч из первого сообщения нужно поправить, инвертировав значения для пина.
Номинал резисторов уменьшать я бы не стал, а вот конденсатор нужно считать под конкретное железо. То, что на схеме, подходит для обычной китайской кнопки (и VDD 3v3)

Спойлер

У меня где-то есть маленький класс, который позволяет обрабатывать короткие и длинные нажатия кнопок. Поищу завтра на рабочем компе. Хотя, оно не нужно никому с вероятностью 99.9%. Для того, кто сможет с ним разобраться он не нужен. Для остальных достаточно и кода из #0

спасибо . приму к сведению, кондецатор любой можно - с полярностью и без , или только без…?

и еще вопрос всплывает сам собой , как дребезг проявляет себя в работе платы и всего что с ней связано?

Этот раздел не для вопросов и обучения. Это раздел ПРИМЕРОВ!! Единственный раздел форума, на котором допустимы учебные вопросы ПЕСОЧНИЦА!!!

Плата думает, что вместо одного нажатия кнопки произошло много.

Только что то в коде не видно проверки на то, что если переменная millis() будет меньше значения переменной lastDebounceTime
Я конечно понимаю, что Arduino включенным в розетку 50 дней никто держать не будет. Но бывает и всякое.

18 записей было перенесено в новую тему: Переполнение millis. Пьющий одмин. И вопросы разметки hdd

Этот вопрос гораздо шире. Резистор и конденсатор стоят денег, их установка тоже не бесплатная и плюс место на плате занимают. При миллионных тиражах это может вылиться в тысячи тугриков.
Так что нужно сразу определить область применения- для любительских или промышленных применений.
Хотя даже и в промышленных применениях схема с резистором и конденсатором надежнее в случае наличия помех на линии кнопки.
И емкость конденсатора зависит не от схемы, а от времени нажатия на кнопку. Кто то набирает на клаве 10 символов в минуту а кто то и 400 может. Емкость должна обеспечивать регистрацию нажатия и одновременно не пропустить дребезг.

Да мы тут проЭкты по сто-пицот мильонофф кубометров Ардуин выпускаем! Канжный пенис пенс на щшету!
Пришлось мот продать. места для пятой Феррари в гараже не хватило. Того и глади самокат продавать придется, а весчь исклюзивная - фара раритетной синей изолентой прикручена! Может на Порш поменять?

Это у китайцев теперь нужно спрашивать- если разрешат. А так бери кусочек кода и вставляй в прожку. Код бесплатный.