Add libraries dir
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
// пример с библиотекой EncButton2
|
||||
|
||||
// Опциональные дефайн-настройки (показаны по умолчанию)
|
||||
//#define EB_FAST 30 // таймаут быстрого поворота, мс
|
||||
//#define EB_DEB 50 // дебаунс кнопки, мс
|
||||
//#define EB_HOLD 1000 // таймаут удержания кнопки, мс
|
||||
//#define EB_STEP 500 // период срабатывания степ, мс
|
||||
//#define EB_CLICK 400 // таймаут накликивания, мс
|
||||
|
||||
#include <EncButton2.h>
|
||||
EncButton2<EB_ENCBTN> enc(INPUT, 2, 3, 4); // энкодер с кнопкой
|
||||
//EncButton2<EB_ENC> enc(INPUT, 2, 3); // просто энкодер
|
||||
//EncButton2<EB_BTN> enc(INPUT, 4); // просто кнопка
|
||||
// для изменения направления энкодера поменяй A и B при инициализации
|
||||
|
||||
// по умолчанию пины настроены в INPUT_PULLUP
|
||||
// Если используется внешняя подтяжка - лучше перевести в INPUT
|
||||
//EncButton<EB_TICK, 2, 3, 4> enc(INPUT);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
// ещё настройки
|
||||
//enc.counter = 100; // изменение счётчика энкодера
|
||||
//enc.setHoldTimeout(500); // установка таймаута удержания кнопки
|
||||
//enc.setButtonLevel(HIGH); // LOW - кнопка подключает GND (умолч.), HIGH - кнопка подключает VCC
|
||||
}
|
||||
|
||||
void loop() {
|
||||
enc.tick(); // опрос происходит здесь
|
||||
|
||||
// =============== ЭНКОДЕР ===============
|
||||
// обычный поворот
|
||||
if (enc.turn()) {
|
||||
Serial.println("turn");
|
||||
|
||||
// можно опросить ещё:
|
||||
//Serial.println(enc.counter); // вывести счётчик
|
||||
//Serial.println(enc.fast()); // проверить быстрый поворот
|
||||
Serial.println(enc.getDir()); // направление поворота
|
||||
}
|
||||
|
||||
// "нажатый поворот"
|
||||
if (enc.turnH()) {
|
||||
Serial.println("hold + turn");
|
||||
|
||||
// можно опросить ещё:
|
||||
//Serial.println(enc.counter); // вывести счётчик
|
||||
//Serial.println(enc.fast()); // проверить быстрый поворот
|
||||
Serial.println(enc.getDir()); // направление поворота
|
||||
}
|
||||
|
||||
if (enc.left()) Serial.println("left"); // поворот налево
|
||||
if (enc.right()) Serial.println("right"); // поворот направо
|
||||
if (enc.leftH()) Serial.println("leftH"); // нажатый поворот налево
|
||||
if (enc.rightH()) Serial.println("rightH"); // нажатый поворот направо
|
||||
|
||||
// =============== КНОПКА ===============
|
||||
if (enc.press()) Serial.println("press");
|
||||
if (enc.click()) Serial.println("click");
|
||||
if (enc.release()) Serial.println("release");
|
||||
|
||||
if (enc.held()) Serial.println("held"); // однократно вернёт true при удержании
|
||||
//if (enc.hold()) Serial.println("hold"); // будет постоянно возвращать true после удержания
|
||||
if (enc.step()) Serial.println("step"); // импульсное удержание
|
||||
|
||||
// проверка на количество кликов
|
||||
if (enc.hasClicks(1)) Serial.println("action 1 clicks");
|
||||
if (enc.hasClicks(2)) Serial.println("action 2 clicks");
|
||||
if (enc.hasClicks(3)) Serial.println("action 3 clicks");
|
||||
if (enc.hasClicks(5)) Serial.println("action 5 clicks");
|
||||
|
||||
// вывести количество кликов
|
||||
if (enc.hasClicks()) {
|
||||
Serial.print("has clicks ");
|
||||
Serial.println(enc.clicks);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// объявляем массив кнопок
|
||||
#define BTN_AMOUNT 5
|
||||
#include <EncButton2.h>
|
||||
EncButton2<EB_BTN> btn[BTN_AMOUNT];
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
btn[0].setPins(INPUT_PULLUP, D3);
|
||||
btn[1].setPins(INPUT_PULLUP, D2);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
for (int i = 0; i < BTN_AMOUNT; i++) btn[i].tick();
|
||||
for (int i = 0; i < BTN_AMOUNT; i++) {
|
||||
if (btn[i].click()) {
|
||||
Serial.print("click btn: ");
|
||||
Serial.println(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// Пример с обработчиками в прерывании
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_CALLBACK, 2, 3, 4> enc; // энкодер с кнопкой <A, B, KEY>
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
enc.attach(TURN_HANDLER, myTurn); // подключим поворот
|
||||
|
||||
// прерывание обеих фаз энкодера на функцию isr
|
||||
attachInterrupt(0, isr, CHANGE);
|
||||
attachInterrupt(1, isr, CHANGE);
|
||||
}
|
||||
|
||||
void myTurn() {
|
||||
Serial.print("TURN_HANDLER: ");
|
||||
Serial.println(enc.counter);
|
||||
}
|
||||
|
||||
void isr() {
|
||||
enc.tickISR(); // тикер в прерывании
|
||||
// Не вызывает подключенные коллбэки внутри прерывания!!!
|
||||
}
|
||||
|
||||
void loop() {
|
||||
enc.tick(); // дополнительный опрос таймаутов и коллбэков в loop
|
||||
// вызов подключенных функций будет здесь,
|
||||
// чтобы не грузить прерывание
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
// Пример с обработчиками
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_CALLBACK, 2, 3, 4> enc; // энкодер с кнопкой <A, B, KEY>
|
||||
//EncButton<EB_CALLBACK, 2, 3> enc; // просто энкодер <A, B>
|
||||
//EncButton<EB_CALLBACK, 4> enc; // просто кнопка <KEY>
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
enc.attach(TURN_HANDLER, myTurn);
|
||||
enc.attach(TURN_H_HANDLER, myTurnH);
|
||||
|
||||
enc.attach(RIGHT_HANDLER, myRight);
|
||||
enc.attach(LEFT_HANDLER, myLeft);
|
||||
|
||||
enc.attach(RIGHT_H_HANDLER, myRightH);
|
||||
enc.attach(LEFT_H_HANDLER, myLeftH);
|
||||
|
||||
enc.attach(CLICK_HANDLER, myClick);
|
||||
enc.attach(HOLDED_HANDLER, myHolded);
|
||||
enc.attach(STEP_HANDLER, myStep);
|
||||
|
||||
enc.attach(PRESS_HANDLER, myPress);
|
||||
enc.attach(RELEASE_HANDLER, myRelease);
|
||||
//enc.attach(HOLD_HANDLER, myHold);
|
||||
|
||||
enc.attach(CLICKS_HANDLER, myClicks);
|
||||
enc.attachClicks(5, fiveClicks);
|
||||
}
|
||||
|
||||
void myTurn() {
|
||||
Serial.println("TURN_HANDLER: ");
|
||||
|
||||
// тут можно:
|
||||
Serial.println(enc.counter); // вывести счётчик
|
||||
//Serial.println(enc.fast()); // проверить быстрый поворот
|
||||
//Serial.println(enc.getDir()); // направление поворота
|
||||
}
|
||||
|
||||
void myTurnH() {
|
||||
Serial.println("TURN_H_HANDLER");
|
||||
|
||||
// тут можно:
|
||||
//Serial.println(enc.counter); // вывести счётчик
|
||||
//Serial.println(enc.fast()); // проверить быстрый поворот
|
||||
Serial.println(enc.getDir()); // направление поворота
|
||||
}
|
||||
|
||||
void myRight() {
|
||||
Serial.println("RIGHT_HANDLER");
|
||||
}
|
||||
void myLeft() {
|
||||
Serial.println("LEFT_HANDLER");
|
||||
}
|
||||
void myRightH() {
|
||||
Serial.println("RIGHT_H_HANDLER");
|
||||
}
|
||||
void myLeftH() {
|
||||
Serial.println("LEFT_H_HANDLER");
|
||||
}
|
||||
void myClick() {
|
||||
Serial.println("CLICK_HANDLER");
|
||||
}
|
||||
void myHolded() {
|
||||
Serial.println("HOLDED_HANDLER");
|
||||
}
|
||||
void myStep() {
|
||||
Serial.println("STEP_HANDLER");
|
||||
}
|
||||
void myClicks() {
|
||||
Serial.print("CLICKS_HANDLER: ");
|
||||
Serial.println(enc.clicks);
|
||||
}
|
||||
void fiveClicks() {
|
||||
Serial.println("action fiveClicks");
|
||||
}
|
||||
void myPress() {
|
||||
Serial.println("PRESS_HANDLER");
|
||||
}
|
||||
void myRelease() {
|
||||
Serial.println("RELEASE_HANDLER");
|
||||
}
|
||||
void myHold() {
|
||||
Serial.println("HOLD_HANDLER");
|
||||
}
|
||||
|
||||
// =============== LOOP =============
|
||||
void loop() {
|
||||
enc.tick(); // обработка всё равно здесь
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
// пример с небольшой оптимизацией опроса
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, 2, 3, 4> enc; // энкодер с кнопкой <A, B, KEY>
|
||||
//EncButton<EB_TICK, 2, 3> enc; // просто энкодер <A, B>
|
||||
//EncButton<EB_TICK, 4> enc; // просто кнопка <KEY>
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// тик вернёт отличное от нуля значение, если произошло событие:
|
||||
// 1 - left + turn
|
||||
// 2 - right + turn
|
||||
// 3 - leftH + turnH
|
||||
// 4 - rightH + turnH
|
||||
// 5 - click
|
||||
// 6 - held
|
||||
// 7 - step
|
||||
// 8 - press
|
||||
|
||||
// опрос этих событий можно проводить в условии,
|
||||
// чтобы "не тратить время" на постоянный опрос в loop
|
||||
if (enc.tick()) {
|
||||
if (enc.turn()) Serial.println("turn");
|
||||
if (enc.turnH()) Serial.println("hold + turn");
|
||||
if (enc.left()) Serial.println("left");
|
||||
if (enc.right()) Serial.println("right");
|
||||
if (enc.leftH()) Serial.println("leftH");
|
||||
if (enc.rightH()) Serial.println("rightH");
|
||||
|
||||
if (enc.press()) Serial.println("press");
|
||||
if (enc.click()) Serial.println("click");
|
||||
if (enc.held()) Serial.println("held");
|
||||
if (enc.step()) Serial.println("step");
|
||||
|
||||
// в конце лучше вызвать resetState(), чтобы сбросить необработанные флаги!
|
||||
enc.resetState();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
// пример с прерываниями pinChangeInterrupt (прерывания на любом пине)
|
||||
// только для ATmega328 (UNO, Nano, Pro Mini)
|
||||
|
||||
#define CLK 4
|
||||
#define DT 5
|
||||
#define SW 6
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, CLK, DT, SW> enc;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
// настроить PCINT
|
||||
attachPCINT(CLK);
|
||||
attachPCINT(DT);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// оставляем тут для работы "временных" функций и антидребезга
|
||||
enc.tick();
|
||||
|
||||
if (enc.turn()) { // любой поворот
|
||||
Serial.print("turn ");
|
||||
Serial.println(enc.counter); // вывод счётчика
|
||||
}
|
||||
|
||||
if (enc.left()) {
|
||||
if (enc.fast()) Serial.println("fast left");
|
||||
else Serial.println("left");
|
||||
}
|
||||
|
||||
if (enc.right()) {
|
||||
if (enc.fast()) Serial.println("fast right");
|
||||
else Serial.println("right");
|
||||
}
|
||||
}
|
||||
|
||||
// функция для настройки PCINT для ATmega328 (UNO, Nano, Pro Mini)
|
||||
uint8_t attachPCINT(uint8_t pin) {
|
||||
if (pin < 8) { // D0-D7 - PCINT2
|
||||
PCICR |= (1 << PCIE2);
|
||||
PCMSK2 |= (1 << pin);
|
||||
return 2;
|
||||
}
|
||||
else if (pin > 13) { // A0-A5 - PCINT1
|
||||
PCICR |= (1 << PCIE1);
|
||||
PCMSK1 |= (1 << pin - 14);
|
||||
return 1;
|
||||
}
|
||||
else { // D8-D13 - PCINT0
|
||||
PCICR |= (1 << PCIE0);
|
||||
PCMSK0 |= (1 << pin - 8);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Векторы PCINT, нужно кинуть сюда tickISR
|
||||
// пины 0-7: PCINT2
|
||||
// пины 8-13: PCINT0
|
||||
// пины A0-A5: PCINT1
|
||||
ISR(PCINT0_vect) {
|
||||
|
||||
}
|
||||
ISR(PCINT1_vect) {
|
||||
|
||||
}
|
||||
ISR(PCINT2_vect) {
|
||||
enc.tickISR();
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
// срабатывание функций held/hold/step после предварительных кликов
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, 3> btn;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
btn.tick();
|
||||
if (btn.click()) Serial.println("click");
|
||||
|
||||
// вызов без количества кликов перехватит все остальные вызовы!
|
||||
//if (btn.held()) Serial.println("held any clicks");
|
||||
if (btn.held(0)) Serial.println("held after 0 clicks");
|
||||
if (btn.held(2)) Serial.println("held after 2 clicks");
|
||||
|
||||
// вызов без количества кликов перехватит все остальные вызовы!
|
||||
//if (btn.hold()) Serial.println("hold any clicks");
|
||||
//if (btn.hold(0)) Serial.println("hold after 0 clicks");
|
||||
//if (btn.hold(2)) Serial.println("hold after 2 clicks");
|
||||
|
||||
// вызов без количества кликов перехватит все остальные вызовы!
|
||||
//if (btn.step()) Serial.println("step after any clicks");
|
||||
if (btn.step(0)) Serial.println("step after 0 clicks");
|
||||
if (btn.step(2)) Serial.println("step after 2 clicks");
|
||||
|
||||
// вызов без количества кликов перехватит все остальные вызовы!
|
||||
//if (btn.releaseStep()) Serial.println("release step after any clicks");
|
||||
if (btn.releaseStep(0)) Serial.println("release step after 0 clicks");
|
||||
if (btn.releaseStep(2)) Serial.println("release step after 2 clicks");
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
// используем одну КНОПКУ для удобного изменения трёх переменных
|
||||
// первая - один клик, затем удержание (нажал-отпустил-нажал-держим)
|
||||
// вторая - два клика, затем удержание
|
||||
// третья - три клика, затем удержание
|
||||
// смотри монитор порта
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, 3> btn;
|
||||
|
||||
// переменные для изменения
|
||||
int val_a, val_b, val_c;
|
||||
|
||||
// шаги изменения (signed)
|
||||
int8_t step_a = 1;
|
||||
int8_t step_b = 5;
|
||||
int8_t step_c = 10;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
btn.tick();
|
||||
|
||||
// передаём количество предварительных кликов
|
||||
if (btn.step(1)) {
|
||||
val_a += step_a;
|
||||
Serial.print("val_a: ");
|
||||
Serial.println(val_a);
|
||||
}
|
||||
if (btn.step(2)) {
|
||||
val_b += step_b;
|
||||
Serial.print("val_b: ");
|
||||
Serial.println(val_b);
|
||||
}
|
||||
if (btn.step(3)) {
|
||||
val_c += step_c;
|
||||
Serial.print("val_c: ");
|
||||
Serial.println(val_c);
|
||||
}
|
||||
|
||||
// разворачиваем шаг для изменения в обратную сторону
|
||||
// передаём количество предварительных кликов
|
||||
if (btn.releaseStep(1)) step_a = -step_a;
|
||||
if (btn.releaseStep(2)) step_b = -step_b;
|
||||
if (btn.releaseStep(3)) step_c = -step_c;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// Пример с прямой работой библиотеки на прерываниях
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, 2, 3, 4> enc; // энкодер с кнопкой <A, B, KEY>
|
||||
//EncButton<EB_TICK, 2, 3> enc; // просто энкодер <A, B>
|
||||
//EncButton<EB_TICK, 4> enc; // просто кнопка <KEY>
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
// желательно подключить оба пина энкодера на внешние прерывания по CHANGE
|
||||
// можно использовать PCINT https://github.com/NicoHood/PinChangeInterrupt
|
||||
attachInterrupt(0, isr, CHANGE); // D2
|
||||
attachInterrupt(1, isr, CHANGE); // D3
|
||||
// подключил оба прерывания на одну функцию
|
||||
}
|
||||
|
||||
void isr() {
|
||||
enc.tickISR(); // в прерывании вызываем тик ISR
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// тут тоже вызываем тик, нужен для
|
||||
// корректной работы дебаунсов и прочих таймеров!!!
|
||||
enc.tick();
|
||||
|
||||
if (enc.turn()) { // любой поворот
|
||||
Serial.print("turn ");
|
||||
Serial.println(enc.counter); // вывод счётчика
|
||||
}
|
||||
|
||||
// имитация загруженной программы, обработка происходит в прерывании
|
||||
delay(50);
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
// Пример с прямой работой библиотеки
|
||||
// просто загрузи и потыкай - всё будет понятно =)
|
||||
|
||||
// Опциональные дефайн-настройки (показаны по умолчанию)
|
||||
//#define EB_FAST 30 // таймаут быстрого поворота, мс
|
||||
//#define EB_DEB 50 // дебаунс кнопки, мс
|
||||
//#define EB_HOLD 1000 // таймаут удержания кнопки, мс
|
||||
//#define EB_STEP 500 // период срабатывания степ, мс
|
||||
//#define EB_CLICK 400 // таймаут накликивания, мс
|
||||
|
||||
#include <EncButton.h>
|
||||
//EncButton<EB_TICK, 2, 3, 4> enc; // энкодер с кнопкой <A, B, KEY>
|
||||
//EncButton<EB_TICK, 2, 3> enc; // просто энкодер <A, B>
|
||||
EncButton<EB_TICK, 4> enc; // просто кнопка <KEY>
|
||||
// для изменения направления энкодера поменяй A и B при инициализации
|
||||
|
||||
// по умолчанию пины настроены в INPUT_PULLUP
|
||||
// Если используется внешняя подтяжка - лучше перевести в INPUT
|
||||
//EncButton<EB_TICK, 2, 3, 4> enc(INPUT);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
// ещё настройки
|
||||
//enc.counter = 100; // изменение счётчика энкодера
|
||||
//enc.setHoldTimeout(500); // установка таймаута удержания кнопки
|
||||
//enc.setButtonLevel(HIGH); // LOW - кнопка подключает GND (умолч.), HIGH - кнопка подключает VCC
|
||||
}
|
||||
|
||||
void loop() {
|
||||
enc.tick(); // опрос происходит здесь
|
||||
|
||||
// =============== ЭНКОДЕР ===============
|
||||
// обычный поворот
|
||||
if (enc.turn()) {
|
||||
Serial.println("turn");
|
||||
|
||||
// можно опросить ещё:
|
||||
//Serial.println(enc.counter); // вывести счётчик
|
||||
//Serial.println(enc.fast()); // проверить быстрый поворот
|
||||
Serial.println(enc.getDir()); // направление поворота
|
||||
}
|
||||
|
||||
// "нажатый поворот"
|
||||
if (enc.turnH()) {
|
||||
Serial.println("hold + turn");
|
||||
|
||||
// можно опросить ещё:
|
||||
//Serial.println(enc.counter); // вывести счётчик
|
||||
//Serial.println(enc.fast()); // проверить быстрый поворот
|
||||
Serial.println(enc.getDir()); // направление поворота
|
||||
}
|
||||
|
||||
if (enc.left()) Serial.println("left"); // поворот налево
|
||||
if (enc.right()) Serial.println("right"); // поворот направо
|
||||
if (enc.leftH()) Serial.println("leftH"); // нажатый поворот налево
|
||||
if (enc.rightH()) Serial.println("rightH"); // нажатый поворот направо
|
||||
|
||||
// =============== КНОПКА ===============
|
||||
if (enc.press()) Serial.println("press");
|
||||
if (enc.click()) Serial.println("click");
|
||||
if (enc.release()) Serial.println("release");
|
||||
|
||||
if (enc.held()) Serial.println("held"); // однократно вернёт true при удержании
|
||||
//if (enc.hold()) Serial.println("hold"); // будет постоянно возвращать true после удержания
|
||||
if (enc.step()) Serial.println("step"); // импульсное удержание
|
||||
|
||||
// проверка на количество кликов
|
||||
if (enc.hasClicks(1)) Serial.println("action 1 clicks");
|
||||
if (enc.hasClicks(2)) Serial.println("action 2 clicks");
|
||||
if (enc.hasClicks(3)) Serial.println("action 3 clicks");
|
||||
if (enc.hasClicks(5)) Serial.println("action 5 clicks");
|
||||
|
||||
// вывести количество кликов
|
||||
if (enc.hasClicks()) {
|
||||
Serial.print("has clicks ");
|
||||
Serial.println(enc.clicks);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#include <EncButton.h>
|
||||
|
||||
EncButton<EB_TICK, VIRT_BTN> enc; // виртуальная кнопка
|
||||
//EncButton<EB_TICK, VIRT_ENCBTN> enc; // виртуальный энк с кнопкой
|
||||
//EncButton<EB_TICK, VIRT_ENC> enc; // виртуальный энк
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
pinMode(4, INPUT_PULLUP); // подтянем пин
|
||||
//enc.setHoldTimeout(500); // установка таймаута удержания кнопки
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// tick может принимать виртуальный сигнал:
|
||||
// (сигнал кнопки)
|
||||
// (сигнал энкодера А, сигнал энкодера B)
|
||||
// (сигнал энкодера А, сигнал энкодера B, сигнал кнопки)
|
||||
enc.tick(!digitalRead(4));
|
||||
|
||||
if (enc.press()) Serial.println("press");
|
||||
if (enc.click()) Serial.println("click");
|
||||
if (enc.held()) Serial.println("held");
|
||||
if (enc.step()) Serial.println("step");
|
||||
if (enc.release()) Serial.println("release");
|
||||
|
||||
if (enc.hasClicks(1)) Serial.println("1 click");
|
||||
if (enc.hasClicks(2)) Serial.println("2 click");
|
||||
if (enc.hasClicks(3)) Serial.println("3 click");
|
||||
if (enc.hasClicks(5)) Serial.println("5 click");
|
||||
|
||||
if (enc.hasClicks()) Serial.println(enc.clicks);
|
||||
//if (enc.hold()) Serial.println("hold");
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// пример работы в виртуальном режиме совместно с библиотекой AnalogKey
|
||||
// https://github.com/GyverLibs/AnalogKey
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, VIRT_BTN> btn0;
|
||||
EncButton<EB_TICK, VIRT_BTN> btn1;
|
||||
|
||||
#include <AnalogKey.h>
|
||||
// создаём массив значений сигналов с кнопок
|
||||
int16_t sigs[16] = {
|
||||
1023, 927, 856, 783,
|
||||
671, 632, 590, 560,
|
||||
504, 480, 455, 440,
|
||||
399, 319, 255, 230
|
||||
};
|
||||
|
||||
// указываем пин, количество кнопок и массив значений
|
||||
AnalogKey<A0, 16, sigs> keys;
|
||||
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
btn0.tick(keys.status(0));
|
||||
btn1.tick(keys.status(1));
|
||||
|
||||
// забираем действия с кнопок
|
||||
if (btn0.click()) Serial.println("click 0");
|
||||
if (btn0.held()) Serial.println("held 0");
|
||||
|
||||
if (btn1.press()) Serial.println("press 1");
|
||||
if (btn1.step()) Serial.println("step 1");
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
// пример работы в виртуальном режиме совместно с библиотекой SimpleKeypad
|
||||
// https://github.com/maximebohrer/SimpleKeypad
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, VIRT_BTN> btn0;
|
||||
EncButton<EB_TICK, VIRT_BTN> btn1;
|
||||
|
||||
// пины подключения (по порядку штекера)
|
||||
byte colPins[] = {7, 6, 5, 4};
|
||||
byte rowPins[] = {11, 10, 9, 8};
|
||||
|
||||
// массив имён кнопок
|
||||
char keys[4][4] = {
|
||||
{'1', '2', '3', 'A'},
|
||||
{'4', '5', '6', 'B'},
|
||||
{'7', '8', '9', 'C'},
|
||||
{'*', '0', '#', 'D'}
|
||||
};
|
||||
|
||||
#include <SimpleKeypad.h>
|
||||
SimpleKeypad pad((char*)keys, rowPins, colPins, 4, 4);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// тикаем все кнопки, передавая сравнение с кодом кнопки в цикле
|
||||
// делаем это по таймеру, чтобы не опрашивать клавиатуру постоянно
|
||||
static uint32_t tmr;
|
||||
if (millis() - tmr >= 10) {
|
||||
tmr = millis();
|
||||
char key = pad.scan();
|
||||
btn0.tick(key == '1');
|
||||
btn1.tick(key == '2');
|
||||
}
|
||||
|
||||
// забираем действия с кнопок
|
||||
if (btn0.click()) Serial.println("click 0");
|
||||
if (btn0.held()) Serial.println("held 0");
|
||||
|
||||
if (btn1.press()) Serial.println("press 1");
|
||||
if (btn1.step()) Serial.println("step 1");
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
// пример работы в виртуальном режиме совместно с библиотекой SimpleKeypad
|
||||
// https://github.com/maximebohrer/SimpleKeypad
|
||||
// передаём EncButton сразу всю клавиатуру через массивы и циклы
|
||||
|
||||
#include <EncButton.h>
|
||||
EncButton<EB_TICK, VIRT_BTN> btn[16];
|
||||
|
||||
// пины подключения (по порядку штекера)
|
||||
byte colPins[] = {7, 6, 5, 4};
|
||||
byte rowPins[] = {11, 10, 9, 8};
|
||||
|
||||
// массив имён кнопок
|
||||
char keys[4][4] = {
|
||||
{'1', '2', '3', 'A'},
|
||||
{'4', '5', '6', 'B'},
|
||||
{'7', '8', '9', 'C'},
|
||||
{'*', '0', '#', 'D'}
|
||||
};
|
||||
|
||||
#include <SimpleKeypad.h>
|
||||
SimpleKeypad pad((char*)keys, rowPins, colPins, 4, 4);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// массово тикаем все кнопки, передавая сравнение с кодом кнопки в цикле
|
||||
// делаем это по таймеру, чтобы не опрашивать клавиатуру постоянно
|
||||
static uint32_t tmr;
|
||||
if (millis() - tmr >= 10) {
|
||||
tmr = millis();
|
||||
char key = pad.scan();
|
||||
char* keysPtr = (char*)keys; // указатель для удобства опроса
|
||||
for (int i = 0; i < 16; i++) btn[i].tick(key == keysPtr[i]);
|
||||
}
|
||||
|
||||
// забираем действия с кнопок
|
||||
if (btn[0].click()) Serial.println("click 0");
|
||||
if (btn[0].held()) Serial.println("held 0");
|
||||
|
||||
if (btn[1].press()) Serial.println("press 1");
|
||||
if (btn[1].step()) Serial.println("step 1");
|
||||
}
|
||||
Reference in New Issue
Block a user