├── .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 | [](https://github.com/GyverLibs/GyverButton/releases/latest/download/GyverButton.zip)
2 | [](https://alexgyver.ru/)
3 | [](https://alexgyver.ru/support_alex/)
4 | [](https://github-com.translate.goog/GyverLibs/GyverButton?_x_tr_sl=ru&_x_tr_tl=en)
5 |
6 | [](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
--------------------------------------------------------------------------------