├── .gitattributes ├── .github └── workflows │ └── tg-send.yml ├── LICENSE ├── README.md ├── README_EN.md ├── examples ├── Gbutton_demo │ └── Gbutton_demo.ino ├── Gbutton_example │ └── Gbutton_example.ino ├── Gbutton_example_auto │ └── Gbutton_example_auto.ino ├── Gbutton_interrupt │ └── Gbutton_interrupt.ino ├── Gbutton_timer_interrupt │ └── Gbutton_timer_interrupt.ino ├── _1-2-3-click │ └── _1-2-3-click.ino ├── _5_buttons │ └── _5_buttons.ino ├── _5_buttons_auto │ └── _5_buttons_auto.ino ├── analogKeyboard │ ├── analogBtns.jpg │ └── analogKeyboard.ino ├── analogKeyboardG │ └── analogKeyboardG.ino ├── btn_pinChangeInt │ └── btn_pinChangeInt.ino ├── clicks_step │ └── clicks_step.ino ├── increment │ └── increment.ino └── many_clicks │ └── many_clicks.ino ├── keywords.txt ├── library.properties └── src ├── AnalogKey.h ├── GyverButton.cpp └── GyverButton.h /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/tg-send.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Telegram Message 3 | on: 4 | release: 5 | types: [published] 6 | jobs: 7 | build: 8 | name: Send Message 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: send telegram message on push 12 | uses: appleboy/telegram-action@master 13 | with: 14 | to: ${{ secrets.TELEGRAM_TO }} 15 | token: ${{ secrets.TELEGRAM_TOKEN }} 16 | disable_web_page_preview: true 17 | message: | 18 | ${{ github.event.repository.name }} v${{ github.event.release.tag_name }} 19 | ${{ github.event.release.body }} 20 | https://github.com/${{ github.repository }} 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 AlexGyver 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![latest](https://img.shields.io/github/v/release/GyverLibs/GyverButton.svg?color=brightgreen)](https://github.com/GyverLibs/GyverButton/releases/latest/download/GyverButton.zip) 2 | [![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/) 3 | [![Foo](https://img.shields.io/badge/%E2%82%BD$%E2%82%AC%20%D0%9D%D0%B0%20%D0%BF%D0%B8%D0%B2%D0%BE-%D1%81%20%D1%80%D1%8B%D0%B1%D0%BA%D0%BE%D0%B9-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/) 4 | [![Foo](https://img.shields.io/badge/README-ENGLISH-blueviolet.svg?style=flat-square)](https://github-com.translate.goog/GyverLibs/GyverButton?_x_tr_sl=ru&_x_tr_tl=en) 5 | 6 | [![Foo](https://img.shields.io/badge/ПОДПИСАТЬСЯ-НА%20ОБНОВЛЕНИЯ-brightgreen.svg?style=social&logo=telegram&color=blue)](https://t.me/GyverLibs) 7 | 8 | |⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

**ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ БИБЛИОТЕКУ [EncButton](https://github.com/GyverLibs/EncButton), ОНА ЛЕГЧЕ И ИМЕЕТ БОЛЬШЕ ВОЗМОЖНОСТЕЙ**

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️| 9 | | --- | 10 | 11 | # GyverButton 12 | Библиотека для многофункциональной отработки нажатия кнопки 13 | - Работа с нормально замкнутыми и нормально разомкнутыми кнопками 14 | - Работа с подключением PULL_UP и PULL_DOWN 15 | - Опрос кнопки с программным антидребезгом контактов (настраиваемое время) 16 | - Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов) 17 | - Отработка одиночного, двойного и тройного нажатия (вынесено отдельно) 18 | - Отработка любого количества нажатий кнопки (функция возвращает количество нажатий) 19 | - Функция изменения значения переменной с заданным шагом и заданным интервалом по времени 20 | - Возможность работы с "виртуальными" кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур) 21 | 22 | ### Совместимость 23 | Совместима со всеми Arduino платформами (используются Arduino-функции) 24 | 25 | ### Документация 26 | К библиотеке есть [расширенная документация](https://alexgyver.ru/GyverButton/) 27 | 28 | ## Содержание 29 | - [Установка](#install) 30 | - [Инициализация](#init) 31 | - [Использование](#usage) 32 | - [Пример](#example) 33 | - [Версии](#versions) 34 | - [Баги и обратная связь](#feedback) 35 | 36 | 37 | ## Установка 38 | - Библиотеку можно найти по названию **GyverButton** и установить через менеджер библиотек в: 39 | - Arduino IDE 40 | - Arduino IDE v2 41 | - PlatformIO 42 | - [Скачать библиотеку](https://github.com/GyverLibs/GyverButton/archive/refs/heads/main.zip) .zip архивом для ручной установки: 43 | - Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64) 44 | - Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32) 45 | - Распаковать и положить в *Документы/Arduino/libraries/* 46 | - (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив 47 | - Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 48 | ### Обновление 49 | - Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи 50 | - Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить" 51 | - Вручную: **удалить папку со старой версией**, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам! 52 | 53 | 54 | 55 | ## Инициализация 56 | ```cpp 57 | GButton btn; // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 58 | GButton btn(пин); // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 59 | GButton btn(пин, тип подключ.); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN) 60 | GButton btn(пин, тип подключ., тип кнопки); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 61 | GButton btn(BTN_NO_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 62 | ``` 63 | 64 | 65 | ## Использование 66 | ```cpp 67 | void setDebounce(uint16_t debounce); // установка времени антидребезга (по умолчанию 80 мс) 68 | void setTimeout(uint16_t timeout); // установка таймаута удержания (по умолчанию 300 мс) 69 | void setClickTimeout(uint16_t timeout); // установка таймаута между кликами (по умолчанию 500 мс) 70 | void setStepTimeout(uint16_t step_timeout); // установка таймаута между инкрементами (по умолчанию 400 мс) 71 | void setType(uint8_t type); // установка типа кнопки (HIGH_PULL - подтянута к питанию, LOW_PULL - к gnd) 72 | void setDirection(uint8_t dir); // установка направления (разомкнута/замкнута по умолчанию - NORM_OPEN, NORM_CLOSE) 73 | 74 | void setTickMode(uint8_t tickMode); // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick() 75 | // MANUAL - нужно вызывать функцию tick() вручную 76 | // AUTO - tick() входит во все остальные функции и опрашивается сама 77 | 78 | void tick(); // опрос кнопки 79 | void tick(boolean state); // опрос внешнего значения (0 нажато, 1 не нажато) (для матричных, резистивных клавиатур и джойстиков) 80 | 81 | boolean isPress(); // возвращает true при нажатии на кнопку. Сбрасывается после вызова 82 | boolean isRelease(); // возвращает true при отпускании кнопки. Сбрасывается после вызова 83 | boolean isClick(); // возвращает true при клике. Сбрасывается после вызова 84 | boolean isHolded(); // возвращает true при удержании дольше timeout. Сбрасывается после вызова 85 | boolean isHold(); // возвращает true при нажатой кнопке, не сбрасывается 86 | boolean state(); // возвращает состояние кнопки 87 | boolean isSingle(); // возвращает true при одиночном клике. Сбрасывается после вызова 88 | boolean isDouble(); // возвращает true при двойном клике. Сбрасывается после вызова 89 | boolean isTriple(); // возвращает true при тройном клике. Сбрасывается после вызова 90 | 91 | boolean hasClicks(); // проверка на наличие кликов. Сбрасывается после вызова 92 | uint8_t getClicks(); // вернуть количество кликов 93 | uint8_t getHoldClicks();// вернуть количество кликов, предшествующее удерживанию 94 | 95 | boolean isStep(); // возвращает true по таймеру setStepTimeout, смотри пример 96 | void resetStates(); // сбрасывает все is-флаги и счётчики 97 | ``` 98 | 99 | 100 | ## Пример 101 | Остальные примеры смотри в **examples**! 102 | ```cpp 103 | // Пример использования библиотеки GyverButton, все возможности в одном скетче. 104 | 105 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 106 | 107 | #include "GyverButton.h" 108 | GButton butt1(BTN_PIN); 109 | 110 | // Варианты инициализации: 111 | // GButton btn; // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 112 | // GButton btn(пин); // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 113 | // GButton btn(пин, тип подключ.); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN) 114 | // GButton btn(пин, тип подключ., тип кнопки); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 115 | // GButton btn(BTN_NO_BTN_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 116 | 117 | int value = 0; 118 | 119 | void setup() { 120 | Serial.begin(9600); 121 | 122 | butt1.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс) 123 | butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) 124 | butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс) 125 | 126 | // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND) 127 | // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND 128 | // по умолчанию стоит HIGH_PULL 129 | butt1.setType(HIGH_PULL); 130 | 131 | // NORM_OPEN - нормально-разомкнутая кнопка 132 | // NORM_CLOSE - нормально-замкнутая кнопка 133 | // по умолчанию стоит NORM_OPEN 134 | butt1.setDirection(NORM_OPEN); 135 | } 136 | 137 | void loop() { 138 | butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 139 | 140 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 141 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 142 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 143 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 144 | 145 | if (butt1.hasClicks()) // проверка на наличие нажатий 146 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 147 | 148 | if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) 149 | if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) 150 | if (butt1.isHold()) { // если кнопка удерживается 151 | Serial.print("Holding "); // выводим пока удерживается 152 | Serial.println(butt1.getHoldClicks()); // можно вывести количество кликов перед удержанием! 153 | } 154 | if (butt1.isHold()) Serial.println("Holding"); // проверка на удержание 155 | //if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки 156 | 157 | if (butt1.isStep()) { // если кнопка была удержана (это для инкремента) 158 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом 159 | Serial.println(value); // для примера выведем в порт 160 | } 161 | } 162 | ``` 163 | 164 | 165 | ## Версии 166 | - v2.15: Добавлена возможность объявить кнопку без привязки к пину 167 | - v3.0: Ускорен и оптимизирован код, переделана инициализация, дополнены примеры 168 | - v3.1: isStep может принимать количество кликов, сделанных перед ним (см. пример clicks_step) 169 | - v3.2: Добавлен метод getHoldClicks() - вернуть количество кликов, предшествующее удерживанию 170 | - v3.3: Мелкие исправления 171 | - v3.4: Добавлен метод resetStates(), сбрасывающий состояния и счётчики 172 | - v3.5: увелична производительность для AVR Arduino 173 | - v3.6: добавлен отдельный класс для работы с аналоговыми клавиатурами, см пример analogKeyboardG 174 | - v3.7: исправления от Dryundel: 175 | - Любой таймаут удержания 176 | - Single, Double и Triple теперь не мешают hasClicks и getClicks и работают совместно 177 | - isStep() тоже теперь ничего не мешает и он работает более корректно 178 | - v3.8: исправления от Dryundel 179 | 180 | 181 | ## Баги и обратная связь 182 | При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru) 183 | Библиотека открыта для доработки и ваших **Pull Request**'ов! 184 | 185 | 186 | При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать: 187 | - Версия библиотеки 188 | - Какой используется МК 189 | - Версия SDK (для ESP) 190 | - Версия Arduino IDE 191 | - Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде 192 | - Какой код загружался, какая работа от него ожидалась и как он работает в реальности 193 | - В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код 194 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | This is an automatic translation, may be incorrect in some places. See sources and examples! 2 | 3 | ## WARNING, THE LIBRARY IS OUT OF DATE! 4 | ### USE THE [EncButton] LIBRARY(https://github.com/GyverLibs/EncButton) 5 | It is much lighter, has more features and uses less CPU time! 6 | 7 | ``` 8 | 9 | 10 | 11 | 12 | 13 | 14 | ``` 15 | 16 | # GyverButton 17 | Library for multifunctional button press processing 18 | - Operation with normally closed and normally open pushbuttons 19 | - Working with connection PULL_UP and PULL_DOWN 20 | - Polling a button with software anti-bounce contacts (adjustable time) 21 | - Working out pressing, holding, releasing, clicking on the button (+ setting timeouts) 22 | - Working out single, double and triple pressing (made separately) 23 | - Working off any number of button presses (the function returns the number of clicks) 24 | - The function of changing the value of a variable with a given step and a given time interval 25 | - Ability to work with "virtual" buttons (all library features are used for matrix and resistive keyboards) 26 | 27 | ### Compatibility 28 | Compatible with all Arduino platforms (using Arduino functions) 29 | 30 | ### Documentation 31 | The library has [extended documentation](https://alexgyver.ru/GyverButton/) 32 | 33 | ## Content 34 | - [Install](#install) 35 | - [Initialization](#init) 36 | - [Usage](#usage) 37 | - [Example](#example) 38 | - [Versions](#versions) 39 | - [Bugs and feedback](#feedback) 40 | 41 | 42 | ## Installation 43 | - The library can be found by the name **GyverButton** and installed through the menuzher libraries in: 44 | - Arduino IDE 45 | - Arduino IDE v2 46 | - PlatformIO 47 | - [Download Library](https://github.com/GyverLibs/GyverButton/archive/refs/heads/main.zip) .zip archive for manual installation: 48 | - Unzip and put in *C:\Program Files (x86)\Arduino\libraries* (Windows x64) 49 | - Unzip and put in *C:\Program Files\Arduino\libraries* (Windows x32) 50 | - Unpack and put in *Documents/Arduino/libraries/* 51 | - (Arduino IDE) automatic installation from .zip: *Sketch/Include library/Add .ZIP library…* and specify the downloaded archive 52 | - Read more detailed instructions for installing libraries [here] (https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE% D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 53 | 54 | 55 | ## Initialization 56 | ```cpp 57 | GButton btn; // without binding to a pin (virtual button) and without specifying the type (by default HIGH_PULL and NORM_OPEN) 58 | GButton btn(pin); // with pin binding and without type specification (by default HIGH_PULL and NORM_OPEN) 59 | GButton btn(pin, connection type); // with pin binding and connection type indication (HIGH_PULL / LOW_PULL) and without button type indication (NORM_OPEN by default) 60 | GButton btn(pin, connection type, button type); // with pin binding and connection type (HIGH_PULL / LOW_PULL) and button type (NORM_OPEN / NORM_CLOSE) 61 | GButton btn(BTN_NO_PIN, connection type, button type); // without binding to a pin and specifying the connection type (HIGH_PULL / LOW_PULL) and button type (NORM_OPEN / NORM_CLOSE) 62 | ``` 63 | 64 | 65 | ## Usage 66 | ```cpp 67 | void setDebounce(uint16_t debounce); // set debounce time (default 80ms) 68 | void setTimeout(uint16_ttimeout); // set hold timeout (default 300ms) 69 | void setClickTimeout(uint16_t timeout); // set timeout between clicks (default 500ms) 70 | void setStepTimeout(uint16_t step_timeout); // set timeout between increments (default400ms) 71 | void setType(uint8_ttype); // setting the button type (HIGH_PULL - pulled up to power, LOW_PULL - to gnd) 72 | void setDirection(uint8_t dir); // set direction (open/closed by default - NORM_OPEN, NORM_CLOSE) 73 | 74 | void setTickMode(uint8_t tickMode); // (MANUAL / AUTO) manual or automatic polling of the button with the tick() function 75 | // MANUAL - you need to call the tick() function manually 76 | // AUTO - tick() is included in all other functions and polled itself 77 | 78 | void tick(); // button poll 79 | void tick(boolean state); // polling external value (0 pressed, 1 not pressed) (for matrix, resistive keyboards and joysticks) 80 | 81 | boolean isPress(); // returns true when the button is clicked. Reset after call 82 | boolean isRelease(); // returns true when the button is released. Reset after call 83 | boolean isClick(); // returns true on click. Reset after call 84 | boolean isHolded(); // returns true if held longer than timeout. Reset after call 85 | boolean isHold(); // returns true when the button is pressed, does not reset 86 | boolean state(); // returns the state of the button 87 | boolean isSingle(); // returns true on single click. Reset after call 88 | boolean isDouble(); // returns true on double click. Reset after call 89 | boolean isTriple(); // returns true on triple click. Reset after call 90 | 91 | boolean hasClick(); // check for clicks. Reset after call 92 | uint8_t getClicks(); // return the number of clicks 93 | uint8_t getHoldClicks();// return the number of clicks before holding 94 | 95 | boolean isStep(); // returns true on timer setStepTimeout, see example 96 | void resetStates(); // resets all is-flags and counters 97 | ``` 98 | 99 | 100 | ## Example 101 | See **examples** for other examples! 102 | ```cpp 103 | // An example of using the GyverButton library, all features in one sketch. 104 | 105 | #define BTN_PIN 3 // button connected here (BTN_PIN --- BUTTON --- GND) 106 | 107 | #include "GyverButton.h" 108 | GButton butt1(BTN_PIN); 109 | 110 | // Initialization options: 111 | // GButton btn; // without binding to a pin (virtual button) and without specifying the type (by default HIGH_PULL and NORM_OPEN) 112 | // GButton btn(pin); // with pin binding and without type specification (by default HIGH_PULL and NORM_OPEN) 113 | // GButton btn(pin, connection type); // with pin binding and connection type indication (HIGH_PULL / LOW_PULL) and without button type indication (NORM_OPEN by default) 114 | // GButton btn(pin, connection type, button type); // with pin binding and connection type (HIGH_PULL / LOW_PULL) and button type (NORM_OPEN / NORM_CLOSE) 115 | // GButton btn(BTN_NO_BTN_PIN, connection type, button type); // without binding to a pin and specifying the connection type (HIGH_PULL / LOW_PULL) and button type (NORM_OPEN / NORM_CLOSE) 116 | 117 | int value = 0; 118 | 119 | void setup() { 120 | Serial.begin(9600); 121 | 122 | butt1.setDebounce(50); // debounce setting (default 80ms) 123 | butt1.setTimeout(300); // set hold timeout (default 500ms) 124 | butt1.setClickTimeout(600); // set timeout between clicks (default 300ms) 125 | 126 | // HIGH_PULL - button is connected to GND, pin is pulled up to VCC (BTN_PIN --- BUTTON --- GND) 127 | // LOW_PULL - button is connected to VCC, pin is pulled to GND 128 | // default is HIGH_PULL 129 | butt1.setType(HIGH_PULL); 130 | 131 | // NORM_OPEN - normally open button 132 | // NORM_CLOSE - normally closed button 133 | // default is NORM_OPEN 134 | butt1.setDirection(NORM_OPEN); 135 | } 136 | 137 | void loop() { 138 | butt1.tick(); // mandatory processing function. Must be constantly asked 139 | 140 | if (butt1.isClick()) Serial.println("Click"); // check for one click 141 | if (butt1.isSingle()) Serial.println("Single"); // check for one click 142 | if (butt1.isDouble()) Serial.println("Double"); // check for double click 143 | if (butt1.isTriple()) Serial.println("Triple"); // check for triple click 144 | 145 | if (butt1.hasClicks())// check for clicks 146 | Serial.println(butt1.getClicks()); // get (and display) the number of clicks 147 | 148 | if (butt1.isPress()) Serial.println("Press"); // button click (+ debounce) 149 | if (butt1.isRelease()) Serial.println("Release"); // button release (+ debounce) 150 | if (butt1.isHold()) { // if the button is held down 151 | Serial print("Holding"); // output while held 152 | Serial.println(butt1.getHoldClicks()); // you can display the number of clicks before holding! 153 | } 154 | if (butt1.isHold()) Serial.println("Holding"); // check for hold 155 | //if (butt1.state()) Serial.println("Hold"); // returns the state of the button 156 | 157 | if (butt1.isStep()) { // if the button was held down (this is for incrementing) 158 | value++; // increase/decrease value variable with step and interval 159 | Serial println(value); // for example, output to the port 160 | } 161 | } 162 | ``` 163 | 164 | 165 | ## Versions 166 | - v2.15: Added the ability to declare a button without linking to a pin 167 | - v3.0: Accelerated and optimized code, redone initialization, added examples 168 | - v3.1: isStep can take the number of clicks made before it (see clicks_step example) 169 | - v3.2: Added getHoldClicks() method - return number of clicks prior to holding 170 | - v3.3: Minor fixes 171 | - v3.4: Added resetStates() method to reset states and counters 172 | - v3.5: increased performance for AVR Arduino 173 | - v3.6: added separate class for working with analog keyboards, see example analogKeyboardG 174 | - v3.7: Dryundel fixes: 175 | - Any hold timeout 176 | - Single, Double and Triple now don't interfere with hasClicks and getClicks and work together 177 | - isStep() also now does not interfere with anything and it works more correctly 178 | - v3.8: Dryundel fixes 179 | 180 | 181 | ## Bugs and feedback 182 | Create **I when finding bugsssue**, or better yet, write to [alex@alexgyver.ru](mailto:alex@alexgyver.ru) 183 | The library is open for revision and your **Pull Request**'s! -------------------------------------------------------------------------------- /examples/Gbutton_demo/Gbutton_demo.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton, все возможности в одном скетче. 2 | 3 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 4 | 5 | #include "GyverButton.h" 6 | GButton butt1(BTN_PIN); 7 | 8 | // Варианты инициализации: 9 | // GButton btn; // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 10 | // GButton btn(пин); // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 11 | // GButton btn(пин, тип подключ.); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN) 12 | // GButton btn(пин, тип подключ., тип кнопки); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 13 | // GButton btn(BTN_NO_BTN_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 14 | 15 | int value = 0; 16 | 17 | void setup() { 18 | Serial.begin(9600); 19 | 20 | butt1.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс) 21 | butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) 22 | butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс) 23 | 24 | // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND) 25 | // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND 26 | // по умолчанию стоит HIGH_PULL 27 | butt1.setType(HIGH_PULL); 28 | 29 | // NORM_OPEN - нормально-разомкнутая кнопка 30 | // NORM_CLOSE - нормально-замкнутая кнопка 31 | // по умолчанию стоит NORM_OPEN 32 | butt1.setDirection(NORM_OPEN); 33 | } 34 | 35 | void loop() { 36 | butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 37 | 38 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 39 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 40 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 41 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 42 | 43 | if (butt1.hasClicks()) // проверка на наличие нажатий 44 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 45 | 46 | if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) 47 | if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) 48 | if (butt1.isHold()) { // если кнопка удерживается 49 | Serial.print("Holding "); // выводим пока удерживается 50 | Serial.println(butt1.getHoldClicks()); // можно вывести количество кликов перед удержанием! 51 | } 52 | if (butt1.isHold()) Serial.println("Holding"); // проверка на удержание 53 | //if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки 54 | 55 | if (butt1.isStep()) { // если кнопка была удержана (это для инкремента) 56 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом 57 | Serial.println(value); // для примера выведем в порт 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /examples/Gbutton_example/Gbutton_example.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Пример использования библиотеки GyverButton, все возможности в одном скетче. 3 | */ 4 | 5 | #define PIN 3 // кнопка подключена сюда (PIN --- КНОПКА --- GND) 6 | 7 | #include "GyverButton.h" 8 | GButton butt1(PIN); 9 | // GButton butt1(PIN, HIGH_PULL, NORM_OPEN); // можно инициализировать так 10 | 11 | int value = 0; 12 | 13 | void setup() { 14 | Serial.begin(9600); 15 | 16 | butt1.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс) 17 | butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) 18 | butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс) 19 | 20 | // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (PIN --- КНОПКА --- GND) 21 | // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND 22 | butt1.setType(HIGH_PULL); 23 | 24 | // NORM_OPEN - нормально-разомкнутая кнопка 25 | // NORM_CLOSE - нормально-замкнутая кнопка 26 | butt1.setDirection(NORM_OPEN); 27 | } 28 | 29 | void loop() { 30 | butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 31 | 32 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 33 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 34 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 35 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 36 | 37 | if (butt1.hasClicks()) // проверка на наличие нажатий 38 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 39 | 40 | if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) 41 | if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) 42 | if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание 43 | if (butt1.isHold()) Serial.println("Holding"); // проверка на удержание 44 | //if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки 45 | 46 | if (butt1.isStep()) { // если кнопка была удержана (это для инкремента) 47 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом 48 | Serial.println(value); // для примера выведем в порт 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /examples/Gbutton_example_auto/Gbutton_example_auto.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton, все возможности в одном скетче. 2 | // автоматический тик 3 | 4 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 5 | 6 | #include "GyverButton.h" 7 | GButton butt1(BTN_PIN); 8 | // GButton butt1(BTN_PIN, HIGH_PULL, NORM_OPEN); // можно инициализировать так 9 | 10 | int value = 0; 11 | 12 | void setup() { 13 | Serial.begin(9600); 14 | 15 | butt1.setDebounce(90); // настройка антидребезга (по умолчанию 80 мс) 16 | butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) 17 | 18 | // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND) 19 | // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND 20 | // по умолчанию стоит HIGH_PULL 21 | butt1.setType(HIGH_PULL); 22 | 23 | // NORM_OPEN - нормально-разомкнутая кнопка 24 | // NORM_CLOSE - нормально-замкнутая кнопка 25 | // по умолчанию стоит NORM_OPEN 26 | butt1.setDirection(NORM_OPEN); 27 | 28 | // MANUAL - нужно вызывать функцию tick() вручную 29 | // AUTO - tick() входит во все остальные функции и опрашивается сама! 30 | butt1.setTickMode(AUTO); 31 | } 32 | 33 | void loop() { 34 | // butt1.tick(); // НЕ НУЖНА, в этом режиме (AUTO) она входит в каждую функцию 35 | 36 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 37 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 38 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 39 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 40 | 41 | if (butt1.hasClicks()) // проверка на наличие нажатий 42 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 43 | 44 | if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) 45 | if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) 46 | if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание 47 | if (butt1.isHold()) Serial.println("Holding"); // проверка на удержание 48 | //if (butt1.state()) Serial.println("Hold"); // возвращает состояние кнопки 49 | 50 | if (butt1.isStep()) { // если кнопка была удержана (это для инкремента) 51 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом 52 | Serial.println(value); // для примера выведем в порт 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /examples/Gbutton_interrupt/Gbutton_interrupt.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton, все возможности в одном скетче. 2 | // Дополнительный опрос по аппаратному прерыванию 3 | 4 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 5 | 6 | #include "GyverButton.h" 7 | GButton butt1(BTN_PIN); 8 | int value = 0; 9 | 10 | void setup() { 11 | Serial.begin(9600); 12 | attachInterrupt(1, isr, CHANGE); 13 | 14 | butt1.setDebounce(80); // настройка антидребезга (по умолчанию 80 мс) 15 | butt1.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) 16 | } 17 | 18 | void isr() { 19 | butt1.tick(); // опрашиваем в прерывании, чтобы поймать нажатие в любом случае 20 | } 21 | 22 | void loop() { 23 | butt1.tick(); // опрашиваем в скетче, иначе не будут работать проверки по времени! 24 | 25 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 26 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 27 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 28 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 29 | 30 | if (butt1.hasClicks()) // проверка на наличие нажатий 31 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 32 | 33 | if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) 34 | if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) 35 | if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание 36 | //if (butt1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки 37 | 38 | if (butt1.isStep()) { // если кнопка была удержана (это для инкремента) 39 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом 40 | Serial.println(value); // для примера выведем в порт 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /examples/Gbutton_timer_interrupt/Gbutton_timer_interrupt.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Пример использования библиотеки GyverButton, все возможности в одном скетче 3 | Данный скетч показывает, как быть в сложном "не сквозном" коде с кучей delay и замкнутых циклов 4 | Здесь кнопка опрашивается каждые 10 миллисекунд независимо от того, что происходит у вас в коде 5 | Используется библиотека TimerOne https://github.com/PaulStoffregen/TimerOne 6 | */ 7 | 8 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 9 | 10 | #include "GyverButton.h" 11 | #include "TimerOne.h" 12 | GButton butt1(BTN_PIN); 13 | int value = 0; 14 | 15 | void setup() { 16 | Serial.begin(9600); 17 | 18 | Timer1.initialize(10000); // установка таймера на каждые 10000 микросекунд (== 10 мс) 19 | Timer1.attachInterrupt(timerIsr); // запуск таймера 20 | } 21 | 22 | void timerIsr() { // прерывание таймера 23 | butt1.tick(); // отработка теперь находится здесь 24 | } 25 | 26 | void loop() { 27 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 28 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 29 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 30 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 31 | 32 | if (butt1.hasClicks()) // проверка на наличие нажатий 33 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 34 | 35 | if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс) 36 | if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс) 37 | if (butt1.isHolded()) Serial.println("Holded"); // проверка на удержание 38 | //if (butt1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки 39 | 40 | if (butt1.isStep()) { // если кнопка была удержана (это для инкремента) 41 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом 42 | Serial.println(value); // для примера выведем в порт 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /examples/_1-2-3-click/_1-2-3-click.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton, 1- 2- 3- нажатие 2 | 3 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 4 | 5 | #include "GyverButton.h" 6 | GButton butt1(BTN_PIN); 7 | 8 | void setup() { 9 | Serial.begin(9600); 10 | } 11 | 12 | void loop() { 13 | butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 14 | 15 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 16 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 17 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 18 | } 19 | -------------------------------------------------------------------------------- /examples/_5_buttons/_5_buttons.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton 2 | // опрос 5 кнопок в ручном режиме 3 | 4 | // кнопки подключены к земле (PIN --- КНОПКА --- GND) 5 | #define BTN1 3 6 | #define BTN2 4 7 | #define BTN3 5 8 | #define BTN4 6 9 | #define BTN5 7 10 | 11 | #include "GyverButton.h" 12 | GButton butt1(BTN1); 13 | GButton butt2(BTN2); 14 | GButton butt3(BTN3); 15 | GButton butt4(BTN4); 16 | GButton butt5(BTN5); 17 | 18 | void setup() { 19 | Serial.begin(9600); 20 | } 21 | 22 | void loop() { 23 | // тик в ручном режиме 24 | butt1.tick(); 25 | butt2.tick(); 26 | butt3.tick(); 27 | butt4.tick(); 28 | butt5.tick(); 29 | 30 | // проверяем одиночный клик 31 | if (butt1.isClick()) Serial.println("Button 1"); 32 | if (butt2.isClick()) Serial.println("Button 2"); 33 | if (butt3.isClick()) Serial.println("Button 3"); 34 | if (butt4.isClick()) Serial.println("Button 4"); 35 | if (butt5.isClick()) Serial.println("Button 5"); 36 | } 37 | -------------------------------------------------------------------------------- /examples/_5_buttons_auto/_5_buttons_auto.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton 2 | // опрос 5 кнопок в автоматическом режиме 3 | 4 | // кнопки подключены к земле (PIN --- КНОПКА --- GND) 5 | #define BTN1 3 6 | #define BTN2 4 7 | #define BTN3 5 8 | #define BTN4 6 9 | #define BTN5 7 10 | 11 | #include "GyverButton.h" 12 | GButton butt1(BTN1); 13 | GButton butt2(BTN2); 14 | GButton butt3(BTN3); 15 | GButton butt4(BTN4); 16 | GButton butt5(BTN5); 17 | 18 | void setup() { 19 | Serial.begin(9600); 20 | 21 | // устанавливаем опрос на автоматический 22 | butt1.setTickMode(AUTO); 23 | butt2.setTickMode(AUTO); 24 | butt3.setTickMode(AUTO); 25 | butt4.setTickMode(AUTO); 26 | butt5.setTickMode(AUTO); 27 | } 28 | 29 | void loop() { 30 | // проверяем одиночный клик 31 | // tick уже сидит внутри опроса 32 | if (butt1.isClick()) Serial.println("Button 1"); 33 | if (butt2.isClick()) Serial.println("Button 2"); 34 | if (butt3.isClick()) Serial.println("Button 3"); 35 | if (butt4.isClick()) Serial.println("Button 4"); 36 | if (butt5.isClick()) Serial.println("Button 5"); 37 | } 38 | -------------------------------------------------------------------------------- /examples/analogKeyboard/analogBtns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GyverLibs/GyverButton/579f6c147af197d810d2d9d4049bbece15585397/examples/analogKeyboard/analogBtns.jpg -------------------------------------------------------------------------------- /examples/analogKeyboard/analogKeyboard.ino: -------------------------------------------------------------------------------- 1 | // Пример использования библиотеки GyverButton с аналоговой клавиатурой 2 | // аналоговая клавиатура подключена на А7 3 | // Схему смотри на странице библиотеки https://alexgyver.ru/gyverbutton/ 4 | // также она есть в папке с примером 5 | 6 | #include "GyverButton.h" 7 | 8 | // создаём кнопки без привязки к пину 9 | GButton myButt1; 10 | GButton myButt2; 11 | GButton myButt3; 12 | 13 | void setup() { 14 | Serial.begin(9600); 15 | // меняем тип на LOW_PULL, потому что по умолчанию стоит HIGH_PULL 16 | myButt1.setType(LOW_PULL); 17 | myButt2.setType(LOW_PULL); 18 | myButt3.setType(LOW_PULL); 19 | } 20 | 21 | void loop() { 22 | // читаем значение 23 | int analog = analogRead(7); 24 | 25 | // для начала нужно вывести и запомнить значение для каждой кнопки 26 | //Serial.println(analog); 27 | 28 | // проверяем у каждой кнопки свой диапазон (+- 20 от полученного значения) 29 | myButt1.tick(analog < 860 && analog > 820); 30 | myButt2.tick(analog < 740 && analog > 700); 31 | myButt3.tick(analog < 650 && analog > 600); 32 | 33 | // проверка на удержание, например 34 | if (myButt1.isHolded()) { 35 | Serial.println("hold 1"); 36 | } 37 | if (myButt2.isHolded()) { 38 | Serial.println("hold 2"); 39 | } 40 | if (myButt3.isHolded()) { 41 | Serial.println("hold 3"); 42 | } 43 | 44 | delay(10); // задержка тут не нужна, чисто для вывода 45 | } 46 | -------------------------------------------------------------------------------- /examples/analogKeyboardG/analogKeyboardG.ino: -------------------------------------------------------------------------------- 1 | // новый пример работы с аналоговой клавиатурой 2 | /* 3 | Сигналы кнопок 4 | 1023 5 | 927 6 | 856 7 | 783 8 | 671 9 | 632 10 | 590 11 | 560 12 | 504 13 | 480 14 | 455 15 | 440 16 | 399 17 | 319 18 | 255 19 | 230 20 | */ 21 | #include "AnalogKey.h" 22 | // указываем пин и количество кнопок 23 | AnalogKey keys; 24 | 25 | #include 26 | GButton btn1, btn2, btn3; 27 | 28 | void setup() { 29 | Serial.begin(9600); 30 | // указываем сигналы кнопок аналоговой клавы 31 | keys.attach(0, 1023); 32 | keys.attach(1, 927); 33 | keys.attach(2, 856); 34 | } 35 | 36 | void loop() { 37 | // тикаем кнопки как статусы аналоговых 38 | btn1.tick(keys.status(0)); 39 | btn2.tick(keys.status(1)); 40 | btn3.tick(keys.status(2)); 41 | 42 | if (btn1.isClick()) Serial.println("click 0"); 43 | if (btn2.isClick()) Serial.println("click 1"); 44 | if (btn3.isClick()) Serial.println("click 2"); 45 | 46 | if (btn1.isHolded()) Serial.println("click 0"); 47 | if (btn2.isHolded()) Serial.println("hold 1"); 48 | if (btn3.isHolded()) Serial.println("hold 2"); 49 | } 50 | -------------------------------------------------------------------------------- /examples/btn_pinChangeInt/btn_pinChangeInt.ino: -------------------------------------------------------------------------------- 1 | // пример с прерываниями pinChangeInterrupt (прерывания на любом пине) 2 | // только для ATmega328 (UNO, Nano, Pro Mini) 3 | 4 | #define BTN_PIN 3 5 | 6 | #include "GyverButton.h" 7 | GButton butt1(BTN_PIN); 8 | 9 | void setup() { 10 | Serial.begin(9600); 11 | 12 | // настроить PCINT 13 | attachPCINT(BTN_PIN); 14 | } 15 | 16 | void loop() { 17 | butt1.tick(); // обязательно нужен отработчик ещё и в loop, чтобы работали таймауты 18 | 19 | if (butt1.isClick()) Serial.println("Click"); // проверка на один клик 20 | if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик 21 | if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик 22 | if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик 23 | } 24 | 25 | // функция для настройки PCINT для ATmega328 (UNO, Nano, Pro Mini) 26 | uint8_t attachPCINT(uint8_t pin) { 27 | if (pin < 8) { // D0-D7 // PCINT2 28 | PCICR |= (1 << PCIE2); 29 | PCMSK2 |= (1 << pin); 30 | return 2; 31 | } 32 | else if (pin > 13) { //A0-A5 // PCINT1 33 | PCICR |= (1 << PCIE1); 34 | PCMSK1 |= (1 << pin - 14); 35 | return 1; 36 | } 37 | else { // D8-D13 // PCINT0 38 | PCICR |= (1 << PCIE0); 39 | PCMSK0 |= (1 << pin - 8); 40 | return 0; 41 | } 42 | } 43 | 44 | // Векторы PCINT, нужно кинуть сюда тики 45 | // не обязательно в каждый вектор, достаточно в тот, который задействован 46 | // пины 0-7: PCINT2 47 | // пины 8-13: PCINT0 48 | // пины A0-A5: PCINT1 49 | ISR(PCINT0_vect) { 50 | //butt1.tick(); 51 | } 52 | ISR(PCINT1_vect) { 53 | //butt1.tick(); 54 | } 55 | ISR(PCINT2_vect) { 56 | butt1.tick(); 57 | } 58 | -------------------------------------------------------------------------------- /examples/clicks_step/clicks_step.ino: -------------------------------------------------------------------------------- 1 | // ловим степ с накликиванием 2 | #define BTN_PIN 0 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 3 | #include "GyverButton.h" 4 | GButton butt1(BTN_PIN); 5 | 6 | void setup() { 7 | Serial.begin(9600); 8 | } 9 | 10 | void loop() { 11 | butt1.tick(); 12 | 13 | // удержание 14 | if (butt1.isStep()) { 15 | Serial.println("0x"); 16 | } 17 | 18 | // один клик + удержание 19 | if (butt1.isStep(1)) { 20 | Serial.println("1x"); 21 | } 22 | 23 | // два клика + удержание 24 | if (butt1.isStep(2)) { 25 | Serial.println("2x"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/increment/increment.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Пример использования библиотеки GyverButton, управляем переменной value при помощи двух кнопок 3 | Конструкция с isIncr делает увеличение/уменьшение переменной при нажатой кнопке с шагом по времени 4 | */ 5 | 6 | #define BTN1 2 // кнопка подключена сюда (PIN --- КНОПКА --- GND) 7 | #define BTN2 3 // кнопка подключена сюда (PIN --- КНОПКА --- GND) 8 | 9 | #include "GyverButton.h" 10 | GButton butt1(BTN1); 11 | GButton butt2(BTN2); 12 | int value = 0; 13 | 14 | void setup() { 15 | Serial.begin(9600); 16 | } 17 | 18 | void loop() { 19 | butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 20 | butt2.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 21 | 22 | if (butt1.isClick()) { // одиночное нажатие 23 | value++; // инкремент 24 | Serial.println(value); // для примера выведем в порт 25 | } 26 | 27 | if (butt2.isClick()) { // одиночное нажатие 28 | value--; // декремент 29 | Serial.println(value); // для примера выведем в порт 30 | } 31 | 32 | if (butt1.isStep()) { // обработчик удержания с шагами 33 | value++; // увеличивать/уменьшать переменную value с шагом и интервалом! 34 | Serial.println(value); // для примера выведем в порт 35 | } 36 | 37 | if (butt2.isStep()) { // обработчик удержания с шагами 38 | value--; // увеличивать/уменьшать переменную value с шагом и интервалом! 39 | Serial.println(value); // для примера выведем в порт 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /examples/many_clicks/many_clicks.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Пример использования библиотеки GyverButton, отработка любого количества нажатий 3 | */ 4 | 5 | #define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND) 6 | #include "GyverButton.h" 7 | GButton butt1(BTN_PIN); 8 | 9 | void setup() { 10 | Serial.begin(9600); 11 | butt1.setTimeout(400); // настройка таймаута на удержание и второй клик (по умолчанию 500 мс) 12 | } 13 | 14 | void loop() { 15 | butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться 16 | 17 | if (butt1.hasClicks()) // проверка на наличие нажатий 18 | Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий 19 | } 20 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For GyverButton 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | GButton KEYWORD1 10 | GyverButton KEYWORD1 11 | 12 | ####################################### 13 | # Methods and Functions (KEYWORD2) 14 | ####################################### 15 | 16 | setDebounce KEYWORD2 17 | setTimeout KEYWORD2 18 | setStepTimeout KEYWORD2 19 | setClickTimeout KEYWORD2 20 | setType KEYWORD2 21 | setDirection KEYWORD2 22 | setTickMode KEYWORD2 23 | 24 | tick KEYWORD2 25 | isPress KEYWORD2 26 | isRelease KEYWORD2 27 | isClick KEYWORD2 28 | isHolded KEYWORD2 29 | isHold KEYWORD2 30 | state KEYWORD2 31 | 32 | hasClicks KEYWORD2 33 | getClicks KEYWORD2 34 | getHoldClicks KEYWORD2 35 | isSingle KEYWORD2 36 | isDouble KEYWORD2 37 | isTriple KEYWORD2 38 | isStep KEYWORD2 39 | 40 | resetStates KEYWORD2 41 | 42 | ####################################### 43 | # Constants (LITERAL1) 44 | ####################################### 45 | 46 | HIGH_PULL LITERAL1 47 | LOW_PULL LITERAL1 48 | NORM_OPEN LITERAL1 49 | NORM_CLOSE LITERAL1 50 | MANUAL LITERAL1 51 | AUTO LITERAL1 -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=GyverButton 2 | version=3.8 3 | author=AlexGyver 4 | maintainer=AlexGyver 5 | sentence=Advanced button operation library 6 | paragraph=DEPRECATED! Use EncButton https://github.com/GyverLibs/EncButton instead 7 | category=Sensors 8 | url=https://github.com/GyverLibs/GyverButton 9 | architectures=* 10 | -------------------------------------------------------------------------------- /src/AnalogKey.h: -------------------------------------------------------------------------------- 1 | #ifndef AnalogKey_h 2 | #define AnalogKey_h 3 | /* 4 | Мини класс для работы с аналоговой клавиатурой 5 | GitHub: https://github.com/GyverLibs/AnalogKey 6 | - Встроенный простенький дебаунс 7 | - Оптимальный опрос пина по таймеру 8 | - Проверка конкретной кнопки или вывод номера нажатой 9 | 10 | AlexGyver, alex@alexgyver.ru 11 | https://alexgyver.ru/ 12 | MIT License 13 | */ 14 | 15 | #define _AKEY_PERIOD 50 // период опроса в мс 16 | 17 | template 18 | class AnalogKey { 19 | public: 20 | // подключает кнопку на указанное значение 21 | void attach(byte num, int value) { 22 | if (num >= AMOUNT) return; 23 | signals[num] = value; 24 | } 25 | 26 | // устанавливает окно сигнала (умолч. 20) 27 | void setWindow(int window) { 28 | _window = window; 29 | } 30 | 31 | // возвращает статус указанной кнопки 32 | bool status(byte num) { 33 | if (millis() - tmr > _AKEY_PERIOD) { 34 | tmr = millis(); 35 | int thisRead = analogRead(PIN); 36 | if (abs(thisRead - _lastRead) < _window) _ready = true; 37 | else _ready = false; 38 | _lastRead = thisRead; 39 | } 40 | if (_ready && 41 | _lastRead > signals[num] - _window && 42 | _lastRead < signals[num] + _window) return true; 43 | else return false; 44 | } 45 | 46 | // выводит номер нажатой кнопки или -1, если нажатых кнопок нет 47 | int pressed() { 48 | status(0); // вызываем опрос 49 | for (byte i = 0; i < AMOUNT; i++) { 50 | if (_ready && 51 | _lastRead > signals[i] - _window && 52 | _lastRead < signals[i] + _window) return i; 53 | } 54 | return -1; 55 | } 56 | 57 | private: 58 | int signals[AMOUNT]; 59 | int _lastRead = 0; 60 | int _window = 20; 61 | bool _ready = false; 62 | uint32_t tmr; 63 | }; 64 | #endif -------------------------------------------------------------------------------- /src/GyverButton.cpp: -------------------------------------------------------------------------------- 1 | #include "GyverButton.h" 2 | 3 | // ==================== CONSTRUCTOR ==================== 4 | GButton::GButton(int8_t pin, bool type, bool dir) { 5 | if (pin != BTN_NO_PIN) { 6 | _PIN = (uint8_t)pin; 7 | flags.noPin = false; 8 | } else { 9 | flags.noPin = true; 10 | } 11 | setType(type); 12 | flags.mode = false; 13 | flags.tickMode = false; 14 | flags.inv_state = dir; 15 | } 16 | 17 | // ==================== SET ==================== 18 | void GButton::setDebounce(uint16_t debounce) { 19 | _debounce = debounce; 20 | } 21 | void GButton::setTimeout(uint16_t new_timeout) { 22 | _timeout = new_timeout; 23 | } 24 | void GButton::setClickTimeout(uint16_t new_timeout) { 25 | _click_timeout = new_timeout; 26 | } 27 | void GButton::setStepTimeout(uint16_t step_timeout) { 28 | _step_timeout = step_timeout; 29 | } 30 | void GButton::setType(bool type) { 31 | flags.type = type; 32 | if (!flags.noPin) { 33 | if (type) pinMode(_PIN, INPUT); 34 | else pinMode(_PIN, INPUT_PULLUP); 35 | #if defined(__AVR__) 36 | _pin_reg = portInputRegister(digitalPinToPort(_PIN)); 37 | _bit_mask = digitalPinToBitMask(_PIN); 38 | #endif 39 | } 40 | } 41 | void GButton::setDirection(bool dir) { 42 | flags.inv_state = dir; 43 | } 44 | void GButton::setTickMode(bool tickMode) { 45 | flags.tickMode = tickMode; 46 | } 47 | 48 | // ==================== IS ==================== 49 | boolean GButton::isPress() { 50 | if (flags.tickMode) GButton::tick(); 51 | if (flags.isPress_f) { 52 | flags.isPress_f = false; 53 | return true; 54 | } else return false; 55 | } 56 | boolean GButton::isRelease() { 57 | if (flags.tickMode) GButton::tick(); 58 | if (flags.isRelease_f) { 59 | flags.isRelease_f = false; 60 | return true; 61 | } else return false; 62 | } 63 | boolean GButton::isClick() { 64 | if (flags.tickMode) GButton::tick(); 65 | if (flags.isOne_f) { 66 | flags.isOne_f = false; 67 | return true; 68 | } else return false; 69 | } 70 | boolean GButton::isHolded() { 71 | if (flags.tickMode) GButton::tick(); 72 | if (flags.isHolded_f) { 73 | flags.isHolded_f = false; 74 | return true; 75 | } else return false; 76 | } 77 | boolean GButton::isHold() { 78 | if (flags.tickMode) GButton::tick(); 79 | if (flags.step_flag) return true; 80 | else return false; 81 | } 82 | boolean GButton::state() { 83 | if (flags.tickMode) GButton::tick(); 84 | return btn_state; 85 | } 86 | boolean GButton::isSingle() { 87 | if (flags.tickMode) GButton::tick(); 88 | if (flags.counter_flag && last_counter == 1) { 89 | // last_counter = 0; 90 | // flags.counter_flag = false; 91 | flags.counter_reset = true; 92 | return true; 93 | } else return false; 94 | } 95 | boolean GButton::isDouble() { 96 | if (flags.tickMode) GButton::tick(); 97 | if (flags.counter_flag && last_counter == 2) { 98 | // flags.counter_flag = false; 99 | // last_counter = 0; 100 | flags.counter_reset = true; 101 | return true; 102 | } else return false; 103 | } 104 | boolean GButton::isTriple() { 105 | if (flags.tickMode) GButton::tick(); 106 | if (flags.counter_flag && last_counter == 3) { 107 | // flags.counter_flag = false; 108 | // last_counter = 0; 109 | flags.counter_reset = true; 110 | return true; 111 | } else return false; 112 | } 113 | boolean GButton::hasClicks() { 114 | if (flags.tickMode) GButton::tick(); 115 | if (flags.counter_flag) { 116 | // flags.counter_flag = false; 117 | flags.counter_reset = true; 118 | return true; 119 | } else return false; 120 | } 121 | uint8_t GButton::getClicks() { 122 | // byte thisCount = last_counter; // Исключено 14.01.2021 123 | // last_counter = 0; 124 | flags.counter_reset = true; 125 | return last_counter; // return thisCount; (замена) 14.01.2021 126 | } 127 | uint8_t GButton::getHoldClicks() { 128 | if (flags.tickMode) GButton::tick(); 129 | return last_hold_counter; //return flags.hold_flag ? last_hold_counter : 0; (Замена) 14.01.2021 130 | } 131 | boolean GButton::isStep(byte clicks) { 132 | if (flags.tickMode) GButton::tick(); 133 | if (btn_counter == clicks && flags.step_flag && (millis() - btn_timer >= _step_timeout)) { 134 | btn_timer = millis(); 135 | return true; 136 | } 137 | else return false; 138 | } 139 | 140 | void GButton::resetStates() { 141 | flags.isPress_f = false; 142 | flags.isRelease_f = false; 143 | flags.isOne_f = false; 144 | flags.isHolded_f = false; 145 | flags.step_flag = false; 146 | flags.counter_flag = false; 147 | last_hold_counter = 0; 148 | last_counter = 0; 149 | } 150 | 151 | // ==================== TICK ==================== 152 | void GButton::tick(boolean state) { 153 | flags.mode = true; 154 | btn_state = state ^ flags.inv_state; 155 | GButton::tick(); 156 | flags.mode = false; 157 | } 158 | 159 | void GButton::tick() { 160 | // читаем пин 161 | if (!flags.mode && !flags.noPin) btn_state = !_buttonRead() ^ (flags.inv_state ^ flags.type); 162 | 163 | uint32_t thisMls = millis(); 164 | 165 | // нажатие 166 | if (btn_state && !btn_flag) { 167 | if (!flags.btn_deb) { 168 | flags.btn_deb = true; 169 | btn_timer = thisMls; 170 | } else { 171 | if (thisMls - btn_timer >= _debounce) { 172 | btn_flag = true; 173 | flags.isPress_f = true; 174 | flags.oneClick_f = true; 175 | } 176 | } 177 | } else { 178 | flags.btn_deb = false; 179 | } 180 | 181 | // отпускание 182 | if (!btn_state && btn_flag) { 183 | btn_flag = false; 184 | if (!flags.hold_flag) btn_counter++; 185 | flags.hold_flag = false; 186 | flags.isRelease_f = true; 187 | btn_timer = thisMls; 188 | if (flags.step_flag) { 189 | last_counter = 0; 190 | btn_counter = 0; 191 | flags.step_flag = false; 192 | } 193 | if (flags.oneClick_f) { 194 | flags.oneClick_f = false; 195 | flags.isOne_f = true; 196 | } 197 | } 198 | 199 | // кнопка удерживается 200 | if (btn_flag && btn_state && (thisMls - btn_timer >= _timeout) && !flags.hold_flag) { 201 | flags.hold_flag = true; 202 | last_hold_counter = btn_counter; 203 | //btn_counter = 0; 204 | //last_counter = 0; 205 | flags.isHolded_f = true; 206 | flags.step_flag = true; 207 | flags.oneClick_f = false; 208 | btn_timer = thisMls; 209 | } 210 | 211 | // обработка накликивания 212 | if ((thisMls - btn_timer >= _click_timeout) && (btn_counter != 0) && !btn_state) { //И здесь еще добавлен !btn_state 213 | last_counter = btn_counter; 214 | btn_counter = 0; 215 | flags.counter_flag = true; 216 | } 217 | 218 | // сброс накликивания //Добавлено 219 | if (flags.counter_reset) { 220 | last_counter = 0; 221 | flags.counter_flag = false; 222 | flags.counter_reset = false; 223 | } 224 | } -------------------------------------------------------------------------------- /src/GyverButton.h: -------------------------------------------------------------------------------- 1 | /* 2 | GyverButton - библиотека для многофункциональной отработки нажатия кнопки 3 | ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ БИБЛИОТЕКУ EncButton https://github.com/GyverLibs/EncButton 4 | GitHub: https://github.com/GyverLibs/GyverButton 5 | Документация: https://alexgyver.ru/gyverbutton/ 6 | Возможности: 7 | - Работа с нормально замкнутыми и нормально разомкнутыми кнопками 8 | - Работа с подключением PULL_UP и PULL_DOWN 9 | - Опрос кнопки с программным антидребезгом контактов (настраиваемое время) 10 | - Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов) 11 | - Отработка одиночного, двойного и тройного нажатия (вынесено отдельно) 12 | - Отработка любого количества нажатий кнопки (функция возвращает количество нажатий) 13 | - Функция изменения значения переменной с заданным шагом и заданным интервалом по времени 14 | - Возможность работы с "виртуальными" кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур) 15 | 16 | Версии: 17 | v2.15: Добавлена возможность объявить кнопку без привязки к пину 18 | v3.0: Ускорен и оптимизирован код, переделана инициализация, дополнены примеры 19 | v3.1: isStep может принимать количество кликов, сделанных перед ним (см. пример clicks_step) 20 | v3.2: Добавлен метод getHoldClicks() - вернуть количество кликов, предшествующее удерживанию 21 | v3.3: Мелкие исправления 22 | v3.4: Добавлен метод resetStates(), сбрасывающий состояния и счётчики 23 | v3.5: увелична производительность для AVR Arduino 24 | v3.6: добавлен отдельный класс для работы с аналоговыми клавиатурами, см пример analogKeyboardG 25 | v3.7: исправления от Dryundel: 26 | - Любой таймаут удержания 27 | - Single, Double и Triple теперь не мешают hasClicks и getClicks и работают совместно 28 | - isStep() тоже теперь ничего не мешает и он работает более корректно 29 | v3.8: исправления от Dryundel: 30 | 31 | */ 32 | #ifndef GyverButton_h 33 | #define GyverButton_h 34 | #include 35 | 36 | #if defined(__AVR__) 37 | #define _buttonRead() bool(*_pin_reg & _bit_mask) 38 | #else 39 | #define _buttonRead() digitalRead(_PIN) 40 | #endif 41 | 42 | #pragma pack(push,1) 43 | typedef struct { 44 | bool btn_deb: 1; 45 | bool hold_flag: 1; 46 | bool counter_flag: 1; 47 | bool isHolded_f: 1; 48 | bool isRelease_f: 1; 49 | bool isPress_f: 1; 50 | bool step_flag: 1; 51 | bool oneClick_f: 1; 52 | bool isOne_f: 1; 53 | bool inv_state: 1; 54 | bool mode: 1; 55 | bool type: 1; 56 | bool tickMode: 1; 57 | bool noPin: 1; 58 | bool counter_reset: 1; //Добавлен 59 | } GyverButtonFlags; 60 | #pragma pack(pop) 61 | 62 | #define BTN_NO_PIN -1 63 | #define HIGH_PULL 0 64 | #define LOW_PULL 1 65 | #define NORM_OPEN 0 66 | #define NORM_CLOSE 1 67 | #define MANUAL 0 68 | #define AUTO 1 69 | 70 | // Варианты инициализации: 71 | // GButton btn; // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. LOW_PULL и NORM_OPEN) 72 | // GButton btn(пин); // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN) 73 | // GButton btn(пин, тип подключ.); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN) 74 | // GButton btn(пин, тип подключ., тип кнопки); // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 75 | // GButton btn(BTN_NO_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE) 76 | 77 | class GButton { 78 | public: 79 | GButton(int8_t pin = BTN_NO_PIN, bool type = HIGH_PULL, bool dir = NORM_OPEN); // конструктор кнопки, принимает PIN пин, тип type (HIGH_PULL / LOW_PULL) и направление dir (NORM_OPEN / NORM_CLOSE) 80 | // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC, pinMode - INPUT_PULLUP (по умолчанию) 81 | // LOW_PULL - кнопка подключена к VCC, пин подтянут к GND, pinMode - INPUT 82 | // NORM_OPEN - кнопка по умолчанию разомкнута (по умолчанию) 83 | // NORM_CLOSE - кнопка по умолчанию замкнута 84 | 85 | void setDebounce(uint16_t debounce); // установка времени антидребезга (по умолчанию 80 мс) 86 | void setTimeout(uint16_t new_timeout); // установка таймаута удержания (по умолчанию 300 мс) 87 | void setClickTimeout(uint16_t new_timeout); // установка таймаута между кликами (по умолчанию 500 мс) 88 | void setStepTimeout(uint16_t step_timeout); // установка таймаута между инкрементами (по умолчанию 400 мс) 89 | void setType(bool type); // установка типа кнопки (HIGH_PULL - подтянута к питанию, LOW_PULL - к gnd) 90 | void setDirection(bool dir); // установка направления (разомкнута/замкнута по умолчанию - NORM_OPEN, NORM_CLOSE) 91 | 92 | void setTickMode(bool tickMode); // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick() 93 | // MANUAL - нужно вызывать функцию tick() вручную 94 | // AUTO - tick() входит во все остальные функции и опрашивается сама 95 | 96 | void tick(); // опрос кнопки 97 | void tick(boolean state); // опрос внешнего значения (1 нажато, 0 не нажато) (для матричных, резистивных клавиатур и джойстиков) 98 | 99 | boolean isPress(); // возвращает true при нажатии на кнопку. Сбрасывается после вызова 100 | boolean isRelease(); // возвращает true при отпускании кнопки. Сбрасывается после вызова 101 | boolean isClick(); // возвращает true при клике. Сбрасывается после вызова 102 | boolean isHolded(); // возвращает true при удержании дольше timeout. Сбрасывается после вызова 103 | boolean isHold(); // возвращает true при нажатой кнопке, не сбрасывается 104 | boolean state(); // возвращает состояние кнопки 105 | 106 | boolean isSingle(); // возвращает true при одиночном клике. Сбрасывается после вызова 107 | boolean isDouble(); // возвращает true при двойном клике. Сбрасывается после вызова 108 | boolean isTriple(); // возвращает true при тройном клике. Сбрасывается после вызова 109 | 110 | boolean hasClicks(); // проверка на наличие кликов. Сбрасывается после вызова 111 | uint8_t getClicks(); // вернуть количество кликов 112 | uint8_t getHoldClicks();// вернуть количество кликов, предшествующее удерживанию 113 | 114 | boolean isStep(byte clicks = 0); // возвращает true по таймеру setStepTimeout, смотри пример 115 | 116 | void resetStates(); // сбрасывает все is-флаги и счётчики 117 | 118 | private: 119 | GyverButtonFlags flags; 120 | uint8_t _PIN = 0; 121 | uint16_t _debounce = 60; 122 | uint16_t _timeout = 500; 123 | uint16_t _click_timeout = 500; 124 | uint16_t _step_timeout = 400; 125 | uint8_t btn_counter = 0, last_counter = 0, last_hold_counter = 0; 126 | uint32_t btn_timer = 0; 127 | bool btn_state = false; 128 | bool btn_flag = false; 129 | #if defined(__AVR__) 130 | volatile uint8_t *_pin_reg; 131 | volatile uint8_t _bit_mask; 132 | #endif 133 | }; 134 | #endif --------------------------------------------------------------------------------