From 39e304497b98ec6c77ee67435a46cf80387ac716 Mon Sep 17 00:00:00 2001 From: gunner47 Date: Wed, 16 Oct 2019 22:49:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=BE=D0=B9:=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D0=B5=20-=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=8F=D1=80?= =?UTF-8?q?=D0=BA=D0=BE=D1=81=D1=82=D0=B8,=201=20=D0=BA=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=20+=20=D1=83=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20-=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82=D0=B8,=202=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=BA=D0=B0=20+=20=D1=83=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B0=D0=BD=D0=B8=D0=B5=20-=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B0=D1=81=D1=88=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/GyverLamp_v1.4/Constants.h | 6 +- firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino | 4 +- firmware/GyverLamp_v1.4/button.ino | 103 +++++++--- libraries/GyverButton/GyverButton.cpp | 217 +++++++++++---------- libraries/GyverButton/GyverButton.h | 147 +++++++------- 5 files changed, 273 insertions(+), 204 deletions(-) diff --git a/firmware/GyverLamp_v1.4/Constants.h b/firmware/GyverLamp_v1.4/Constants.h index 89069a6..a7fd519 100644 --- a/firmware/GyverLamp_v1.4/Constants.h +++ b/firmware/GyverLamp_v1.4/Constants.h @@ -8,12 +8,16 @@ #define ESP_MODE (1U) // 0U - WiFi точка доступа, 1U - клиент WiFi (подключение к роутеру) uint8_t espMode = ESP_MODE; // ESP_MODE может быть сохранён в энергонезависимую память и изменён в процессе работы лампы без необходимости её перепрошивки #define ESP_USE_BUTTON // если строка не закомментирована, должна быть подключена кнопка (иначе ESP может регистрировать "фантомные" нажатия и некорректно устанавливать яркость) +#if defined (ESP_USE_BUTTON) +#define BUTTON_STEP_TIMEOUT (100U) // каждые BUTTON_STEP_TIMEOUT мс будет генерироваться событие удержания кнопки (для регулировки яркости) +#define BUTTON_CLICK_TIMEOUT (500U) // максимальное время между нажатиями кнопки в мс, до достижения которого считается серия последовательных нажатий +#endif #define ESP_RESET_ON_START (false) // true - если при старте нажата кнопка (или кнопки нет!), сохранённые настройки будут сброшены; false - не будут #define ESP_HTTP_PORT (80U) // номер порта, который будет использоваться во время первой утановки имени WiFi сети (и пароля), к которой потом будет подключаться лампа в режиме WiFi клиента (лучше не менять) #define ESP_UDP_PORT (8888U) // номер порта, который будет "слушать" UDP сервер во время работы лампы как в режиме WiFi точки доступа, так и в режиме WiFi клиента (лучше не менять) #define ESP_CONN_TIMEOUT (7U) // время в секундах (ДОЛЖНО БЫТЬ МЕНЬШЕ 8, иначе сработает WDT), которое ESP будет пытаться подключиться к WiFi сети, после его истечения автоматически развернёт WiFi точку доступа #define ESP_CONF_TIMEOUT (300U) // время в секундах, которое ESP будет ждать ввода SSID и пароля WiFi сети роутера в конфигурационном режиме, после его истечения ESP перезагружается -#define GENERAL_DEBUG // если строка не закомментирована, будут выводиться отладочные сообщения +//#define GENERAL_DEBUG // если строка не закомментирована, будут выводиться отладочные сообщения #define WIFIMAN_DEBUG (true) // вывод отладочных сообщений при подключении к WiFi сети: true - выводятся, false - не выводятся; настройка не зависит от GENERAL_DEBUG #define OTA // если строка не закомментирована, модуль будет ждать два последдовательных запроса пользователя на прошивку по воздуху (см. документацию в "шапке") #ifdef OTA diff --git a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino index 660a820..101e1ff 100644 --- a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino +++ b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino @@ -224,8 +224,8 @@ void setup() // КНОПКА #if defined(ESP_USE_BUTTON) - touch.setStepTimeout(100); - touch.setClickTimeout(500); + touch.setStepTimeout(BUTTON_STEP_TIMEOUT); + touch.setClickTimeout(BUTTON_CLICK_TIMEOUT); #if ESP_RESET_ON_START delay(1000); // ожидание инициализации модуля кнопки ttp223 (по спецификации 250мс) if (digitalRead(BTN_PIN)) diff --git a/firmware/GyverLamp_v1.4/button.ino b/firmware/GyverLamp_v1.4/button.ino index f8ae719..3b1ae79 100644 --- a/firmware/GyverLamp_v1.4/button.ino +++ b/firmware/GyverLamp_v1.4/button.ino @@ -1,13 +1,16 @@ #ifdef ESP_USE_BUTTON -bool brightDirection; -static bool startButtonHolding = false; // флаг: кнопка удерживается для изменения яркости лампы +bool brightDirection; +static bool startButtonHolding = false; // флаг: кнопка удерживается для изменения яркости/скорости/масштаба лампы кнопкой + void buttonTick() { touch.tick(); uint8_t clickCount = touch.hasClicks() ? touch.getClicks() : 0U; + + // однократное нажатие if (clickCount == 1U) { if (dawnFlag) @@ -34,6 +37,8 @@ void buttonTick() #endif } + + // двухкратное нажатие if (ONflag && clickCount == 2U) { if (++currentMode >= (int8_t)MODE_AMOUNT) currentMode = 0; @@ -52,6 +57,8 @@ void buttonTick() #endif } + + // трёхкратное нажатие if (ONflag && clickCount == 3U) { if (--currentMode < 0) currentMode = MODE_AMOUNT - 1; @@ -70,6 +77,8 @@ void buttonTick() #endif } + + // четырёхкратное нажатие if (clickCount == 4U) { #ifdef OTA @@ -84,6 +93,8 @@ void buttonTick() #endif } + + // пятикратное нажатие if (clickCount == 5U) // вывод IP на лампу { if (espMode == 1U) @@ -94,11 +105,15 @@ void buttonTick() } } + + // шестикратное нажатие if (clickCount == 6U) // вывод текущего времени бегущей строкой { printTime(thisTime, true); } + + // семикратное нажатие if (ONflag && clickCount == 7U) // смена рабочего режима лампы: с WiFi точки доступа на WiFi клиент или наоборот { espMode = (espMode == 0U) ? 1U : 0U; @@ -113,39 +128,83 @@ void buttonTick() showWarning(CRGB::Red, 3000U, 500U); // мигание красным цветом 3 секунды - смена рабочего режима лампы, перезагрузка ESP.restart(); } - + + // кнопка только начала удерживаться if (ONflag && touch.isHolded()) { brightDirection = !brightDirection; startButtonHolding = true; } + + // кнопка нажата и удерживается if (ONflag && touch.isStep()) { - uint8_t delta = modes[currentMode].Brightness < 10U // определение шага изменения яркости: при яркости [1..10] шаг = 1, при [11..16] шаг = 3, при [17..255] шаг = 15 - ? 1U - : 5U; - modes[currentMode].Brightness = - constrain(brightDirection - ? modes[currentMode].Brightness + delta - : modes[currentMode].Brightness - delta, - 1, 255); - FastLED.setBrightness(modes[currentMode].Brightness); + switch (touch.getHoldClicks()) + { + case 0U: // просто удержание (до удержания кнопки кликов не было) - изменение яркости + { + uint8_t delta = modes[currentMode].Brightness < 10U // определение шага изменения яркости: при яркости [1..10] шаг = 1, при [11..16] шаг = 3, при [17..255] шаг = 15 + ? 1U + : 5U; + modes[currentMode].Brightness = + constrain(brightDirection + ? modes[currentMode].Brightness + delta + : modes[currentMode].Brightness - delta, + 1, 255); + FastLED.setBrightness(modes[currentMode].Brightness); + + #ifdef GENERAL_DEBUG + LOG.printf_P(PSTR("Новое значение яркости: %d\n"), modes[currentMode].Brightness); + #endif + + break; + } + + case 1U: // удержание после одного клика - изменение скорости + { + modes[currentMode].Speed = constrain(brightDirection ? modes[currentMode].Speed + 1 : modes[currentMode].Speed - 1, 1, 255); + + #ifdef GENERAL_DEBUG + LOG.printf_P(PSTR("Новое значение скорости: %d\n"), modes[currentMode].Speed); + #endif + + break; + } + + case 2U: // удержание после двух кликов - изменение масштаба + { + modes[currentMode].Scale = constrain(brightDirection ? modes[currentMode].Scale + 1 : modes[currentMode].Scale - 1, 1, 100); + + #ifdef GENERAL_DEBUG + LOG.printf_P(PSTR("Новое значение масштаба: %d\n"), modes[currentMode].Scale); + #endif + + break; + } + + default: + break; + } + settChanged = true; eepromTimeout = millis(); + } - #ifdef GENERAL_DEBUG - LOG.printf_P(PSTR("New brightness value: %d\n"), modes[currentMode].Brightness); + + // кнопка отпущена после удерживания + if (ONflag && !touch.isHold() && startButtonHolding) // кнопка отпущена после удерживания, нужно отправить MQTT сообщение об изменении яркости лампы + { + startButtonHolding = false; + loadingFlag = true; + + #if (USE_MQTT) + if (espMode == 1U) + { + MqttManager::needToPublish = true; + } #endif } - - #if (USE_MQTT) - if (espMode == 1U && ONflag && !touch.isHold() && startButtonHolding) // кнопка отпущена после удерживания, нужно отправить MQTT сообщение об изменении яркости лампы - { - MqttManager::needToPublish = true; - startButtonHolding = false; - } - #endif } #endif diff --git a/libraries/GyverButton/GyverButton.cpp b/libraries/GyverButton/GyverButton.cpp index 43816b9..807389e 100644 --- a/libraries/GyverButton/GyverButton.cpp +++ b/libraries/GyverButton/GyverButton.cpp @@ -2,183 +2,188 @@ #include GButton::GButton(uint8_t pin) { - _PIN = pin; - GButton::init(); + _PIN = pin; + GButton::init(); } GButton::GButton(uint8_t pin, boolean type, boolean dir) { - _PIN = pin; - GButton::init(); - GButton::setType(type); - flags.inv_state = dir; + _PIN = pin; + GButton::init(); + GButton::setType(type); + flags.inv_state = dir; } void GButton::init() { - _debounce = 60; - _timeout = 500; - _step_timeout = 400; - _click_timeout = 300; - flags.inv_state = NORM_OPEN; - flags.mode = false; - flags.type = false; - flags.tickMode = false; - GButton::setType(HIGH_PULL); + _debounce = 60; + _timeout = 500; + _step_timeout = 400; + _click_timeout = 300; + flags.inv_state = NORM_OPEN; + flags.mode = false; + flags.type = false; + flags.tickMode = false; + GButton::setType(HIGH_PULL); } void GButton::setDebounce(uint16_t debounce) { - _debounce = debounce; + _debounce = debounce; } void GButton::setTimeout(uint16_t timeout) { - _timeout = timeout; + _timeout = timeout; } void GButton::setClickTimeout(uint16_t timeout) { - _click_timeout = timeout; + _click_timeout = timeout; } void GButton::setStepTimeout(uint16_t step_timeout) { - _step_timeout = step_timeout; + _step_timeout = step_timeout; } void GButton::setType(boolean type) { - flags.type = type; - if (type) pinMode(_PIN, INPUT); - else pinMode(_PIN, INPUT_PULLUP); + flags.type = type; + if (type) pinMode(_PIN, INPUT); + else pinMode(_PIN, INPUT_PULLUP); } void GButton::setDirection(boolean dir) { - flags.inv_state = dir; + flags.inv_state = dir; } void GButton::setTickMode(boolean tickMode) { - flags.tickMode = tickMode; + flags.tickMode = tickMode; } boolean GButton::isPress() { - if (flags.tickMode) GButton::tick(); - if (flags.isPress_f) { - flags.isPress_f = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.isPress_f) { + flags.isPress_f = false; + return true; + } else return false; } boolean GButton::isRelease() { - if (flags.tickMode) GButton::tick(); - if (flags.isRelease_f) { - flags.isRelease_f = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.isRelease_f) { + flags.isRelease_f = false; + return true; + } else return false; } -boolean GButton::isClick() { - if (flags.tickMode) GButton::tick(); - if (flags.isOne_f) { - flags.isOne_f = false; - return true; - } else return false; +boolean GButton::isClick() { + if (flags.tickMode) GButton::tick(); + if (flags.isOne_f) { + flags.isOne_f = false; + return true; + } else return false; } boolean GButton::isHolded() { - if (flags.tickMode) GButton::tick(); - if (flags.isHolded_f) { - flags.isHolded_f = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.isHolded_f) { + flags.isHolded_f = false; + return true; + } else return false; } boolean GButton::isHold() { - if (flags.tickMode) GButton::tick(); - if (flags.step_flag) return true; - else return false; + if (flags.tickMode) GButton::tick(); + if (flags.step_flag) return true; + else return false; } boolean GButton::state() { - if (flags.tickMode) GButton::tick(); - return flags.btn_state; + if (flags.tickMode) GButton::tick(); + return flags.btn_state; } boolean GButton::isSingle() { - if (flags.tickMode) GButton::tick(); - if (flags.counter_flag && last_counter == 1) { - flags.counter_flag = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.counter_flag && last_counter == 1) { + flags.counter_flag = false; + return true; + } else return false; } boolean GButton::isDouble() { - if (flags.tickMode) GButton::tick(); - if (flags.counter_flag && last_counter == 2) { - flags.counter_flag = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.counter_flag && last_counter == 2) { + flags.counter_flag = false; + return true; + } else return false; } boolean GButton::isTriple() { - if (flags.tickMode) GButton::tick(); - if (flags.counter_flag && last_counter == 3) { - flags.counter_flag = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.counter_flag && last_counter == 3) { + flags.counter_flag = false; + return true; + } else return false; } boolean GButton::hasClicks() { - if (flags.tickMode) GButton::tick(); - if (flags.counter_flag) { - flags.counter_flag = false; - return true; - } else return false; + if (flags.tickMode) GButton::tick(); + if (flags.counter_flag) { + flags.counter_flag = false; + return true; + } else return false; } uint8_t GButton::getClicks() { - return last_counter; + return last_counter; } boolean GButton::isStep() { - if (flags.tickMode) GButton::tick(); - if (flags.step_flag && (millis() - btn_timer >= _step_timeout)) { - btn_timer = millis(); - return true; - } - else return false; + if (flags.tickMode) GButton::tick(); + if (flags.step_flag && (millis() - btn_timer >= _step_timeout)) { + btn_timer = millis(); + return true; + } + else return false; +} +uint8_t GButton::getHoldClicks() { + if (flags.tickMode) GButton::tick(); + return flags.hold_flag ? last_hold_counter : 0; } void GButton::tick(boolean state) { - flags.mode = true; - flags.btn_state = state ^ flags.inv_state; - GButton::tick(); - flags.mode = false; + flags.mode = true; + flags.btn_state = state ^ flags.inv_state; + GButton::tick(); + flags.mode = false; } -void GButton::tick() { +void GButton::tick() { // читаем пин if (!flags.mode) flags.btn_state = !digitalRead(_PIN) ^ (flags.inv_state ^ flags.type); - + // нажатие if (flags.btn_state && !flags.btn_flag) { - if (!flags.btn_deb) { - flags.btn_deb = true; - btn_timer = millis(); - } else { - if (millis() - btn_timer >= _debounce) { - flags.btn_flag = true; - flags.isPress_f = true; - flags.oneClick_f = true; - } - } + if (!flags.btn_deb) { + flags.btn_deb = true; + btn_timer = millis(); + } else { + if (millis() - btn_timer >= _debounce) { + flags.btn_flag = true; + flags.isPress_f = true; + flags.oneClick_f = true; + } + } } else { - flags.btn_deb = false; + flags.btn_deb = false; } // отпускание if (!flags.btn_state && flags.btn_flag) { flags.btn_flag = false; - if (!flags.hold_flag) btn_counter++; + if (!flags.hold_flag) btn_counter++; flags.hold_flag = false; flags.isRelease_f = true; - btn_timer = millis(); - flags.step_flag = false; - if (flags.oneClick_f) { - flags.oneClick_f = false; - flags.isOne_f = true; - } + btn_timer = millis(); + flags.step_flag = false; + if (flags.oneClick_f) { + flags.oneClick_f = false; + flags.isOne_f = true; + } } // кнопка удерживается if (flags.btn_flag && flags.btn_state && (millis() - btn_timer >= _timeout) && !flags.hold_flag) { flags.hold_flag = true; + last_hold_counter = btn_counter; btn_counter = 0; - last_counter = 0; + last_counter = 0; flags.isHolded_f = true; - flags.step_flag = true; - flags.oneClick_f = false; - btn_timer = millis(); + flags.step_flag = true; + flags.oneClick_f = false; + btn_timer = millis(); } // обработка накликивания if ((millis() - btn_timer >= _click_timeout) && (btn_counter != 0)) { last_counter = btn_counter; btn_counter = 0; - flags.counter_flag = true; + flags.counter_flag = true; } } \ No newline at end of file diff --git a/libraries/GyverButton/GyverButton.h b/libraries/GyverButton/GyverButton.h index 42044f8..2464f42 100644 --- a/libraries/GyverButton/GyverButton.h +++ b/libraries/GyverButton/GyverButton.h @@ -3,95 +3,96 @@ #include /* - GyverButton - библиотека для многофункциональной отработки нажатия кнопки. Возможности: - - Работа с нормально замкнутыми и нормально разомкнутыми кнопками - - Работа с подключением PULL_UP и PULL_DOWN - - Опрос кнопки с программным антидребезгом контактов - - Настраиваемое время антидребезга - - Отработка нажатия, удерживания, отпускания, клика по кнопке - - Настраиваемый таймаут удержания - - Отработка одиночного, двойного и тройного нажатия (вынесено отдельно) - - Отработка любого количества нажатий кнопки (функция возвращает количество нажатий) - - Настраиваемый таймаут повторного нажатия/удержания - - Функция изменения значения переменной с заданным шагом и заданным интервалом по времени - - Возможность опрашивать не кнопку, а напрямую давать величину (все возможности библиотеки для матричных и резистивных клавиатур) - - Текущая версия: 2.12 от 18.03.2019: - - Поправлены баги при совместной работе методов опроса + GyverButton - библиотека для многофункциональной отработки нажатия кнопки. Возможности: + - Работа с нормально замкнутыми и нормально разомкнутыми кнопками + - Работа с подключением PULL_UP и PULL_DOWN + - Опрос кнопки с программным антидребезгом контактов + - Настраиваемое время антидребезга + - Отработка нажатия, удерживания, отпускания, клика по кнопке + - Настраиваемый таймаут удержания + - Отработка одиночного, двойного и тройного нажатия (вынесено отдельно) + - Отработка любого количества нажатий кнопки (функция возвращает количество нажатий) + - Настраиваемый таймаут повторного нажатия/удержания + - Функция изменения значения переменной с заданным шагом и заданным интервалом по времени + - Возможность опрашивать не кнопку, а напрямую давать величину (все возможности библиотеки для матричных и резистивных клавиатур) + + Текущая версия: 2.12 от 18.03.2019: + - Поправлены баги при совместной работе методов опроса */ #pragma pack(push,1) typedef struct -{ - bool btn_state: 1; - bool btn_deb: 1; - bool btn_flag: 1; - bool hold_flag: 1; - bool counter_flag: 1; - bool isHolded_f: 1; - bool isRelease_f: 1; - bool isPress_f: 1; - bool step_flag: 1; - bool oneClick_f: 1; - bool isOne_f: 1; - bool inv_state: 1; - bool mode: 1; - bool type: 1; - bool tickMode: 1; +{ + bool btn_state: 1; + bool btn_deb: 1; + bool btn_flag: 1; + bool hold_flag: 1; + bool counter_flag: 1; + bool isHolded_f: 1; + bool isRelease_f: 1; + bool isPress_f: 1; + bool step_flag: 1; + bool oneClick_f: 1; + bool isOne_f: 1; + bool inv_state: 1; + bool mode: 1; + bool type: 1; + bool tickMode: 1; } GyverButtonFlags; #pragma pack(pop) class GButton { public: - GButton(uint8_t pin); // класс кнопки, принимает пин + 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 - кнопка по умолчанию замкнута + 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); // установка таймаута удержания (по умолчанию 300 мс) - void setClickTimeout(uint16_t timeout); // установка таймаута между кликами (по умолчанию 500 мс) - 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 setDebounce(uint16_t debounce); // установка времени антидребезга (по умолчанию 80 мс) + void setTimeout(uint16_t timeout); // установка таймаута удержания (по умолчанию 300 мс) + void setClickTimeout(uint16_t timeout); // установка таймаута между кликами (по умолчанию 500 мс) + 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 setTickMode(boolean tickMode); // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick() - // MANUAL - нужно вызывать функцию tick() вручную - // AUTO - tick() входит во все остальные функции и опрашивается сама + void tick(); // опрос кнопки + void tick(boolean state); // опрос внешнего значения (0 нажато, 1 не нажато) (для матричных, резистивных клавиатур и джойстиков) - 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 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(); // вернуть количество кликов + uint8_t getHoldClicks();// вернуть количество кликов, предшествующее удержанию кнопки (для шаблона управления "клик + удержание") + + boolean isStep(); // возвращает true по таймеру setStepTimeout, смотри пример - boolean isSingle(); // возвращает true при одиночном клике. Сбрасывается после вызова - boolean isDouble(); // возвращает true при двойном клике. Сбрасывается после вызова - boolean isTriple(); // возвращает true при тройном клике. Сбрасывается после вызова - - boolean hasClicks(); // проверка на наличие кликов. Сбрасывается после вызова - uint8_t getClicks(); // вернуть количество кликов - - boolean isStep(); // возвращает true по таймеру setStepTimeout, смотри пример - private: - void init(); - GyverButtonFlags flags; - uint8_t _PIN = 0; - uint16_t _debounce = 0; - uint16_t _timeout = 0; - uint16_t _click_timeout = 0; - uint16_t _step_timeout = 0; - uint8_t btn_counter = 0, last_counter = 0; - uint32_t btn_timer = 0; + void init(); + GyverButtonFlags flags; + uint8_t _PIN = 0; + uint16_t _debounce = 0; + uint16_t _timeout = 0; + uint16_t _click_timeout = 0; + uint16_t _step_timeout = 0; + uint8_t btn_counter = 0, last_counter = 0, last_hold_counter = 0; + uint32_t btn_timer = 0; }; #define HIGH_PULL 0