Подключение кнопки к ардуино

Сегодня поговорим о подключении кнопок к Ардуино. Подключения кнопок бывают 3-х видов.
План.
•    Быстрое ознакомление с подключением кнопок.
•    Помигаем светодиодами управляя одной кнопкой.
•    Напишем скетч плавного включения светодиода от нажатия кнопки.
•    Подключим библиотеку Bounce2 и научимся с ней работать.
•    Напишем скетч, который будет управлять разными устройствами всего одной кнопкой.
•    Изучим обработчик кнопки с одним, двумя, тремя и длительностью нажатия кнопки.

Вместо светодиода вы можете подключить любую, другую нагрузку.
Например, плавно включать и выключать электромоторчик,лампу и другое. 
В этом уроке будет много примеров, так что приготовьтесь.

 

Так что же такое кнопка?
Кнопка – простейшее электромеханическое устройство, замыкающее и размыкающее электрическую цепь. 

Кнопки бывают двух видов.
Кнопки – переключатели, с фиксированным положением.

выключатель     выключатель
и не фиксированным положением. Они называются - тактовые кнопки

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

В своей работе мы постоянно сталкиваемся с кнопками. 
Обычная тактовая кнопка, применяемая в устройствах на Ардуино выглядит так.

Существует много различных способов подключить кнопки.

Если кнопка без дополнительного резистора, то в тот момент когда она не нажата, получается, что один контакт висит в воздухе и на него действуют разные внешние факторы. Например электрические наводки. Даже если просто пошатать провод, то это может изменить состояние кнопки.
Поэтому используют так называемые подтяжки.
Верхние (pull-up) Один вывод кнопки подключается к минусу, а другой через резистор 10кОм  подключается к плюсу питания. 
Нижние (pull-down) Один вывод кнопки подключается к плюсу питания. а другой через резистор 10кОм  подключается к земле. 

PULL-UP       PULL-DOWN

ПОДКЛЮЧЕНИЕ КНОПКИ                   ПОДКЛЮЧЕНИЕ КНОПКИ

Есть ещё внутренняя подтяжка - Internal PULL-UP подтягивающий резистор 20 кОм.

внутренняя подтяжка          внутренняя подтяжка
Вот его мы и будем использовать, упростив тем самым схему и уменьшив количество используемых деталей.
Правда тогда при нажатой кнопке у нас будет сигнал LOW или 0, а при отжатой будет HIGH или 1. Как бы всё наоборот.


Я в своих примерах будем использовать внутреннюю подтяжку. 
Во-первых это правильно - разработчики ведь не зря это придумали, а во вторых не надо подключать дополнительный резистор, тем самым сэкономив место на плате.

Главная проблема кнопок – это дребезг контактов,  и чем старея кнопка, тем хуже контакт.
Механические контакты в кнопках никогда не замыкаются или размыкаются мгновенно. 
В течении нескольких миллисекунд происходит многократное замыкание и размыкание контактов — в итоге на микроконтроллер поступает не один сигнал, а серия импульсов. Самый простой способ избавиться от этого применить задержку в несколько миллисекунд используя, на пример delay().
Можно также использовать конденсатор параллельно контактам кнопки.

Для того, чтобы определить, была ли нажата кнопка, надо просто зафиксировать факт ее нажатия и сохранить признак в специальной переменной.

Давайте рассмотрим самый простой пример.
Зажжём светодиод при нажатой кнопке, и погасим его при отжатой.

Сначала определяем константы для хранения номеров выводов Ардуино к которым мы подключаем кнопку и светодиод.
Кнопка у нас будет подключена к выводу 2, а светодиод к выводу 3.

Указываем, что вывод к которому подключен светодиод должен работать на выход, а кнопка должна работать в режиме внутреннего Internal PULL-UP.
Считываем значение кнопки функцией digitalRead()
Так как кнопка у нас подключена к земле, при нажатии мы получим ноль , а нам нужна единица. Поэтому инвертируем значение, то есть переворачиваем. 
Если было 0 то будет 1, и наоборот.
И делаем небольшую задержку для устранения дребезга.

// Объявляем константу для кнопки и присваиваем ей значение 2(номер pin(вывода) на плате Ардуино). 
 const int BUTTON_PIN = 2; 
// Объявляем константу для светодиода и присваиваем ей значение 3(номер pin(вывода) на плате Ардуино).
 const int LED_PIN = 3;   

void setup()
{
// Кнопка.Настраиваем вывод 3 Ардуино на Выход
 pinMode(LED_PIN, OUTPUT); 
// Светодиод. Настраиваем вывод 2 - в режиме Входа.  Включаем внутренний pull-up резистор  
 pinMode(BUTTON_PIN, INPUT_PULLUP);
//подключаем подтягивающий резистор   
 digitalWrite(BUTTON_PIN, HIGH);   
}
 
void loop()
{
// считываем состояние кнопки, инвертируем значение  и переключаем светодиод
 digitalWrite(LED_PIN, !digitalRead(BUTTON_PIN)); 
}

Второй пример. Будем плавно включать светодиод нажатием на кнопку.

//Плавно зажигаем светодиод, а затем плавно гасим.

// Объявляем константу для кнопки и присваиваем ей значение 2(номер pin(вывода)). 
  const int BUTTON_PIN = 2;
  // Объявляем константу для светодиода и присваиваем ей значение 3(номер pin(вывода)).                   
  const int LED_PIN = 3;    
int i=0; 

void setup()     
 { 
  Serial.begin(9600);
// Кнопка.Настраиваем вывод 3 Ардуино на Выход
  pinMode(LED_PIN, OUTPUT);
// Настраиваем вывод 2 - в режиме Входа.  Включаем  pull-up резистор                        
  pinMode(BUTTON_PIN, INPUT_PULLUP);                 
  digitalWrite(BUTTON_PIN, HIGH);                  
 } 

void loop()
{
// плавное включение светодиода
  if(!digitalRead(BUTTON_PIN) == HIGH) {
    analogWrite(LED_PIN, i);
    delay(50);  // Задержка. Для устранения дребезга контактов кнопки.
    i++;
    if(i > 255) i=0;  // Если значение переменой i больше 255, то обнуляем.
    Serial.println(i);
  }
//  else {  // При отпускании кнопки значение переменой i становится равной нулю.
//    analogWrite(LED_PIN, 0);
//    i=0;
//  }
}

У всех этих примеров есть 1 недостаток.
Все они используют функцию delay(). Она просто тормозит Ардуино и не даёт выполнять программу дальше пока не закончится время указанное в delay()
Чтобы избавиться от неё надо воспользоваться функцией millis()
Это функция, возвращающая количество миллисекунд с момента начала выполнения программы на плате Arduino. 

Напишем код, который будет сам плавно зажигать светодиод. 
Для этого нам понадобится выход, на микроконтроллере Ардуино, который поддерживаем ШИМ(PWM).
Про это у меня тоже были уроки. 
Создаём глобальную переменную i.
Всё остальное оставляем из прошлого примера без изменения.
Считываем значение с кнопки и если она нажата, то начинаем увеличивать переменную i на единицу.
И так пока она не будет равна 255, а затем сбрасываем значение в 0.
Это максимальное значение.
0 – это полное выключение светодиода, а 255 самое яркое свечение. 
Этот пример можно использовать для вращения моторчика или для ночника.

Теперь добавим пару строчек которые будут сбрасывать переменную i в ноль при отпускании кнопки, если снова нажать на кнопку цикл начнётся заново.

Дополнительные материалы по теме
Подключение кнопки к ардуино
TTP223 сенсорная кнопка
Резистивные кнопки
Управление одной кнопкой на ESP
Первая программа на Arduino. Aрдуино для начинающих
Digital Read Arduino
Количество нажатий на кнопку
Управление светодиодами кнопкой на Ардуино
Кнопка, дребезг контактов при нажатии
input pullup arduino кнопка
Analog Read Arduino