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

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, смотри пример

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

#include "GyverButton.h"

#define BTN1 13	
#define BTN2 2   

GButton butt1(BTN1, LOW_PULL, NORM_OPEN);
GButton butt2(BTN2, LOW_PULL, NORM_OPEN );
int value = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  butt1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  butt2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

  if (butt1.isClick()) {           // одиночное нажатие
    value++;                       // инкремент
    Serial.println(value);         // для примера выведем в порт
  }

  if (butt2.isClick()) {           // одиночное нажатие
    value--;                       // декремент
    Serial.println(value);         // для примера выведем в порт
  }

  if (butt1.isStep()) {            // обработчик удержания с шагами
    value++;                       // увеличивать/уменьшать переменную value с шагом и интервалом!
    Serial.println(value);         // для примера выведем в порт
  }

  if (butt2.isStep()) {            // обработчик удержания с шагами
    value--;                       // увеличивать/уменьшать переменную value с шагом и интервалом!
    Serial.println(value);         // для примера выведем в порт
  }
}