
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); // для примера выведем в порт
}
}