Add libraries dir

This commit is contained in:
2022-03-12 03:50:28 +08:00
parent 816f0bb3a5
commit 7572125fcb
256 changed files with 41193 additions and 0 deletions
@@ -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");
}
@@ -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");
}