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

ATWatch имеет 3 кнопки.
Кнопка №1(Нижняя): 2 пин (подключена к прерыванию INT2)
Кнопка №2(Средняя): 12 пин
Кнопка №3(Верхняя): 13 пин
Кнопка по умолчанию подключена к земле через резистор(LOW), а после нажатия получает 3.3В(HIGH).





Работа с библиотекой GyverButton

Скачать библиотеку можно тут
Видео от автора тут
Для правильной работы кнопок необходимо конфигурировать их как LOW_PULL и NORM_OPEN.

Например:

#include "GyverButton.h"
#define BTN1 2
#define BTN2 12
#define BTN3 13
GButton butt1(BTN1, LOW_PULL, NORM_OPEN);
GButton butt2(BTN2, LOW_PULL, NORM_OPEN);
GButton butt3(BTN3, LOW_PULL, NORM_OPEN);

Вырезка из документации библиотеки

GButton(uint8_t pin);
// класс кнопки, принимает пин
GButton(uint8_t PIN, boolean type, boolean dir);    
// класс кнопки, принимает PIN пин, тип type (HIGH_PULL / LOW_PULL) и направление dir (NORM_OPEN / NORM_CLOSE)
// HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC, pinMode - INPUT_PULLUP (по умолчанию)
// LOW_PULL - кнопка подключена к VCC, пин подтянут к GND, pinMode - INPUT
// NORM_OPEN - кнопка по умолчанию разомкнута
// NORM_CLOSE - кнопка по умолчанию замкнута
void setDebounce(uint16_t debounce);           // установка времени антидребезга (по умолчанию 80 мс)
void setTimeout(uint16_t timeout);             // установка таймаута удержания (по умолчанию 500 мс) 
void setClickTimeout(uint16_t timeout);        // установка таймаута между нажатиями (по умолчанию 300 мс)
void setStepTimeout(uint16_t step_timeout);    // установка таймаута между инкрементами (по умолчанию 400 мс)
void setType(boolean type);                    // установка типа кнопки (HIGH_PULL - подтянута к питанию, LOW_PULL - к gnd) 
void setDirection(boolean dir);                // установка направления (разомкнута/замкнута по умолчанию - NORM_OPEN, NORM_CLOSE) 
void setTickMode(boolean tickMode);            // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick() 
// MANUAL - нужно вызывать функцию tick() вручную              
// AUTO - tick() входит во все остальные функции и опрашивается сама
void tick();                                   // опрос кнопки 
void tick(boolean state);                      // опрос внешнего значения (0 нажато, 1 не нажато) (для матричных, резистивных клавиатур и джойстиков)
boolean isPress();      // возвращает true при нажатии на кнопку. Сбрасывается после вызова
boolean isRelease();    // возвращает true при отпускании кнопки. Сбрасывается после вызова
boolean isClick();      // возвращает true при клике. Сбрасывается после вызова
boolean isHolded();     // возвращает true при удержании дольше timeout. Сбрасывается после вызова
boolean isHold();       // возвращает true при нажатой кнопке, не сбрасывается
boolean state();        // возвращает состояние кнопки
boolean isSingle();     // возвращает true при одиночном клике. Сбрасывается после вызова
boolean isDouble();     // возвращает true при двойном клике. Сбрасывается после вызова
boolean isTriple();     // возвращает true при тройном клике. Сбрасывается после вызова
boolean hasClicks();    // проверка на наличие кликов. Сбрасывается после вызова
uint8_t getClicks();    // вернуть количество кликов
boolean isStep();       // возвращает true по таймеру setStepTimeout, смотри пример

Пример использования библиотеки для изменения значения переменной двумя кнопками. Код предусматривает как одиночные нажатия, так и зажатия кнопки.

  1. #include "GyverButton.h"
  2.  
  3. #define BTN1 13	
  4. #define BTN2 2   
  5.  
  6. GButton butt1(BTN1, LOW_PULL, NORM_OPEN);
  7. GButton butt2(BTN2, LOW_PULL, NORM_OPEN );
  8. int value = 0;
  9.  
  10. void setup() {
  11.   Serial.begin(9600);
  12. }
  13.  
  14. void loop() {
  15.   butt1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  16.   butt2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  17.  
  18.   if (butt1.isClick()) {           // одиночное нажатие
  19.     value++;                       // инкремент
  20.     Serial.println(value);         // для примера выведем в порт
  21.   }
  22.  
  23.   if (butt2.isClick()) {           // одиночное нажатие
  24.     value--;                       // декремент
  25.     Serial.println(value);         // для примера выведем в порт
  26.   }
  27.  
  28.   if (butt1.isStep()) {            // обработчик удержания с шагами
  29.     value++;                       // увеличивать/уменьшать переменную value с шагом и интервалом!
  30.     Serial.println(value);         // для примера выведем в порт
  31.   }
  32.  
  33.   if (butt2.isStep()) {            // обработчик удержания с шагами
  34.     value--;                       // увеличивать/уменьшать переменную value с шагом и интервалом!
  35.     Serial.println(value);         // для примера выведем в порт
  36.   }
  37. }