Code Monkey home page Code Monkey logo

encbutton's Introduction

GyverLibs - Arduino библиотеки от AlexGyver

Logo Foo Foo

Arduino библиотеки

Датчики:

  • GyverMAX6675 - лёгкая библиотека для драйвера термопары MAX6675
  • GyverHTU21D - лёгкая библиотека для датчика температуры и влажности HTU21D
  • GyverINA - лёгкая библиотека для модулей power-monitor'ов INA219 и INA226
  • Psychrometer - библиотека для определения влажности по сухому и мокрому термометру для Arduino
  • Tachometer - библиотека тахометра для Arduino без привязки к железу
  • GyverNTC - библиотека для работы с NTC термисторами по закону Стейнхарта-Харта
  • GyverHX711 - библиотека работы с датчиками веса (АЦП) HX711 для Arduino
  • GyverBME280 - библиотека для работы с BME280 по I2C для Arduino
  • GyverDS18 - легкая библиотека для работы с 1-Wire термометрами DS18B20
  • microDS3231 - лёгкая библиотека для работы с RTC DS3231 для Arduino

Железки ввод:

  • GyverHub - панель управления для esp8266, esp32 и других Arduino. Конструктор интерфейса. Интеграция в умный дом
  • EncButton - лёгкая библиотека для энкодера и/или кнопки с огромным количеством возможностей
  • GyverJoy - библиотека для удобной работы с джойстиком
  • NecDecoder - лёгкая библиотека для декодирования ИК протокола NEC
  • AnalogKey - библиотека для работы с аналоговой клавиатурой для Arduino

Железки вывод:

  • GyverBlinker - таймер со счётчиком для мигания светодиодом и других задач
  • GyverBeeper - генерация писка по таймеру
  • QuickCharge - библиотека для управления адаптерами с поддержкой технологии QuickCharge 2.0/3.0
  • GyverShift - библиотека для удобного управления каскадом сдвиговых регистров 74HC595 и 74HC165
  • GRGB - библиотека для управления RGB светодиодами и лентами для Arduino
  • microLED - ультра лёгкая библиотека для работы с адресной лентой/матрицей
  • ServoSmooth - библиотека для плавного управления сервоприводами
  • SoftServo - библиотека для программного управления Servo (на базе millis/micros)
  • GyverRelay - библиотека классического релейного регулятора для Arduino
  • PWMrelay - библиотека для генерации низкочастотного ШИМ сигнала для реле (для ПИД регуляторов и проч.)
  • GyverDimmer - библиотека для управления симисторным диммером с Arduino
  • GyverStepper - производительная библиотека для управления шаговыми моторами с Arduino
  • GyverMotor - библиотека для удобного управления коллекторными моторами через драйвер
  • AccelMotor - библиотека для расширенного управления и стабилизации мотора с энкодером для Arduino

Дисплеи:

  • GyverSegment - мощная библиотека для любых дисплеев с 7-сегментными индикаторами
  • GyverMAX7219 - самая резкая библиотека для матриц MAX7219 на диком западе
  • GyverOLED - лёгкая и быстрая библиотека для OLED дисплея
  • SevenSegmentsDisp - [дорабатывается] библиотка для модулей семисегментного дисплея TM74HC595
  • GyverTM1637 - бибилотека для 7 сегментного дисплея на чипе TM1637 с кучей приколюх
  • CharDisplay - графический движок на символах: полноценное рисование, индикаторы загрузки, графики

Алгоритмы:

  • Stamp - хранение и преобразование времени
  • Stack - библиотека для удобной работы с массивами любого типа данных типа std::vector или массивов в js
  • SunPosition - определение положения солнца по геолокации и времени
  • OVS - повышение разрядности измерений (оверсэмплинг)
  • Approxy - линейный аппроксиматор данных
  • GyverPID - библиотека PID регулятора для Arduino
  • GyverFilters - библиотека с некоторыми удобными фильтрами для Arduino
  • Forecaster - библиотека для определения прогноза погоды по давлению для Arduino
  • mString - РЕЗКАЯ КАК ПОНОС И ЛЁГКАЯ КАК ПЁРЫШКО ЗАМЕНА STRING
  • VolAnalyzer - библиотека для амплитудного анализа звука на Arduino
  • Clap - библиотека для распознавания хлопков в микрофон
  • Random16 - библиотека для быстрой генерации 16 бит случайных чисел
  • Hamming - библиотека для упаковки и распаковки данных по алгоритму Хэмминга (избыточные данные для восстановления)
  • TimeRandom - библиотека для генерации набора случайных чисел с привязкой ко времени
  • UnixTime - конвертер unix time stamp в дату и время и наоборот для Arduino
  • GyverGFX - лёгкая библиотека двухмерной графики для дисплеев и матриц
  • GyverFIFO - универсальный кольцевой буфер для Arduino
  • GyverLBUF - линейный буфер для Arduino
  • fixed - реализация вычислений с фиксированной точкой для Arduino
  • FFT_C - библиотека преобразования Фурье на С (для esp8266)
  • BitPack - библиотека для упаковки битовых флагов в байтовый массив (экономия места) для Arduino
  • CRT - библиотека с набором функций для CRT коррекции светодиодов
  • StringUtils - набор инструментов для работы со строками
  • GSON - парсер и сборщик данных в формате JSON для Arduino

Связь:

  • GyverHTTP - очень простой и лёгкий HTTP сервер и полуасинхронный HTTP клиент
  • EasyHID - программная реализация USB мыши и клавиатуры
  • GyverTransfer - интерфейс для передачи данных (Stream-совместимый) по проводу, радио и ИК
  • GParser - простой и быстрый парсер строк в отдельные подстроки и числа для Arduino
  • AsyncStream - библиотека для асинхронного чтения объектов Stream (Serial итд)
  • Gyver433 - библиотека для радиомодулей 433 МГц и Arduino
  • GyverBus - библиотека для общения по протоколу GBUS
  • GyverUART - лёгкая библиотека для работы с последовательным портом (аналог Serial)
  • MicroUART - ещё более лёгкая библиотека для работы с последовательным портом

Системное:

  • GyverIO - быстрые функции для работы с пинами AVR, ESP8266, ESP32
  • Pairs - хранение данных в текстовом виде в формате "ключ":значение
  • TimerMs - многофункциональный программный таймер на системном таймере millis() для Arduino
  • EEManager - Менеджер EEPROM - библиотека для уменьшения износа памяти
  • GyverOS - библиотека лёгкого диспетчера задач для Arduino
  • GyverPower - библиотека для управления энергопотреблением МК AVR
  • buildTime - парсинг и получение даты и времени компиляции из констант DATE и TIME
  • GyverTimer - полноценный таймер на базе системных millis() / micros()
  • pgm_utils - набор удобных инструментов для работы с PROGMEM
  • GTL - набор шаблонных инструментов

Периферия МК (только AVR):

  • GyverTimers - настройка и контроль прерываний по аппаратным таймерам ATmega328p, ATmega2560
  • GyverWDT - библиотека для управления WDT на AVR ATmega328p/32U4/2560 & ATtiny85/84/167
  • microWire - лёгкая библиотека со стандартным набором инструментов для работы с аппаратным I2C
  • directTimers - библиотека для расширенного ручного управления таймерами ATMega2560, ATMega328, ATMega32u4
  • directADC - библиотека для расширенного ручного управления АЦП и компаратором ATmega328
  • GyverPWM - библиотека для расширенной генерации ШИМ на ATmega328 (Arduino UNO/Nano/Pro Mini...)

Библиотеки для ESP8266/ESP32

  • FileData - замена EEPROM, хранение любых данных и переменных в файлах
  • GyverPortal - простой конструктор веб интерфейса для esp8266 и ESP32
  • FastBot2 - очень быстрая и универсальная библиотека для телеграм бота (новая версия)
  • FastBot - быстрая библиотека для телеграм бота
  • SimplePortal - простой менеджер WiFi для esp8266 для задания логина-пароля WiFi и режима работы
  • GyverNTP - библиотека для получения точного времени с NTP сервера для esp8266/esp32
  • rtc_utils - обёртка для более удобного использования RTC памяти на esp8266
  • EspSleep - сон для esp8266 на любой (очень большой) период

Библиотеки для Processing

  • ProcessingPlotter - виртуальный плоттер в стиле ардуиновского
  • cards_ui - простенькая библиотека интерфейса для Processing

encbutton's People

Contributors

alexgyver avatar gyverlibs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

encbutton's Issues

Виртуальное нажатие кнопки

Привет, я бы хотел иметь возможность нажимать на кнопки обрабатываемые EncButton через Портал, чтобы выполнять одни и те же действия. Это было бы удобно, тк физически эти кнопки еще не подсоединены к МК. Я знаю, есть EncButton<EB_TICK, VIRT_BTN> enc; // виртуальная кнопка но такой подход не позволяет использовать долгое нажатие.

Внизу небольшой пример, того что хотелось бы получить. При нажатии кнопки на портале идёт вызов button_small.heldVirtual() , которая эмулирует нажатие button_small.held() и соответственно срабатывает условие if(button_small.held()) .

#include "EncButton.h"
#include <GyverPortal.h>
GyverPortal portal;

EncButton<INPUT, 1> button_small; 
EncButton<INPUT, 15> button_big;
bool valSwitch;
bool valSwitch2;
// билдер страницы
void build() {
  String s;
  BUILD_BEGIN(s);
  add.THEME(GP_DARK);

  add.AREA_LOG(5);

  add.BUTTON_MINI("btn1", "Открыть заслонку");
  add.BUTTON_MINI("btn2", "Закрыть заслонку");
  add.BREAK();

  add.LABEL("Включать вентилятор при открытии заслонки(долгое нажатие маленькой кнопки): ");
  add.SWITCH("sw1", valSwitch);
  add.BREAK();

  add.LABEL("Открывать заслонку при смыве(долгое нажатие большой кнопки): ");
  add.SWITCH("sw2", valSwitch2);
  add.BREAK();


  BUILD_END();
}

void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin("", "");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  portal.attachBuild(build);
  portal.start();
  portal.log.start(30);
}

void loop() {
  portal.tick();

  if (portal.click("btn1")) button_small.clickVirtual(); //эмулирует нажатие кнопки button_small
  if (portal.click("btn2")) button_big.clickVirtual(); //эмулирует нажатие кнопки button_big
  if (portal.click("sw1")) button_small.heldVirtual(); //эмулирует долгое нажатие кнопки button_small
  if (portal.click("sw2")) button_big.heldVirtual(); //эмулирует долгое нажатие кнопки button_big
  
  //будут отрабатывать при нажатии на физические и виртуальные кнопки через Портал
  if (button_small.held())portal.log.println(Ok);
  if (button_big.held())portal.log.println(Ok);
  if (button_big.click())portal.log.println(Ok);
  if (button_small.click()) portal.log.println(Ok);
}

Почему два класса

В чём основное различие между EncButton и EncButton2?
Возможно я могу помочь свести в один файл.

ArduinoOTA не работает при вызове метода enc.tick()

Проект на esp32. Функция loop () выглядит примерно следующим образом:

void loop () {
  ArduinoOTA.handle();
  enc.tick();
  getSensors();
}

В случае вызова метода enc.tick(), при работе стандартных процедур ArduinoOTA код в loop() продолжает выполняться, тем самым прерывая обновление.
Энкодер подключен без использования прерываний.

Не понятен пример использования массива кнопок.

// объявляем массив кнопок
#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);
}

}
}

Обьявили 5 кнопок а обьекта создали 2 всего. Что это за массив кнопок он аналоговый или это матричная клавиатура?
Нельзя ли пояснить? могу нарисовать схему помочь если нужно.
Скорее всего такая клавиатура?
keypad-matrix-scheme-1024x504

Не работает на Arduino Nano 33 BLE

При использовании Arduino Nano 33 BLE не распознаются повороты энкодера, только взаимодействие с кнопкой.
Энкодер EC11 на круглой плате.
Пробовал разные режимы INPUT и INPUT_PULLUP, не помогло.

Guru Meditation Error на ESP32

Решил использовать библиотеку в проекте бортового компьютера на esp32. Если использовать тикер в loop, то все нормально, если пользоваться прерываниями, то периодически при нажатии кнопки все зависает с ошибкой в консоли: Guru Meditation Error: Core 1 panic'ed (Cache disabled but cached memory region accessed)
Core 1 register dump:
PC : 0x400d3308 PS : 0x00060034 A0 : 0x40083958 A1 : 0x3ffbec10
A2 : 0x00000011 A3 : 0x3ffc02cc A4 : 0x00000000 A5 : 0x00020000
A6 : 0x3ffae270 A7 : 0x00060323 A8 : 0x80080f08 A9 : 0x00000000
A10 : 0x00000000 A11 : 0x3ffb932c A12 : 0x80082cde A13 : 0x3ffb1a50
A14 : 0x00000001 A15 : 0x3ffb8058 SAR : 0x0000001b EXCCAUSE: 0x00000007
EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0x00000000
Core 1 was running in ISR context:
EPC1 : 0x4008a9c2 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x400d3308

ELF file SHA256: 0000000000000000

Backtrace: 0x400d3308:0x3ffbec10 0x40083955:0x3ffbec30 0x4008a9bf:0x3ffb1a80 0x4008aa86:0x3ffb1ab0 0x4008b2d5:0x3ffb1ad0 0x4008

Unusual step counting by rotary encoder

Hey,
I am using KY-040 rotary encoder on ESP8266 microcontroller in my project. I am using the EncButton library.
The problem I am experiencing is incorrect step counting when moving the encoder knob. When I turn the knob one time, the step is not counted, only the second move of the encoder counts one step. Each one step is counted as 2 shifts of the encoder knob. Does anyone know how I can change this so that each one shift of the knob counts one encoder step?

Как задать #define EB_HOLD для разных кнопок разные значения?

Добрый день!

Параметр #define EB_HOLD влияет на все кнопки. А как задать этот параметр для кнопок отдельно?

Например для вращения пушки нужно значение нуль, а вот для кнопки выстрела очередями нужна небольшая задержка (чтобы была возможность стрелять отдельными пулями и очередями).

Добавить функцию attachHolds(Кол-во удержаний, функция)

Было бы неплохо добавить функцию на подобии attachHolds(Кол-во удержаний, функция), которая будет вызывать функцию которую её передадут (как attach и attachClicks) когда кнопку удержали определённое количество раз. Также можно добавить счётчик удерживаний на подобии счётчика кликов.

Ошибка в схеме энкодера

https://github.com/GyverLibs/EncButton/blob/main/doc/enc.png
Здесь в схеме допущена ошибка . Сопротивления R12 и R13 в енкодере находятся в другом месте. Между конденсатором и выходом энкодера как А так и В А пины сразу выходят с кондесаторов.
https://drive.google.com/file/d/1GKEJEZuG_lee2cvp-ihmwgnxtwhLmuWn/view?usp=sharing

Работа EncButton на матричной клавиатуре

Добрый день! Я заранее извиняюсь, если вопрос глупый, но я перед этим гуглил и искал и правда не нашел как внедрить двойной клик в матричную клавиатуру. В виртуальном режиме указано

Виртуальный режим позволяет получить все возможности библиотеки EncButton в ситуациях, когда кнопка не подключена напрямую к микроконтроллеру, либо для её опроса используется другая библиотека:
Аналоговая клавиатура (например через библиотеку [AnalogKey]
Матричная клавиатура (например через библиотеку [SimpleKeypad])"

Вопрос, как с помощью этой библиотеки сделать одну или несколько кнопок на матричной клавиатуре c двойным нажатием ?

Не работает "Полушаговый" энкодер

Стоит какойто полушаговый энкодер, что бы произошел тик, надо два щелчка прокрутить. Это при стандартных настройках библиотеки.

Запустил голый пример из библиотеки под названием optimisation, и вставил #define EB_HALFSTEP_ENC, а после полез смотреть в serial. Там при прокрутке энкодер чудит. При прокрутке сначала вправа, показывает turn right, при повторной прокрутке вправо "turn left turn right". аналогично при прокрутке влево. Кнопка SW вообще реагировать перестала.

Прерывания и pcf8575

Прошу добавить пример для отлова даблкликов и холдов с использованием прерываний на esp32 с расширителем портов.
Пока не очень понятно, когда и сколько раз вызывать tick():
в лууп, в функции прерывания, в обоих случаях.

PS Приятно говорить с разработчиком на одном языке.

Не помещается в ATtiny13

Версия библиотеки: 2.0
Какой используется МК: ATtiny13A + MicroCore

Библиотека настроенная для полноценного энкодера с кнопкой фото не помещается во флеш память ATtiny13

#include <EncButton.h>
#include <stdbool.h>

#define ENCODER_KEY_PIN 2
#define ENCODER_ROT_RIGHT_PIN 3
#define ENCODER_ROT_LEFT_PIN 4
#define PWM_PIN 0

EncButton<EB_TICK, ENCODER_ROT_RIGHT_PIN, ENCODER_ROT_LEFT_PIN, ENCODER_KEY_PIN> enc;  

bool onOff = TRUE;

void setup() {
}

void loop() {
  if (enc.tick()) {
    if (enc.click())
      onOff = !onOff;
  }
}

Этот код занимает 1142 байт(111%) флеша.
Это баг библиотеки, выбранного ядра, или она в принципе не поддерживает камни меньше ATtiny85?

Migration from V2 to V3: tick() returns unreliable status

Unsuccessfully tried to migrate from V2 to v3 with troubles. Platform: STM32F401
I use the following to handle events/actions:

if( inputEnc.tick() ){
        // event handler
        bool fastRotate = inputEnc.fast();
  	if( inputEnc.right() ) {
           // do something for encoder turning right
        }
        ....
  	if( inputEnc.left() ) {
           // do something for encoder turning left
        }
 }

So, it seems that tick() is skipping events (returns true for some events, does not return true for some events even though an event is happening); as a result, the handler does not process events, behaves as event did not happen... It skips events unregularly, so, I did not notice any pattern. Should be mentioned, I also call tickISR() in the interrupt for any pin state CHANGE.
Please, check up if tick() is always returning true for any event.
Thank you.

Turn events fire only after two "ticks"

It's hard for me to understand how the library works and to search here because you don't write in English.
Anyway, using the examples provided I see it prints out a turn event only after two "ticks" of my encoder in either direction.

I'm using a common ALPS EC12D1564402.

Is there any setting to change in order to see every "tick"?

Работоспособность кода на ESP8266/ESP12F

/*
   Пример работы с энкодером с прерыванием. Максимальная чёткость работы
   в любом быдлокоде!
*/

#define CLK 2
#define DT 3
#define SW 4

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, isrCLK, CHANGE);    // прерывание на 2 пине! CLK у энка
  attachInterrupt(1, isrDT, CHANGE);    // прерывание на 3 пине! DT у энка
}

void isrCLK() {
  enc1.tick();  // отработка в прерывании
}
void isrDT() {
  enc1.tick();  // отработка в прерывании
}

void loop() {
  enc1.tick();
  if (enc1.isRight()) Serial.println("Right");         // если был поворот
  if (enc1.isLeft()) Serial.println("Left");

  if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
  if (enc1.isLeftH()) Serial.println("Left holded");
}

Данный код перезагружает модуль ЕСП12 и выдает циклически ошибку

19:57:06.723 -> >>>stack>>>
19:57:06.723 -> 
19:57:06.723 -> ctx: cont
19:57:06.723 -> sp: 3fffff00 end: 3fffffc0 offset: 0000
19:57:06.769 -> 3fffff00:  feefeffe feefeffe feefeffe 3ffef314  
19:57:06.823 -> 3fffff10:  000000fe 00000000 00000000 00000000  
19:57:06.870 -> 3fffff20:  00000000 00000000 00000000 00ff0000  
19:57:06.923 -> 3fffff30:  5ffffe00 5ffffe00 00002580 3ffee588  
19:57:06.970 -> 3fffff40:  00000000 00000003 00000001 4020219e  
19:57:07.024 -> 3fffff50:  40100439 00000001 3ffee520 402021b0  
19:57:07.070 -> 3fffff60:  4020272c 00000003 00000001 402026b1  
19:57:07.124 -> 3fffff70:  401000f8 00000000 feefeffe feefeffe  
19:57:07.171 -> 3fffff80:  3fffdad0 00000000 3ffee574 40202750  
19:57:07.224 -> 3fffff90:  3fffdad0 00000000 3ffee574 40201072  
19:57:07.324 -> 3fffffa0:  feefeffe feefeffe feefeffe 40201d2c  
19:57:07.324 -> 3fffffb0:  feefeffe feefeffe 3ffe85d8 40100cf5  
19:57:07.425 -> <<<stack<<<
19:57:07.425 -> 
19:57:07.425 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
19:57:07.472 -> H!⸮⸮�)⸮@H⸮⸮tH�⸮ISR not in IRAM!
19:57:07.572 -> 
19:57:07.572 -> User exception (panic/abort/assert)
19:57:07.618 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
19:57:07.664 -> 
19:57:07.664 -> Abort called

Автор библиотеки пишет, что нужно в имя функции подставлять IRAM_ATTR void имя(){}
https://alexgyver.ru/lessons/interrupts/
Но в таком случае функция isrCLK не декларирована вообще.
В статье всего две строки по поводу wemos mini(esp8266)

На esp8266 прерывание можно настроить стандартными средствами на любом пине.

Приведите хотя бы один пример использования прерываний для этих "железок"!

Работа энкодера.

У меня энкодер как такой же как здесь. #10
Я прописал дефайны вот так.
#define EB_BETTER_ENC // улучшенный алгоритм опроса энкодера. Добавит 16 байт SRAM при подключении библиотеки #define EB_HALFSTEP_ENC // режим опроса полушагового энкодера (включи, если твой энкодер делает два тика за один)
Но энкодер всё равно работает без изменений 2 к 1. Что я делаю не так?

Передать аргументы в событие.

Здравствуйте.
Во первых, спасибо за работу)

Теперь к делу. При реализации энкодера в классе, приходится делать метод события статическим, что лишает достпа к локальным переменным класса. Если будет такая возможность, то добавьте передачу аргументов в событие.

Сам я не хотел бы пул реквестить в библиотеку, без нормального понимания внутренней структуры и достаточной компетенции в плюсах.

Описка в README

В предложении: "Например дял обработки кнопки при помощи Button нужно открыть ниже описание Button и VirtButton"

32767 on arduino nano

Используется arduino nano и encoder e6b2-cwz1x.
Во время использования библиотеки с инкрементарным энкодером значения растут до 32767. Далее выводится
-32768 и счетчик уменьшается, выводя отрицательные значения. Хотя направления энкодера не изменяется. Далее, после достижения -32768, счетчик снова становится положительным, однако значения продолжают уменьшаться.
С чем это может быть связано и как это исправить ?

Проблема с энкодерами

Добрый день!
Подскажите, в чем может быть проблема, кнопки не считываются вообще
И на экране ничего не меняется при прокрутке энкодера, не пойму в чем ошибка, подскажите пожалуйста

#include <Arduino.h>
#include <GyverOLED.h>
#include <EncButton2.h>

GyverOLED<SSH1106_128x64, OLED_NO_BUFFER> oled(0x3C);

const int NUM_SLIDERS = 4;
int analogSliderValues[NUM_SLIDERS] = {0};

EncButton2<EB_BTN> button_pin[NUM_SLIDERS];
EncButton2<EB_ENC> encoder[NUM_SLIDERS];

int knobState[NUM_SLIDERS];
int Mute[NUM_SLIDERS];
int knobVal[NUM_SLIDERS];
int mappedvalueslider[NUM_SLIDERS];
long unsigned int remappedvalue[NUM_SLIDERS];

const uint8_t sound_8x8[] PROGMEM = {0x3c, 0x7e, 0xff, 0x00, 0x18, 0x42, 0x3c, 0x00};
const uint8_t browser_8x8[] PROGMEM = {0xff, 0x85, 0x89, 0x91, 0x91, 0x89, 0x85, 0xff};
const uint8_t other_8x8[] PROGMEM = {0x3f, 0xa1, 0xa1, 0xe1, 0xe1, 0xa1, 0xa1, 0x3f};
const uint8_t microphone_8x8[] PROGMEM = {0x1c, 0x30, 0x20, 0xef, 0xef, 0x20, 0x30, 0x1c};

void setup() {
  Serial.begin(115200);
  Wire.begin();				
  Wire.setClock(100000);

  oled.init();              // инициализация
  oled.clear();
  oled.home();
  oled.update();

  //--Кнопки (SW)--//
    button_pin[0].setPins(INPUT_PULLUP, 15); //A1
    button_pin[1].setPins(INPUT_PULLUP, 16); //A2
    button_pin[2].setPins(INPUT_PULLUP, 17); //A3
    button_pin[3].setPins(INPUT_PULLUP, 20); //A6

    //--Энкодер и Кнопки (DT & CLK)--//
    encoder[0].setPins(INPUT_PULLUP, 4, 5);
    encoder[1].setPins(INPUT_PULLUP, 6, 7);
    encoder[2].setPins(INPUT_PULLUP, 8, 9);
    encoder[3].setPins(INPUT_PULLUP, 10, 11);

    for (int i = 0; i < NUM_SLIDERS; i++) button_pin[i].tick();
    for (int i = 0; i < NUM_SLIDERS; i++){ 
      button_pin[i].click();
      analogSliderValues[i] = 1023;
      knobState[i] = 0;
      Mute[i] = 0;
      encoder[i].counter = 51;
    }
  display_draw();
}

void checkButtons() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (digitalRead(button_pin[i].click()) == 0 && knobState[i] == 0) {
      Mute[i] = !Mute[i];
      knobState[i] = 1;
      delay(25);
    }
    if (digitalRead(button_pin[i].click()) == 1) {
      knobState[i] = 0;
    }
  }
}

void checkEncoders() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    knobVal[i] = encoder[i].counter;
    if (digitalRead(encoder[i].left()) || digitalRead(encoder[i].right()) && knobVal[i] > 0 && knobVal[i] < 102 && Mute[i] == 0) {
      analogSliderValues[i] = map(knobVal[i], 0, 102, 0, 1023);
      } else if (Mute[i] == 0 && (knobVal[i] >= 102)) {
        analogSliderValues[i] = 1023;
        encoder[i].counter = 102;
      } else if (Mute[i] == 1) {
        analogSliderValues[i] = 0;
      } else {
        analogSliderValues[i] = 0;
        encoder[i].counter = 0; 
    }
  }
}

void mappingvalues(){
  for(int i = 0; i < 4; i++){
      mappedvalueslider[i] = map(analogSliderValues[i], 0, 1023, 0, 97);
      remappedvalue[i] = map(analogSliderValues[i], 0, 1023, 0, 100);
  }
}

void display_draw(){
  oled.clear();    // Очистка буфера
  oled.home();
  oled.setScale(1);

  byte textPos1 = 2;
  byte textPos2 = 19;
  byte textPos3 = 36;
  byte textPos4 = 53;

  //рисует 4 рамоки
  /*for(int i = 2; i < 54; i= i + 17){
    oled.rect(20, i, 97, i + 6, OLED_STROKE);
  }*/

  //рисует знаки %) рядом с 4 рамками
  for(int i = 2; i < 54; i = i + 17){
    oled.setCursorXY(120, i);
    oled.print("%");
  }

  //заполняет каждый из 4 индикаторов выполнения их значениями
  for(int i = 0; i < 4; i++) {
    oled.rect(20, 2, 97, mappedvalueslider[i] + 8, OLED_FILL);
    oled.rect(20, 19, 97, mappedvalueslider[i] + 25, OLED_FILL);
    oled.rect(20, 36, 97, mappedvalueslider[i] + 42, OLED_FILL);
    oled.rect(20, 53, 97, mappedvalueslider[i] + 59, OLED_FILL);  
  }

  //Выведите процентное значение каждого ползунка
  for(int i = 0; i < 4; i++) {
    if(remappedvalue[i] < 10){
      oled.setCursorXY(113, 2 + (17 * i));
    } else if(remappedvalue[i] > 9 && remappedvalue[i] < 100) {
      oled.setCursorXY(107, 2 + (17 * i));
    } else if(remappedvalue[i] == 100) {
      oled.setCursorXY(101, 2 + (17 * i));
    }
    oled.print(remappedvalue[i]);
  }

  oled.drawBitmap(6, textPos1, sound_8x8, 8, 8);
  oled.drawBitmap(6, textPos2, browser_8x8, 8, 8);
  oled.drawBitmap(6, textPos3, other_8x8, 8, 8);
  oled.drawBitmap(6, textPos4, microphone_8x8, 8, 8);

  oled.update();
}

void sendSliderValues() {
  String builtString = String("");
  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);
    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }
  Serial.println(builtString);
}

void loop(){
  mappingvalues();
  for (int i = 0; i < NUM_SLIDERS; i++) encoder[i].tick();
  for (int i = 0; i < NUM_SLIDERS; i++) button_pin[i].tick();
  for (int i = 0; i < NUM_SLIDERS; i++) {
    knobVal[i] = encoder[i].counter;
  }
  checkButtons();
  checkEncoders();
  sendSliderValues();
}

Конфликтует с библиотекой ArduinoJson

EncButton - версия 2.0
ArduinoJson - версия 6.21.2

Ошибка компиляции:

/Users/.../Arduino/libraries/ArduinoJson/src/ArduinoJson/Configuration.hpp:215:4: error: #error nullptr is defined as a macro. Remove the faulty #define or #undef nullptr
 #  error nullptr is defined as a macro. Remove the faulty #define or #undef nullptr
    ^~~~~

Совместимость с ESP8266 (Wemos D1 Mini)

Здравствуйте! Суть проблемы: библиотека плохо работает на ESP8266, контроллер перезагружается при повороте/нажатии на кнопку энкодера. С Arduino Nano этот же энкодер работает стабильно. Может проблема в самой плате?

the 'eb.clear()' does not really set the encoder counter to 0

Thanks for your great work and it's a useful and elegant lib which saved me quite a lot of time.
With the EncButton, I found there is no way to clear the counter. eg, I turn to a position and need to tell the program the current position is '0', so I can double click the button to trigger that, however the 'eb.clear()' does not really set the encoder counter to 0. could you help?

3.5.1 Won't compile

Library appears to be missing.

Arduino/libraries/EncButton/src/core/utils.h:5:10: fatal error: GyverIO.h

Сломались клик и даблклик

На версии 1.8 в моём контроллере освещения дома с 40 выключателями работали клик, даблклик и холд.
Случайно обновил библиотеку до версии 1.11.1 перед очередным компилированием и все нажатия стали распознаваться как пресс и холдед.
Даунгрэйд на 1.8 решил проблему.
Используются прерывания и три расширителя портов, но не думаю. что дело в расширителях.

Прошу починить события.

Код примерно такой:

#ifdef button
/* для отслеживания кликов, даблкликов, лонгпрессов, v 1.8 https://github.com/GyverLibs/EncButton */
#include <EncButton.h> 


/* массив виртуальных кнопок */
`EncButton<EB_TICK, VIRT_BTN> * buttons = new EncButton<EB_TICK, VIRT_BTN> [RELAY_NUM]; `


unsigned long timing; // Переменная для хранения точки отсчета

// Функции прерываний
void   IRAM_ATTR keyChangedOnPCF1() 
{
  keyChanged1 = true;
  time_click1 = millis();
}

void  IRAM_ATTR  keyChangedOnPCF2() {
  // Interrupt called (No Serial no read no wire in this function, and DEBUG disabled on PCF library)
  keyChanged2 = true;
  time_click2 = millis();
}

void  IRAM_ATTR keyChangedOnPCF3() {
  // Interrupt called (No Serial no read no wire in this function, and DEBUG disabled on PCF library)
  keyChanged3 = true;
  time_click3 = millis();
}

void loop_buttons() {

  if (millis() - timing > 10) { // Проверяем кнопки каждые 10мс
   timing = millis();

    //если нет подключенного расширителя, то флаг состояния может сбрасываться при перезагрузке
    // чтобы исключить лишние тики неподключенных расширителей с ложными событиями, проверяем подключение

    //обработка выключателей
    if (((keyChanged1) || (millis() - time_click1 < 5000)) && (In1Con)) { //при изменении входов первого расширителя или в течение 5 секунд после
      uint16_t di = in1.readButton16(); // здесь состояния всех входов после изменения как 11100011110001, в прерывании эта функция вызывает перезагрузку
      //разбираем байты и тикаем виртуальные кнопки в цикле
      /*
         p0 = ((di & bit(0))>0)?HIGH:LOW;
         p1 = ((di & bit(1))>0)?HIGH:LOW;
         p2 = ((di & bit(2))>0)?HIGH:LOW;
         p3 = ((di & bit(3))>0)?HIGH:LOW;
         p4 = ((di & bit(4))>0)?HIGH:LOW;
         p5 = ((di & bit(5))>0)?HIGH:LOW;
         p6 = ((di & bit(6))>0)?HIGH:LOW;
         p7 = ((di & bit(7))>0)?HIGH:LOW;
      */
      for (uint8_t i = 0; i < 16; i++) { // тикаем первые 16 виртуальных кнопок, т.е. buttons[0-15]
        buttons[i].tick(((di & bit(i)) > 0) ? LOW : HIGH); // кнопки подтянуты к питанию и прижимаем к GND в нажатии, поэтому HIGH = отпущена

        // публикуем событие
        if (buttons[i].isHolded()) {
          Serial.print("holded ");
          Serial.println(i + 1);
          publishSwitchJsonState(i, "holded");
        }

        if (buttons[i].isPress()) {
          Serial.print("press ");
          Serial.println(i + 1);
          publishSwitchJsonState(i, "press");
          TargetRelay[i] = ! StatusRelay[i];
        }

        if (buttons[i].hasClicks(1)) {
          Serial.print("click ");
          Serial.println(i + 1);
          publishSwitchJsonState(i, "click");
        }
        if (buttons[i].hasClicks(2)) {
          Serial.print("2 click ");
          Serial.println(i + 1);
          publishSwitchJsonState(i, "double");
        }

        //    if (buttons[i].hasClicks()) Serial.println(buttons[i].clicks);
        //     if (buttons[i].isHold()) Serial.println("hold");

      } //for

      keyChanged1 = false; //сбрасываем флаг изменённых входов расширителя
    } //if


    if (((keyChanged2) || (millis() - time_click2 < 5000))  && (In2Con)) { //при изменении входов второго расширителя
      uint16_t di = in2.readButton16(); // здесь состояния всех входов после изменения как 11100011110001
      for (uint8_t i = 0; i < 16; i++) { // тикаем вторые 16 виртуальных кнопок, т.е. buttons[16-31]
        buttons[i + 16].tick(((di & bit(i)) > 0) ? LOW : HIGH);

        // публикуем событие
        if (buttons[i + 16].isHolded()) {
          Serial.print("holded ");
          Serial.println(i + 17);
          publishSwitchJsonState(i + 16, "holded");
        }

        if (buttons[i + 16].isPress()) {
          Serial.print("press ");
          Serial.println(i + 17);
          publishSwitchJsonState(i + 16, "press");
          TargetRelay[i + 16] = ! StatusRelay[i + 16];
        }

        if (buttons[i + 16].hasClicks(1)) {
          Serial.print("click ");
          Serial.println(i + 17);
          publishSwitchJsonState(i + 16, "click");
        }
        if (buttons[i + 16].hasClicks(2)) {
          Serial.print("2 click ");
          Serial.println(i + 17);
          publishSwitchJsonState(i + 16, "double");
        }

      } //for

      keyChanged2 = false; //сбрасываем флаг изменённых входов расширителя

    } //if

    if (((keyChanged3) || (millis() - time_click3 < 5000))  && (In3Con)) { //при изменении входов третьего расширителя
      uint16_t di = in3.readButton16(); // здесь состояния всех входов после изменения как 11100011110001
      for (uint8_t i = 0; i < 8; i++) { // тикаем последние 8 виртуальных кнопок, т.е. buttons[32-39]
        buttons[i + 32].tick(((di & bit(i)) > 0) ? LOW : HIGH);

        // публикуем событие
        if (buttons[i + 32].isHolded()) {
          Serial.print("holded ");
          Serial.println(i + 33);
          publishSwitchJsonState(i + 32, "holded");
        }

        if (buttons[i + 32].isPress()) {
          Serial.print("press ");
          Serial.println(i + 33);
          publishSwitchJsonState(i + 32, "press");
          TargetRelay[i + 32] = ! StatusRelay[i + 32];
        }

        if (buttons[i + 32].hasClicks(1)) {
          Serial.print("click ");
          Serial.println(i + 33);
          publishSwitchJsonState(i + 32, "click");
        }
        if (buttons[i + 32].hasClicks(2)) {
          Serial.print("2 click ");
          Serial.println(i + 33);
          publishSwitchJsonState(i + 32, "double");
        }
      } //for
      keyChanged3 = false; //сбрасываем флаг изменённых входов расширителя
    } //if
  }
} //loop
#endif

Увеличение время срабатывания между тиками

Библиотеки - зло.
Когда используешь отдельно и в чистом коде все работает как часики, но стоит проекту обрасти другими библиотеками или даже просто кодом и начинается чехарда.
В общем имею код, который опрашивает два датчика AHT10(с родной библиотекой AHTxx) и DS18B20(чистый код без библиотеки), также данные о температурах выводятся на дисплей нокия 5110 с помощью библиотеки adafruit.
Помимо этого использую микросхему PCF8575 для увеличения портов, работающую по шине I2C как и AHT10.
В общем использую библиотеку EncButton2.h и когда код "в сборе" то тики влево/вправо не отрабатывают при нормальном вращении, если вращать энкодер туда/сюда медленнее чем обычно, как бы от одного щелчка к другому, или например вращать быстро вправо несколько тиков, а потом один влево то библиотека определит поворот вправо, и наоборот.
Пробовал играться настройками(но чувствую они не для этого случая)
// ========= НАСТРОЙКИ (можно передефайнить из скетча) ==========
#define _EB_FAST 30 // таймаут быстрого поворота
#define _EB_DEB 50 // дебаунс кнопки
#define _EB_CLICK 400 // таймаут накликивания
Увеличивал/уменьшал таймайт быстрого поворота - результата ноль.
Когда использую чистый код для энкодера без библы гайвера, то срабатывание всегда.
Подскажите какие параметры "подкрутить" и вообще как понять, в чем проблема.
P.S. Железка, которую проектирую, собрана на печатной плате.
В ней я, дабы выиграть количество ножек, спецом использовал RT и TX ноги ESP12 под дисплей нокия 5110 и теперь не имею возможности использовать сериал монитор для отладки.
Вывожу конечно команды отработки на дисплей, что в принципе одно и тоже.
Но код с библиотекой гайвера не отрабатывает, хотя в том же проекте теплицы он шурует нормально.
У себя пробовал отключать опросы датчиков и разумеется сразу энкодер работал нормально, но когда не используешь библиотеку, на чистом коде все работает четко, но библиотека гайвера для большого проекта удобнее.
Мне как раз нужно вставлять обработчик в условия и менять параметры от этого.
Используя чистый код без библиотеки получается кода становиться много и его отслеживать сложно.

fast() всегда false

espressif8266 d1_mini platformio

fast() всегда возвращает false, если проверять в колбеке при экшене EB_TURN

EncButton eb(E_CLK, E_DT, E_SW);

void setup() {
  eb.attach(eb_cb);
}

void loop(void)  {
  eb.tick();
}

void eb_cb() {
  switch (eb.action()) {
    case EB_TURN:
          Serial.print("fast: ");
          Serial.println(eb.fast()); // !!! ALWAYS 0
        }
      }

ps: код условный, для отражения сути

Опрос кнопок в момент перезагрузки устройства

Возможно сделать опрос состояния кнопок в цикле setup(){}?
Что то вроде такого

void setup() {
	btn.setButtonLevel(HIGH);
    Serial.begin(115200);
    btn.tick();
    if (btn.click()) { // или hold()
        Serial.println("Правая кнопка удержана при перезагрузке");
    }
}

У меня этот код не заработал в setup.
Код индусов свободно опрашивает кнопку, если ее удерживать во время перезапуска МК, путем нажатия RESET на отладочной плате.

  if (Btn.read())
    Serial.begin(115200);
    Serial.println("Правая кнопка удержана при перезагрузке");
    }

Использование RX/TX (GPIO3/GPIO3) в качестве А и В в pinmode, A, B, KEY

Подскажите, использую ESP8266 в схеме управления котлом.
Почти все стандартные выхода D0...D7 на вход и выход заняты.
Остались GPIO9 и GPIO10, а также RX/TX (GPIO3/GPIO3).
Эта библиотека не может опрашивать данные ноги на вход?
Пробовал и через:

pinMode(1, FUNCTION_3);
pinMode(1, INPUT);

Часть кода такая:

#include <SPI.h>
#include <EncButton2.h>
EncButton2<EB_ENCBTN> enc(INPUT, 1, 3, D7); // энкодер с кнопкой (A, B, KEY)
void setup() {
pinMode(1, INPUT);
pinMode(3, INPUT);
Serial.begin(115200);
}

Ничего не происходит...
Не хотелось бы использовать мультиплексоры - все таки надо, чтобы устройство не потребляло много электричества и было отчасти "автономным".

Умеет-ли isPress() обрабатывать быстрые клики?

Здравствуйте!
Спасибо за библиотеку и канал!
Вопрос:

Можно ли при помощи isPress() обрабатывать клики, между которыми очень маленький промежуток?

Я когда кликаю пример 2-3 раза в сек. то все нормально, но если кликать быстрее, то некоторые клики пропускаются. Как это исправить?

Добавить поддержку энкодера

У меня есть энкодер, но прокрутка у него срабатывает только каждый второй раз. Насколько я понял, EncButton перестал поддерживать несколько типов энкодеров.

large_image-6fa5b36c-b822-4468-bed4-bdf3d3b4daad

В локальной библиотечке у себя в методе:
void poolEnc(uint8_t state)

заменяю
if (state == 0x3 && _ecount != 0) {

на
if ((state == 0x3 || state == 0x0) && _ecount != 0) {

то всё работает как требуется.
Можете ещё один дефайн сделать и поправить код, чтобы поддержку этого энкодера включить?

-- edited:
Прикрепил корректную картинку

Todo?

  • не сбрасывать таймер в pressisr если уже busy. Или уже deb?

Correct syntax for callback mode in version 2

What is the correct syntax to enable the callbacks in version2?

#define  EB_FAST  30    
#define  EB_BETTER_ENC  
#define  EB_HALFSTEP_ENC

#define  EB_DEB  50      
#define  EB_STEP  100    
#define  EB_CLICK  400   
#define  EB_HOLD  1000   

#include <EncButton2.h>
EncButton2<EB_CALLBACK> enc(11, 9, 10);

void myRight() {
  Serial.println("RIGHT_HANDLER");
}
void myLeft() {
  Serial.println("LEFT_HANDLER");
}

void setup() 
{
  Serial.begin(115200);
  while(!Serial);

  enc.attach(RIGHT_HANDLER, myRight);
  enc.attach(LEFT_HANDLER, myLeft);
}
 
void loop() 
{
  enc.tick();
}

This leads to a "crash" of the firmware, the USB port disappear and nothing works.
Instead, using version 1 of the library:

#include <EncButton.h>
EncButton<EB_CALLBACK, 11, 9, 10> enc;

Works fine.
I'm using an Arduino Leonardo-based board.

Ke-040 и 74hc165

Добавьте пожалуйста пример, как подключать энкодеры и кнопки через сдвиговый регистр 74hc165. Я вроде догадываюсь, что это через VirtEncButton, но как?

Некорректная работа кнопки во время выполнения стороннего кода в loop()

Использовал пример callbackISR и tickISR. С пустым loop все работает нормально, но если в нем присутствует сторонний код (в данном случае delay) некоторые нажатия кнопки не регистрируются. Не могу разобраться, в чем смысл использования прерываний, если они все равно не помогают обновлять кнопку во время выполнения кода? Использую ESP32
`// Пример с обработчиками в прерывании

#include <EncButton.h>
EncButton<EB_CALLBACK, 12> enc; // энкодер с кнопкой <A, B, KEY>

void setup() {
Serial.begin(9600);
enc.attach(CLICK_HANDLER, myClick); // подключим поворот

// прерывание обеих фаз энкодера на функцию isr
attachInterrupt(12, isr, CHANGE);

}

void myClick() {
Serial.println("CLICK_HANDLER");
}

void isr() {
enc.tickISR(); // тикер в прерывании
// Не вызывает подключенные коллбэки внутри прерывания!!!
}

void loop() {
enc.tick(); // дополнительный опрос таймаутов и коллбэков в loop
// вызов подключенных функций будет здесь,
// чтобы не грузить прерывание
delay(5000);
}
`

isActive

хотелось бы иметь метод isActive который возвращал bool.

isActive() возвращает true если с энкодером/кнопкой происходит какое либо действие, в противном случае - false. Такой метод помог бы вынести всю логику связанную с обработкой действий с энкодером/кнопкой в отдельную функцию

void loop() {
    enc.tick();
    if (enc.isActive()) {
         doSomething();
    }
    .....
}

void doSomething() {
    // Здесь вся логика связанная с обработкой действий с кнопкой
    .....
}

Добавить поддержку энкодера

можно ли добавить поддержку такого энкодера с такой логикой
даташитэн

Пример кода с использованием другой библиотеки

//просто пример
#include <Encoder.h> // https://github.com/P­aulStoffregen/Encode­r/releases/tag/1.4.3

//пины энкодера
#define PIN_A D5
#define PIN_B D6

//объект энкодера
Encoder encoder(PIN_A, PIN_B);

//предыдущее значение энкодера
long oldPosition = -999;

void setup() {
//инициализация COM порта
Serial.begin(115200);
}

void loop() {
//считываем значе­ние от энкодера
long newPosition = encoder.read();

//если новое знач­ение не равно предыд­ущему,
//то выводим его на COM порт
if (newPosition != oldPo­sition) {
oldPosition = newPosition;
Serial.print("Encoder value: ");
Serial.println(newPosition);
}
delay(100); //задержка для стаб­илизации
}

Функция isStep()

Здравствуйте. Добавьте пожалуйста функцию boolean isStep(byte clicks) как в GyverButton. Удержание после несколько кликов.

Проект на wokwi с кнопками EncButton

Использую библиотеку кнопок, для некоторых проектов, которые есть в "железе".
Над проектом работают несколько человек, и у некоторых нет доступа к настоящим микроконтроллерам, дисплеями и кнопкам.
Как писать код спрашивается?
На помощь приходит онлайн-симулятор wokwi.
Но к сожалению, библиотека EncButton там не является "по умолчанию".
Вернее "их" EncButton это вообще другая библиотека.
Решение - написать класс отдельным файлом, как это было предложено здесь.
Я попробовал реализовать такой же файл, но у меня две кнопки, и я их инициализирую так

  pinMode(34, INPUT_PULLUP);
  pinMode(35, INPUT_PULLUP); 
void loop()
{
  btn_left.tick(!digitalRead(34));
  btn_right.tick(!digitalRead(35));
}

Ввиду того, что ограничения wokwi видимо срабатывают, когда слишком много файлов добавляешь - не дает сохранить.
Но удалось скачать архив, из 16-ти файлов.
Flightinstruments_TFT_eSPI.zip
Можно их вручную создать и тогда проект скомпилируется.
Скриншот 27-08-2023 21 03 46
Вы сможете вручную установить проект на wokwi и подсказать, что не так с кнопками?
Буду вам безмерно благодарен!
P.S. bool read(); не реализована в файле btn.h и поэтому не смог сделать опрос кнопок в секции setup(){}

Много warning при компиляции

Подскажите - это нормально - такое количество ворнингов при компиляции?
1.8.16 софт, компилятор (5.4 или 7.3)

image

Файл FastIO.h не защищен от повторного включения?

Здравствуйте!
Пытаюсь включить библиотеку и получаю такую ошибку:

Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/uno.html
PLATFORM: Atmel AVR (3.1.0) > Arduino Uno
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 31.50KB Flash
DEBUG: Current (avr-stub) On-board (avr-stub, simavr)
PACKAGES:
 - framework-arduino-avr 5.1.0
 - toolchain-atmelavr 1.50400.190710 (5.4.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 9 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <EncButton> 1.6.1
|-- <TVout> 1.0.1
Building in release mode
Compiling .pio\build\uno\src\Gamepad.cpp.o
Compiling .pio\build\uno\src\main.cpp.o
Linking .pio\build\uno\firmware.elf
.pio\build\uno\src\main.cpp.o: In function `fastRead(unsigned char)':
main.cpp:(.text._Z8fastReadh+0x0): multiple definition of `fastRead(unsigned char)'
.pio\build\uno\src\Gamepad.cpp.o:Gamepad.cpp:(.text._Z8fastReadh+0x0): first defined here
.pio\build\uno\src\main.cpp.o: In function `fastWrite(unsigned char, bool)':
main.cpp:(.text._Z9fastWritehb+0x0): multiple definition of `fastWrite(unsigned char, bool)'
.pio\build\uno\src\Gamepad.cpp.o:Gamepad.cpp:(.text._Z9fastWritehb+0x0): first defined here
.pio\build\uno\src\main.cpp.o: In function `fastShiftIn(unsigned char, unsigned char, unsigned char)':
main.cpp:(.text._Z11fastShiftInhhh+0x0): multiple definition of `fastShiftIn(unsigned char, unsigned char, unsigned char)'
.pio\build\uno\src\Gamepad.cpp.o:Gamepad.cpp:(.text._Z11fastShiftInhhh+0x0): first defined here
.pio\build\uno\src\main.cpp.o: In function `fastShiftOut(unsigned char, unsigned char, unsigned char, unsigned char)':
main.cpp:(.text._Z12fastShiftOuthhhh+0x0): multiple definition of `fastShiftOut(unsigned char, unsigned char, unsigned char, unsigned char)'
.pio\build\uno\src\Gamepad.cpp.o:Gamepad.cpp:(.text._Z12fastShiftOuthhhh+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\uno\firmware.elf] Error 1

Возникает она на таких трех файлах:

main.cpp

#include <Arduino.h>
#include "Gamepad.h"

Gamepad testObject;
void setup() {
    int a = 10;
    a = testObject.multTo5(a);
    testObject.multTo7(&a);
}

void loop() {}

Gamepad.cpp

#include "Gamepad.h"

int Gamepad::multTo5(int value) {
    return value * 5;
}

void Gamepad::multTo7(int* value) {
    *value = *value * 7;
}

Gamepad.h

#pragma once
#include <Arduino.h>
#include <EncButton.h>

class Gamepad {
    public:
        int multTo5(int value);
        void multTo7(int* value);
    private:
        EncButton<EB_TICK, 2> fireButton;
        EncButton<EB_TICK, 3> bombButton;
};

Подключение кнопки

Подключил кнопку следующим образом:
image
при нажатии на кнопку происходит просадка напряжения питания, как это можно пофиксить?

Не работают прерывания, как следует на stm32

Добавил работу с кликами в шаблон примера и задержку в 2 секунды и все...код поплыл, тики считают только вращение энкодера.
Как быть с обработкой кнопки клика по энкодеру - ума не приложу.

// Пример с обработчиками в прерывании

#include <EncButton.h>
EncButton<EB_CALLBACK, PB4, PB3, PB10> enc;   // энкодер с кнопкой <A, B, KEY>

void setup() {
  Serial.begin(115200);
  enc.attach(TURN_HANDLER, myTurn);   // подключим поворот
  enc.attach(CLICK_HANDLER, myClick);   // подключим клик

  // прерывание обеих фаз энкодера на функцию isr
  attachInterrupt(PB4, isr, CHANGE);
  attachInterrupt(PB3, isr, CHANGE);
  attachInterrupt(PB10, isr, CHANGE);
}

void myTurn() {
  Serial.print("TURN_HANDLER: ");
  Serial.println(enc.counter);
  Serial.print("DIR_HANDLER: ");
  Serial.println(enc.dir()); // направление поворота
}

void myClick() {
  Serial.print("CLICK_HANDLER: ");  
  Serial.println(enc.click());
}

void isr() {
  enc.tickISR();  // тикер в прерывании
  // Не вызывает подключенные коллбэки внутри прерывания!!!
}

void loop() {
  enc.tick();   // дополнительный опрос таймаутов и коллбэков в loop
  // вызов подключенных функций будет здесь,
  // чтобы не грузить прерывание
  delay(2000);
}

А вообще библиотека EncButton позволяет опрашивать энкодер из структуры?
void setup() {}
Например, хочу, чтобы в секции Setup было меню с дисклеймером, и нужно согласиться с ним или не сможешь устройством пользоваться.
Ни в одном из примеров не нашел, чтобы тикер был в секции Setup.
Сам пробовал опрашивать энкодер в этой секции и ничего не работало.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.