Вопросы по библиотеке EncButton

Scopex

✩✩✩✩✩✩✩
3 Фев 2021
31
2
@poty,
что именно выводить? enc.counter ?
да, в непрерывном цикле без доп обработки при одиночном валит в монитор 1, а при двойном 2

надо смотреть примеры
спасибо, смотрел этот пример но "не воткнул"
буду разбираться но видимо да, всё проще...
 

Slenk

★★★★★★✩
21 Янв 2020
382
589
34
Краснодар
@Scopex, я вот так делал:

C++:
// =============== КНОПКА A ===============
  if (BTN_A.press()) BTN_flag = 1;

  if (BTN_A.hasClicks(1)) {                     // Одинарный клик А
    if (digitalRead(PIN_B)) {                   // При зажатой В
      if (settings_mode == 2) {
        RemoteFunc(BUTT_SP);
      } else RemoteFunc(BUTT_MP);
    } else {
      RemoteFunc(BUTT_RIGHT);
      BTN_flag = 0;
    }
  }

  if (BTN_A.hasClicks(2)) {
    if (digitalRead(PIN_B)) {
      if (settings_mode == 2) {
        RemoteFunc(BUTT_SM);
      } else RemoteFunc(BUTT_MM);
    } else {
      RemoteFunc(BUTT_LEFT);
      BTN_flag = 0;
    }
  }

  if (BTN_A.hasClicks(3)) {
    switch (mode_arr[0]) {
      case 1: RemoteFunc(BUTT_1); break;  // Подсветка одним цветом
      case 2: RemoteFunc(BUTT_2); break;  // Эффекты
      case 3: RemoteFunc(BUTT_3); break;  // Стробоскоп
      case 4: RemoteFunc(BUTT_4); break;  // Цветомузыка 1 полоса
      case 5: RemoteFunc(BUTT_5); break;  // Бегущие частоты
      case 6: RemoteFunc(BUTT_6); break;  // Цветомузыка 3-5 полос
      case 7: RemoteFunc(BUTT_7); break;  // Анализатор спектра
      case 8: RemoteFunc(BUTT_8); break;  // Новые эффекты (тест)
      case 9: RemoteFunc(BUTT_9); break;  // Шкала громкости
    }
  }

  if (BTN_A.releaseStep()) if (BTN_flag) RemoteFunc(BUTT_0);     //
Тут отдельно отрабатывает одинарный/двойной/тройной/долгий, а так же одинарный/двойной при зажатой второй кнопке. Лишнее выкинь и будет тебе счастье)
 
Изменено:
  • Лойс +1
Реакции: Scopex

rolla

✩✩✩✩✩✩✩
5 Мар 2023
3
0
Доброе время суток
скетч компилируется. В части работы ШД двигателя в разных режимах работает правильно,
т.е. если в ручную изменяю переменную stepperSt (строка 44) то кейсы отрабатываются правильно)
НО криво работает обработка кнопок т.е. нажатие на кн.ЛЕВО и кн.ПРАВО запускает режимы движения в ЛЕВО и в ПРАВО, и при отпускании этих кнопок ШД останавливается... а вот на остальные действия с кнопками ШД не реагирует
что я делаю в части кода обработки кнопок неправильно (строки с 62 по 76)
C++:
[code]
/* шаговый двигатель NEMA23, драйвер к нему TB6600, три тактовых кнопки, два потенциометра, светодиод.
  режимы работы  шагового двигателя определяются кнопками
  КнЛЕВО - при нажатии и удержании - ШД вращается в ЛЕВО
  КнПРАВО -при нажатии и удержании - ШД вращается в ПРАВО
       <двойной клик>  по КнЛЕВО или КнПРАВО - запускается режим ТАРГЕТ (крутит туда-сюда относительно текущей позиции на определенный угол)
       <клик>  по КнЛЕВО или КнПРАВО - двигатель останавливается  (с обмоток снимается напряжение, вал двигателя можно свободно вращать рукой)
  КнТАРГЕТ - при <нажатии и удержании>  - двигатель останавливается  с обмоток снимается напряжение, вал двигателя можно свободно вращать вручную
         - при отпускании ранее нажатой кнопки КнТАРГЕТ> двигатель переходит в режим ТАРГЕТ - крутит туда-сюда относительно текущей позиции на определенный угол
  Потенциометр СКОРОСТЬ - регулирует скорость вращения двигателя от Vмин, до Vмакс.
  Потенциометр УГОЛ - изменяет угол поворота в режиме ТАРГЕТ от Uмин градусов до Uмакс градусов

*/
//---------------------------------------------------------------------------------
#define DRIVER_STEP_TIME 1  // задержка 1 мкс для драйвера ШД (TB6600)
#define PIN_POT_V     A5    // пин потенциометра для  Скорость
#define PIN_POT_U     A4    // пин потенциометра для Угол таргетирования
#define PIN_LED_0       A0    // пин  светодиода индикации
#define speedmin 50         // минимальная скорость в шаг/сек
#define speedmax 3200       // максимальная скорость в шаг/сек
#define tarmin 50           // минимальный угол в шагах
#define tarmax 800          //максимальный угол в шагах
// Опциональные дефайн-настройки для кнопок(показаны по умолчанию)
//#define EB_DEB 50      // дебаунс кнопки, мс
//#define EB_CLICK 400   // таймаут накликивания, мс
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
//#include <FIFO.h>
//#include <GStypes.h>
//#include <GyverPlanner.h>
//#include <GyverPlanner2.h>
//#include <GyverStepper.h>
#include <GyverStepper2.h>
//#include <StepperCore.h>
//#include <AnalogKey.h>
#include <EncButton.h>
//---------определяем кнопки------------------------------------------------------
EncButton<EB_TICK, 5> btnLEFT;        //  кн.ЛЕВО
EncButton<EB_TICK, 6> btnRIGHT;        // кн.ПРАВО
EncButton<EB_TICK, 7> btnTARGET;        // кн.ТАРГЕТ
//--------------------------------------------------------------------------------
GStepper2<STEPPER2WIRE> stepper(800, 8, 9, 10);    // параметры ШД 800 шагов/оборот, step, dir, en  на пины 8,9,10 соответственно
//---------------флажок для состояния ШД------------------------------------------
int stepperSt = 1; // 1 - не вращается, 2 - вращается влево, 3 - вращается вправо, 4- временно не вращается , 5 - таргет
//----------- для мигания светодиода ---------------------------------
int ledState = LOW;             // состояние светодиода
long previousMillis = 0;        // время последнего переключения светодиода
long interval = 150;           // интервал между включение (милисекунды)
//---------------------------------------------------------------------
void setup() {
  //------- настройки кнопок------------------------------------------------------
  btnLEFT.setButtonLevel(HIGH);     // уровень кнопки: HIGH - кнопка подключает VCC
  btnRIGHT.setButtonLevel(HIGH);     // уровень кнопки:HIGH - кнопка подключает VCC
  btnTARGET.setButtonLevel(HIGH);     // уровень кнопки:  HIGH - кнопка подключает VCC
  //----------потенциометры скорости V, угла таргетирования U---------------------
  pinMode(PIN_POT_V, INPUT);       // пин потенциометра скорости как ВЫХОД (подключение левый пин VCC, средний пин - А5, правый пин GND)
  pinMode(PIN_POT_U, INPUT);       // пин потенциометра угла как ВЫХОД (подключение левый пин VCC, средний пин - А4, правый пин GND)
  //---------------------------------------------------------- -------------------
  pinMode(PIN_LED_0, OUTPUT);
}
void loop() {
  //========================ОПРАШИВАЕМ КНОПКИ=====================================
  btnLEFT.tick();   //кнопка  ЛЕВО ----------------------------------------------------
    if (btnLEFT.hasClicks(1)) stepperSt = 1;    // один клик, ШД не вращается
    if (btnLEFT.hasClicks(2)) stepperSt = 5;    // два клика, ШД в ТАРГЕТ
    if (btnLEFT.held()) stepperSt = 2;     // удерживается , ШД вращается в ЛЕВО
    if (btnLEFT.release()) stepperSt = 1;     // отпущена, ШД не вращается
  btnRIGHT.tick();    //кнопка  ПРАВО ----------------------------------------------------
    if (btnRIGHT.hasClicks(1)) stepperSt = 1;    // один клик, ШД не вращается
    if (btnRIGHT.hasClicks(2)) stepperSt = 5;    // два клика, ШД в ТАРГЕТ
    if (btnRIGHT.held()) stepperSt = 3;     // удерживается , ШД вращается в ПРАВО
    if (btnRIGHT.release()) stepperSt = 1;     // отпущена, ШД не вращается
  btnTARGET.tick(); //кнопка  ТАРГЕТ ----------------------------------------------------
    if (btnTARGET.held(0)) stepperSt = 4;     // пока удерживается  ШД временно не вращается
    if (btnTARGET.release()) stepperSt = 5;     // отпущена, ШД в ТАРГЕТ
  // =========== ПОЕХАЛИ ==========================================================
  switch (stepperSt) {      // 1 =============== ШД выключен ======================
    case 1: {
        stepper.brake();    // тормозим
        stepper.reset();    // сбрасываем позицию в 0
        stepper.disable();  //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками
        digitalWrite(PIN_LED_0, HIGH);
      }
      break;
    case 2:  {               // 2 ============= едем в ЛЕВО =========================
        stepper.enable();                   //ШД включить
        stepper.setSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax));
        stepper.tick();
        digitalWrite(PIN_LED_0, HIGH);
      }
      break;
    case 3:  {               // 3 ============= едем в ПРАВО ========================
        stepper.enable();                   //ШД включить
        stepper.setSpeed(-(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)));
        stepper.tick();
        digitalWrite(PIN_LED_0, HIGH);
      }
      break;
    case 4:  {               //4 ============== ШД временно выключен =================
        stepper.brake();    // тормозим
        stepper.reset();    // сбрасываем позицию в 0
        stepper.disable();  //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками

        { // ---------------------- мигаем светодиодом-----------------------------
          unsigned long currentMillis = millis();
          if (currentMillis - previousMillis > interval) {
            previousMillis = currentMillis;
            if (ledState == LOW)
              ledState = HIGH;
            else
              ledState = LOW;
            digitalWrite(PIN_LED_0, ledState);
          }
        }  //---------------------------------------------------------------------
      }
      break;
    case 5:  {                // 5============= ШД  в ТАРГЕТ ===========================
        stepper.setMaxSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)); // установка скорости  в шагах/сек
        stepper.setAcceleration(500);        // установка ускорения в шагах/сек2
        if (!stepper.tick()) {
          static bool dir;
          dir = !dir;
          stepper.setTarget(dir ? -(map(analogRead(PIN_POT_U), 0, 1023, tarmin, tarmax)) : map(analogRead(PIN_POT_U), 0, 1023, tarmin, tarmax));
        }
      }
      break;
  }
}
[/CODE]
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Ну начнем с того, что при отпускании кнопки скорее всего ВСЕГДА возникает событие release, а это значит, что сколько бы там не жали , не мяли, не щупали кнопку, потом будет release и stepperSt =1, и шаговый двигатель не вращается,
 

Y1G4

✩✩✩✩✩✩✩
5 Июн 2023
1
0
Не могу понять, почему EncButton и AnalogKey великолепно работают вместе:
C++:
#include <EncButton.h>
EncButton<EB_TICK, VIRT_BTN> btn0;
EncButton<EB_TICK, VIRT_BTN> btn1;
EncButton<EB_TICK, VIRT_BTN> btn2;
EncButton<EB_TICK, VIRT_BTN> btn3;
EncButton<EB_TICK, VIRT_BTN> btn4;

#include <AnalogKey.h>
// создаём массив значений сигналов с кнопок
#define BTN_AMOUNT 5
int16_t sigs[BTN_AMOUNT] = {
  929, 836, 686, 608, 560
};

// указываем пин, количество кнопок и массив значений
AnalogKey<A4,BTN_AMOUNT, sigs> keys;


void setup() {
  Serial.begin(9600);
}

void loop() {
 
  btn0.tick(keys.status(0));
  btn1.tick(keys.status(1));
  btn2.tick(keys.status(2));
  btn3.tick(keys.status(3));
  btn4.tick(keys.status(4));


  if (btn0.press()) Serial.println("press 0");
  if (btn1.press()) Serial.println("press 1");
  if (btn2.press()) Serial.println("press 2");
  if (btn3.press()) Serial.println("press 3");
  if (btn4.press()) Serial.println("press 4");
}
а EncButton2 не хочет работать с AnalogKey:
C++:
#define BTN_AMOUNT 5

#include <EncButton2.h>
EncButton2<EB_TICK, VIRT_BTN> btn[BTN_AMOUNT];

#include <AnalogKey.h>
int16_t sigs[BTN_AMOUNT] = {
  929, 836, 686, 608, 560
};
AnalogKey<A4, BTN_AMOUNT, sigs> keys;

void setup() {
  Serial.begin(9600);
}

void loop() {

  for (int i = 0; i < BTN_AMOUNT ; i++) btn[i].tick(keys.status(i));

  for (int i = 0; i < BTN_AMOUNT ; i++) {
    if (btn[i].press()) {
      Serial.print("click btn: ");
      Serial.println(i);
    }
  }

}
В чем моя проблема?
 

Maxx1200

★✩✩✩✩✩✩
11 Фев 2022
94
18
энкодер оптический Grayhill
вопрос как использовать энкодер вот с такой логикой
Даташит
LOW - 0 вольт
HIGH 3.3 вольт

1 LOW LOW
2 HIGH LOW
3 HIGH HIGH
4 LOW HIGH

пробовал использовать с помощью библиотеки EncButton2 вот так срабатывает через раз
C++:
// пример с библиотекой EncButton2

// Опциональные дефайн-настройки (показаны по умолчанию)
#define EB_FAST 30     // таймаут быстрого поворота, мс
#define EB_DEB 50      // дебаунс кнопки, мс
#define EB_CLICK 400   // таймаут накликивания, мс

#include <EncButton2.h>
EncButton2<EB_ENCBTN> enc(INPUT_PULLUP, D5, D6, D7);  // энкодер с кнопкой
// для изменения направления энкодера поменяй A и B при инициализации

void setup() {
  Serial.begin(115200);
    // настройки
  //enc.setButtonLevel(HIGH);     // уровень кнопки: LOW - кнопка подключает GND (по умолч.), HIGH - кнопка подключает VCC
  enc.setEncType(1);  // тип энкодера: EB_FULLSTEP (0) по умолч., EB_HALFSTEP (1) если энкодер делает один поворот за два щелчка
}

void loop() {
  enc.tick();                       // опрос происходит здесь

  // =============== ЭНКОДЕР ===============
  // обычный поворот
  if (enc.turn()) {
    // можно опросить ещё:
    Serial.println(enc.counter);  // вывести счётчик
    //Serial.println(enc.fast());   // проверить быстрый поворот
    Serial.println(enc.dir()); // направление поворота
  }



  if (enc.left()) Serial.println("L");     // поворот налево
  if (enc.right()) Serial.println("R");   // поворот направо
  if (enc.leftH()) Serial.println("LH");   // нажатый поворот налево
  if (enc.rightH()) Serial.println("RH"); // нажатый поворот направо

  // =============== КНОПКА ===============
  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()) {
    Serial.print("has clicks ");
    Serial.println(enc.clicks);
  }
}
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
502
224
Может кто знает, как в этой библиотеке реализуется "клавиатура"
. пин один и несколько кнопок. в
GyverButton было так:

btnSet.tick(analog > 600 && analog < 800);
btnUp.tick(analog >= 0 && analog < 100);
btnDwn.tick(analog >= 300 && analog < 500);
теперь так не работает.
 

WebInMe

✩✩✩✩✩✩✩
16 Мар 2024
2
2
Помогите, пожалуйста, подружить EncButton и Digispark ATTiny85. Который день уже бьюсь... Энкодер купил круглый в обвязке. Попробовал demo-пример с Arduino Pro Micro - всё работает идеально. С ATTiny85 кнопка работает, а поворот энкодера нет! Если кто поделится рабочим примером, было бы замечательно!

C++:
#include <EncButton.h>

#define LED_PIN 1

#define ENC1_PIN 4
#define ENC2_PIN 3
#define BTN_PIN 2

bool loaded = false;

EncButton eb(ENC1_PIN, ENC2_PIN, BTN_PIN);

void blinkOnLoad() {
  if (!loaded) {
    for (int i = 0; i < 3; i++) {
      digitalWrite(LED_PIN, HIGH);
      delay(100);
      digitalWrite(LED_PIN, LOW);
      delay(100);
    }
    loaded = true;
  }
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  blinkOnLoad();

  eb.tick();

  if (eb.click()) digitalWrite(LED_PIN, HIGH);
  if (eb.click(2)) digitalWrite(LED_PIN, LOW);

  if (eb.turn()) {
    loaded = false;
    blinkOnLoad();

    // if (eb.left()) digitalWrite(LED_PIN, HIGH);
    // if (eb.right()) digitalWrite(LED_PIN, LOW);
  }
}
Одно нажатие включает встроенный светодиод, два отключают его. В качестве теста хочу то же получить для поворота энкодера: поворот влево - включает светодиод, вправо - отключает его. При включении платы и повороте энкодера немного мигаем светодиодом, чтобы видеть, что что-то произошло. Но по факту при повороте энкодера мигания не происходит.

Что делаю не так?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
586
141
Что делаю не так?
Наверно, вы не до конца изучили материал по этой плате и опрометчиво подключили энеодер к пинам, 3 и 4, которые подключены к usb. А ведь везде и всюду пишут об аккуратном использовании данных пинов, особенно третьего, так как он подтянут к питанию резистором 1,5 кОм.
 
  • Лойс +1
Реакции: WebInMe

WebInMe

✩✩✩✩✩✩✩
16 Мар 2024
2
2
@viktor1703, спасибо огромное! Думал, что 3 и 4 пин нельзя занимать только на время загрузки скетча! Поменял на 0 и 2 и всё заработало! Изучаю основы Электроники и программирования микроконтроллеров на практике, поэтому пока не без ошибок! Ещё раз спасибо!
 
  • Лойс +1
Реакции: technotrasher и viktor1703