├── .gitattributes ├── .github └── workflows │ └── tg-send.yml ├── LICENSE ├── README.md ├── README_EN.md ├── examples ├── analogKeyboard │ └── analogKeyboard.ino └── analogKeyboard_short │ └── analogKeyboard_short.ino ├── keywords.txt ├── library.properties └── src └── AnalogKey.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/AnalogKey.svg?color=brightgreen)](https://github.com/GyverLibs/AnalogKey/releases/latest/download/AnalogKey.zip) 2 | [![PIO](https://badges.registry.platformio.org/packages/gyverlibs/library/AnalogKey.svg)](https://registry.platformio.org/libraries/gyverlibs/AnalogKey) 3 | [![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/) 4 | [![Foo](https://img.shields.io/badge/%E2%82%BD%24%E2%82%AC%20%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%82%D1%8C-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/) 5 | [![Foo](https://img.shields.io/badge/README-ENGLISH-blueviolet.svg?style=flat-square)](https://github-com.translate.goog/GyverLibs/AnalogKey?_x_tr_sl=ru&_x_tr_tl=en) 6 | 7 | [![Foo](https://img.shields.io/badge/ПОДПИСАТЬСЯ-НА%20ОБНОВЛЕНИЯ-brightgreen.svg?style=social&logo=telegram&color=blue)](https://t.me/GyverLibs) 8 | 9 | # AnalogKey 10 | Библиотека для работы с аналоговой клавиатурой для Arduino 11 | - Встроенный простенький дебаунс 12 | - Оптимальный опрос пина по таймеру 13 | - Проверка конкретной кнопки или вывод номера нажатой 14 | 15 | ### Совместимость 16 | Совместима со всеми Arduino платформами (используются Arduino-функции) 17 | 18 | ## Содержание 19 | - [Установка](#install) 20 | - [Инициализация](#init) 21 | - [Использование](#usage) 22 | - [Пример](#example) 23 | - [Версии](#versions) 24 | - [Баги и обратная связь](#feedback) 25 | 26 | 27 | ## Установка 28 | - Библиотеку можно найти по названию **AnalogKey** и установить через менеджер библиотек в: 29 | - Arduino IDE 30 | - Arduino IDE v2 31 | - PlatformIO 32 | - [Скачать библиотеку](https://github.com/GyverLibs/AnalogKey/archive/refs/heads/main.zip) .zip архивом для ручной установки: 33 | - Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64) 34 | - Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32) 35 | - Распаковать и положить в *Документы/Arduino/libraries/* 36 | - (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив 37 | - Читай более подробную инструкцию по установке библиотек [здесь](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) 38 | ### Обновление 39 | - Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи 40 | - Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить" 41 | - Вручную: **удалить папку со старой версией**, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам! 42 | 43 | 44 | 45 | ## Инициализация 46 | ```cpp 47 | AnalogKey keys; // указываем пин и количество кнопок 48 | AnalogKey keys; // указываем пин, количество кнопок и внешний массив сигналов 49 | ``` 50 | 51 | 52 | ## Использование 53 | ```cpp 54 | void attach(uint8_t num, int value); // подключает кнопку на указанное значение 55 | void setWindow(int window); // устанавливает окно сигнала (умолч. 40) 56 | bool status(uint8_t num); // возвращает статус указанной кнопки 57 | int pressed(); // выводит номер нажатой кнопки или -1, если нажатых кнопок нет 58 | ``` 59 | ### Как работать 60 | - Измерить и записать сигналы с клавиатуры (например, вывести значения в монитор порта) 61 | - Передать значения в библиотеку: 62 | - Положить во внешний массив и передать его при инициализации (см. пример) 63 | - Подключить каждую кнопку через attach (см. пример) 64 | - При необходимости настроить размер окна, чтобы сигналы с кнопок не пересекались: расстояние между соседними сигналами должно быть не меньше половины окна 65 | - Данная библиотека позволяет просто найти нажатую кнопку. Для расширенной работы (клики, удержания) используй библиотеку [EncButton](https://github.com/GyverLibs/EncButton) в виртуальном режиме 66 | 67 | 68 | ## Пример 69 | ### Внешний массив 70 | ```cpp 71 | #include "AnalogKey.h" 72 | // создаём массив значений сигналов с кнопок 73 | int16_t sigs[16] = { 74 | 1023, 927, 856, 783, 75 | 671, 632, 590, 560, 76 | 504, 480, 455, 440, 77 | 399, 319, 255, 230 78 | }; 79 | 80 | // указываем пин, количество кнопок и массив значений 81 | AnalogKey keys; 82 | 83 | void setup() { 84 | Serial.begin(9600); 85 | 86 | // размер окна опроса такой, чтобы кнопок не пересекались 87 | // Расстояние между соседними сигналами не меньше половины окна! 88 | keys.setWindow(30); 89 | } 90 | 91 | void loop() { 92 | // проверяем каждую кнопку в ручном режиме 93 | if (keys.status(0)) Serial.println("press 0"); 94 | if (keys.status(1)) Serial.println("press 1"); 95 | if (keys.status(2)) Serial.println("press 2"); 96 | if (keys.status(3)) Serial.println("press 3"); 97 | if (keys.status(4)) Serial.println("press 4"); 98 | if (keys.status(5)) Serial.println("press 5"); 99 | if (keys.status(6)) Serial.println("press 6"); 100 | 101 | // или выводим номер текущей нажатой (-1 значит ни одна не нажата) 102 | if (keys.pressed() != -1) Serial.println(keys.pressed()); 103 | delay(10); 104 | } 105 | ``` 106 | 107 | ### Внутренний массив 108 | ```cpp 109 | #include "AnalogKey.h" 110 | // указываем пин и количество кнопок 111 | AnalogKey keys; 112 | 113 | void setup() { 114 | Serial.begin(9600); 115 | 116 | // назначаем кнопкам их сигналы 117 | keys.attach(0, 1023); 118 | keys.attach(1, 927); 119 | keys.attach(2, 856); 120 | keys.attach(3, 783); 121 | keys.attach(4, 671); 122 | keys.attach(5, 632); 123 | keys.attach(6, 590); 124 | keys.attach(7, 560); 125 | keys.attach(8, 504); 126 | keys.attach(9, 480); 127 | keys.attach(10, 455); 128 | keys.attach(11, 440); 129 | keys.attach(12, 399); 130 | keys.attach(13, 319); 131 | keys.attach(14, 255); 132 | keys.attach(15, 230); 133 | } 134 | 135 | void loop() { 136 | // проверяем каждую кнопку в ручном режиме 137 | if (keys.status(0)) Serial.println("press 0"); 138 | if (keys.status(1)) Serial.println("press 1"); 139 | if (keys.status(2)) Serial.println("press 2"); 140 | if (keys.status(3)) Serial.println("press 3"); 141 | if (keys.status(4)) Serial.println("press 4"); 142 | if (keys.status(5)) Serial.println("press 5"); 143 | if (keys.status(6)) Serial.println("press 6"); 144 | 145 | // или выводим номер текущей нажатой (-1 значит ни одна не нажата) 146 | if (keys.pressed() != -1) Serial.println(keys.pressed()); 147 | delay(10); 148 | } 149 | ``` 150 | 151 | 152 | ## Версии 153 | - v1.0 154 | - v1.1 - оптимизация, изменена логика размера окна 155 | 156 | 157 | ## Баги и обратная связь 158 | При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru) 159 | Библиотека открыта для доработки и ваших **Pull Request**'ов! 160 | 161 | 162 | При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать: 163 | - Версия библиотеки 164 | - Какой используется МК 165 | - Версия SDK (для ESP) 166 | - Версия Arduino IDE 167 | - Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде 168 | - Какой код загружался, какая работа от него ожидалась и как он работает в реальности 169 | - В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код 170 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | This is an automatic translation, may be incorrect in some places. See sources and examples! 2 | 3 | # Analogy 4 | Library for working with an analog keyboard for Arduino 5 | - Built -in, simple debate 6 | - Optimal PIN survey by timer 7 | - checking a specific button or output of a pressed number 8 | 9 | ## compatibility 10 | Compatible with all arduino platforms (used arduino functions) 11 | 12 | ## Content 13 | - [installation] (# Install) 14 | - [initialization] (#init) 15 | - [use] (#usage) 16 | - [Example] (# Example) 17 | - [versions] (#varsions) 18 | - [bugs and feedback] (#fedback) 19 | 20 | 21 | ## Installation 22 | - The library can be found by the name ** analogy ** and installed through the library manager in: 23 | - Arduino ide 24 | - Arduino ide v2 25 | - Platformio 26 | - [download the library] (https://github.com/gyverlibs/analogkey/archive/refs/heads/main.zip) .Zip archive for manual installation: 27 | - unpack and put in * C: \ Program Files (X86) \ Arduino \ Libraries * (Windows X64) 28 | - unpack and put in * C: \ Program Files \ Arduino \ Libraries * (Windows X32) 29 | - unpack and put in *documents/arduino/libraries/ * 30 | - (Arduino id) Automatic installation from. Zip: * sketch/connect the library/add .Zip library ... * and specify downloaded archive 31 | - Read more detailed instructions for installing libraries [here] (https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%BD%D0%BE%BE%BE%BED0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 32 | ### Update 33 | - I recommend always updating the library: errors and bugs are corrected in the new versions, as well as optimization and new features are added 34 | - through the IDE library manager: find the library how to install and click "update" 35 | - Manually: ** remove the folder with the old version **, and then put a new one in its place.“Replacement” cannot be done: sometimes in new versions, files that remain when replacing are deleted and can lead to errors! 36 | 37 | 38 | 39 | ## initialization 40 | `` `CPP 41 | Analogkey keys;// Specify the PIN and the number of buttons 42 | Analogkey keys;// Specify PIN, number of buttons and external array of signals 43 | `` ` 44 | 45 | 46 | ## Usage 47 | `` `CPP 48 | VOID attach (uint8_t num, int velue);// connects the button to the specified value 49 | VOID Setwindow (Intsdow);// sets the signal window (silence 40) 50 | Bool Status (uint8_t num);// returns the status of the specified button 51 | Intsed ();// displays the number of the pressed button or -1, if there are no buttons pressed 52 | `` ` 53 | ### How to work 54 | - measure and write signals from the keyboard (for example, display values to the port monitor) 55 | - Pass the values to the library: 56 | - Put in an external array and transfer it to initialization (see example) 57 | - connect each button via attach (see example) 58 | - if necessary, configure the window size so that the signals from the buttons do not intersect: the distance between neighboring signals should be at least half of the window 59 | - This library allows you to just find a pressed button.For advanced work (clique, retention), use the library [encbuton] (https://github.com/gyverlibs/encbutton) in virtual mode 60 | 61 | 62 | ## Example 63 | ### External array 64 | `` `CPP 65 | #include "AnaLogkey.h" 66 | // Create an array of signal values from buttons 67 | int16_t sigs [16] = {{ 68 | 1023, 927, 856, 783, 69 | 671, 632, 590, 560, 70 | 504, 480, 455, 440, 71 | 399, 319, 255, 230 72 | }; 73 | 74 | // Specify PIN, number of buttons and array of values 75 | ANALOGKEY keys; 76 | 77 | VOID setup () { 78 | Serial.Begin (9600); 79 | 80 | // The size of the survey window is so that the buttons do not intersect 81 | // The distance between neighboring signals is at least half the window! 82 | keys.setwindow (30); 83 | } 84 | 85 | VOID loop () { 86 | // Check each button in manual mode 87 | if (keys.status (0)) serial.println ("Press 0"); 88 | if (keys.status (1)) serial.println ("Press 1"); 89 | if (keys.status (2)) serial.println ("Press 2"); 90 | if (keys.status (3)) serial.println ("Press 3"); 91 | if (keys.status (4)) serial.println ("Press 4"); 92 | if (keys.status (5)) serial.println ("Press 5"); 93 | if (keys.status (6)) serial.println ("Press 6"); 94 | 95 | // or display the number of the current pressed (-1 means not one is pressed) 96 | if (keys.pressed ()! = -1) serial.println (keys.pressed ()); 97 | Delay (10); 98 | } 99 | `` ` 100 | 101 | ### Inner array 102 | `` `CPP 103 | #include "AnaLogkey.h" 104 | // Specify the PIN and the number of buttons 105 | Analogkey keys; 106 | 107 | VOID setup () { 108 | Serial.Begin (9600); 109 | 110 | // assign the buttons their signals 111 | keys.attach (0, 1023); 112 | keys.attach (1, 927); 113 | Keys.attach (2, 856); 114 | keys.attach (3, 783); 115 | Keys.attach (4, 671); 116 | keys.attach (5, 632); 117 | Keys.attach (6, 590); 118 | keys.attach (7, 560); 119 | keys.attach (8, 504); 120 | keys.attach (9, 480); 121 | keys.attach (10, 455); 122 | keys.attach (11, 440); 123 | keys.attach (12, 399); 124 | Keys.attach (13, 319); 125 | keys.attach (14, 255); 126 | keys.attach (15, 230); 127 | } 128 | 129 | VOID loop () { 130 | // Check each button in manual mode 131 | if (keys.status (0)) serial.println ("Press 0"); 132 | if (keys.status (1)) serial.println ("Press 1"); 133 | if (keys.status (2)) serial.println ("Press 2"); 134 | if (keys.status (3)) serial.println ("Press 3"); 135 | if (keys.status (4)) serial.println ("Press 4"); 136 | if (keys.status (5)) serial.println ("Press 5"); 137 | if (keys.status (6)) serial.println ("Press 6"); 138 | 139 | // or display the number of the current pressed (-1 means not one is pressed) 140 | if (keys.pressed ()! = -1) serial.println (keys.pressed ()); 141 | Delay (10); 142 | } 143 | `` ` 144 | 145 | 146 | ## versions 147 | - V1.0 148 | - v1.1 - optimization, the logic of the window size has been changed 149 | 150 | 151 | ## bugs and feedback 152 | Create ** Issue ** when you find the bugs, and better immediately write to the mail [alex@alexgyver.ru] (mailto: alex@alexgyver.ru) 153 | The library is open for refinement and your ** pull Request ** 'ow! 154 | 155 | 156 | When reporting about bugs or incorrect work of the library, it is necessary to indicate: 157 | - The version of the library 158 | - What is MK used 159 | - SDK version (for ESP) 160 | - version of Arduino ide 161 | - whether the built -in examples work correctly, in which the functions and designs are used, leading to a bug in your code 162 | - what code has been loaded, what work was expected from it and how it works in reality 163 | - Ideally, attach the minimum code in which the bug is observed.Not a canvas of a thousand lines, but a minimum code -------------------------------------------------------------------------------- /examples/analogKeyboard/analogKeyboard.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Сигналы кнопок 3 | 1023 4 | 927 5 | 856 6 | 783 7 | 671 8 | 632 9 | 590 10 | 560 11 | 504 12 | 480 13 | 455 14 | 440 15 | 399 16 | 319 17 | 255 18 | 230 19 | */ 20 | #include "AnalogKey.h" 21 | // указываем пин и количество кнопок 22 | AnalogKey keys; 23 | 24 | void setup() { 25 | Serial.begin(9600); 26 | 27 | // назначаем кнопкам их сигналы 28 | keys.attach(0, 1023); 29 | keys.attach(1, 927); 30 | keys.attach(2, 856); 31 | keys.attach(3, 783); 32 | keys.attach(4, 671); 33 | keys.attach(5, 632); 34 | keys.attach(6, 590); 35 | keys.attach(7, 560); 36 | keys.attach(8, 504); 37 | keys.attach(9, 480); 38 | keys.attach(10, 455); 39 | keys.attach(11, 440); 40 | keys.attach(12, 399); 41 | keys.attach(13, 319); 42 | keys.attach(14, 255); 43 | keys.attach(15, 230); 44 | } 45 | 46 | void loop() { 47 | // проверяем каждую кнопку в ручном режиме 48 | if (keys.status(0)) Serial.println("press 0"); 49 | if (keys.status(1)) Serial.println("press 1"); 50 | if (keys.status(2)) Serial.println("press 2"); 51 | if (keys.status(3)) Serial.println("press 3"); 52 | if (keys.status(4)) Serial.println("press 4"); 53 | if (keys.status(5)) Serial.println("press 5"); 54 | if (keys.status(6)) Serial.println("press 6"); 55 | 56 | // или выводим номер текущей нажатой (-1 значит ни одна не нажата) 57 | if (keys.pressed() != -1) Serial.println(keys.pressed()); 58 | delay(10); 59 | } 60 | -------------------------------------------------------------------------------- /examples/analogKeyboard_short/analogKeyboard_short.ino: -------------------------------------------------------------------------------- 1 | #include "AnalogKey.h" 2 | // создаём массив значений сигналов с кнопок 3 | int16_t sigs[16] = { 4 | 1023, 927, 856, 783, 5 | 671, 632, 590, 560, 6 | 504, 480, 455, 440, 7 | 399, 319, 255, 230 8 | }; 9 | 10 | // указываем пин, количество кнопок и массив значений 11 | AnalogKey keys; 12 | 13 | void setup() { 14 | Serial.begin(9600); 15 | 16 | // размер окна опроса такой, чтобы кнопок не пересекались 17 | // Расстояние между соседними сигналами не меньше половины окна! 18 | keys.setWindow(30); 19 | } 20 | 21 | void loop() { 22 | // проверяем каждую кнопку в ручном режиме 23 | if (keys.status(0)) Serial.println("press 0"); 24 | if (keys.status(1)) Serial.println("press 1"); 25 | if (keys.status(2)) Serial.println("press 2"); 26 | if (keys.status(3)) Serial.println("press 3"); 27 | if (keys.status(4)) Serial.println("press 4"); 28 | if (keys.status(5)) Serial.println("press 5"); 29 | if (keys.status(6)) Serial.println("press 6"); 30 | 31 | // или выводим номер текущей нажатой (-1 значит ни одна не нажата) 32 | if (keys.pressed() != -1) Serial.println(keys.pressed()); 33 | delay(10); 34 | } 35 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For AnalogKey 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | AnalogKey KEYWORD1 10 | 11 | ####################################### 12 | # Methods and Functions (KEYWORD2) 13 | ####################################### 14 | 15 | attach KEYWORD2 16 | setWindow KEYWORD2 17 | status KEYWORD2 18 | pressed KEYWORD2 19 | 20 | ####################################### 21 | # Constants (LITERAL1) 22 | ####################################### -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=AnalogKey 2 | version=1.1 3 | author=AlexGyver 4 | maintainer=AlexGyver 5 | sentence=Library for matrix analog keyboard 6 | paragraph=Library for matrix analog keyboard 7 | category=Sensors 8 | url=https://github.com/GyverLibs/AnalogKey 9 | architectures=* -------------------------------------------------------------------------------- /src/AnalogKey.h: -------------------------------------------------------------------------------- 1 | /* 2 | Библиотека для работы с аналоговой клавиатурой 3 | GitHub: https://github.com/GyverLibs/AnalogKey 4 | - Встроенный простенький дебаунс 5 | - Оптимальный опрос пина по таймеру 6 | - Проверка конкретной кнопки или вывод номера нажатой 7 | 8 | AlexGyver, alex@alexgyver.ru 9 | https://alexgyver.ru/ 10 | MIT License 11 | 12 | v1.1 - оптимизация, изменена логика размера окна 13 | */ 14 | 15 | #ifndef _AnalogKey_h 16 | #define _AnalogKey_h 17 | #include 18 | 19 | #define _AKEY_PERIOD 40 // период опроса в мс 20 | 21 | template 22 | class AnalogKey { 23 | public: 24 | // подключает кнопку на указанное значение 25 | void attach(uint8_t num, int value) { 26 | if (num >= AMOUNT) return; 27 | if (S_PTR == nullptr) signals[num] = value; 28 | else signals_p[num] = value; 29 | } 30 | 31 | // устанавливает окно сигнала (умолч. 40) 32 | void setWindow(int window) { 33 | _window = window / 2; 34 | } 35 | 36 | // возвращает статус указанной кнопки 37 | bool status(uint8_t num) { 38 | if (millis() - tmr > _AKEY_PERIOD) { 39 | tmr = millis(); 40 | int16_t thisRead = analogRead(PIN); 41 | _ready = (abs(thisRead - _lastRead) < _window); 42 | _lastRead = thisRead; 43 | } 44 | return check(num); 45 | } 46 | 47 | // выводит номер нажатой кнопки или -1, если нажатых кнопок нет 48 | int pressed() { 49 | status(0); // вызываем опрос 50 | for (uint8_t i = 0; i < AMOUNT; i++) { 51 | if (check(i)) return i; 52 | } 53 | return -1; 54 | } 55 | 56 | private: 57 | bool check(int i) { 58 | int16_t sig = (S_PTR == nullptr) ? signals[i] : signals_p[i]; 59 | return (_ready && (_lastRead > sig - _window) && (_lastRead < sig + _window)); 60 | } 61 | 62 | int16_t signals[(S_PTR == nullptr) ? AMOUNT : 0]; 63 | int16_t* signals_p = S_PTR; 64 | int16_t _lastRead = 0; 65 | int16_t _window = 20; 66 | bool _ready = false; 67 | uint32_t tmr; 68 | }; 69 | #endif --------------------------------------------------------------------------------