EncButton

Статус
В этой теме нельзя размещать новые ответы.

Ник_87

✩✩✩✩✩✩✩
9 Фев 2025
8
0
Заголовок темы должен отражать содержимое. Переформулируй или тема будет удалена.
Добрый день.

Имеется OLED дисплей SSD1306_128x64 и энкодер с кнопкой.
Используемые библиотеки EncButton и GyverOLED.

Задача.

При нажатии кнопки энкодера инвертируется цвет на дисплее и с помощью крутилки энкодера можно менять численные значения с выводом на дисплей.
При длительном нажатии цвет на дисплее опять инвертируется с показании введенного значения.
Без нажатии на кнопку энкодера значения изменить нельзя.

Составил скетч, при нажатии кнопки энкодера дисплей цвет меняет, изменить значения крутилкой не получается . Как решить проблему?

Спасибо.
 

Вложения

viktor1703

★★★✩✩✩✩
9 Дек 2021
652
153
А если не изобретать велосипед, а сделать как в примерах?
C++:
// меняем значения переменных

// поворот энкодера
if (enc.turn()) {
  // меняем с шагом 5
  var += 5 * enc.dir();

  // меняем с шагом 1 при обычном повороте, 10 при нажатом
  var += enc.pressing() ? 10 : 1;
}
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
652
153
Как не работает? Выбросите все свои switch'и case'ы и сделайте через if'ы.
C++:
if (hold)
  {инвертировать_дисплей}
if (turn)
  { if (turn and pressing)
      {
       изменить_значение переменной_в_зависимости_от_направления_вращения_энкодера;
       вывести_значение_переменной_на_дисплей;
      }
Так работает?
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
511
151
@Ник_87,
В библиотеке есть события и состояния. События - однократные, состояния - длительные.
Предположение - вы проверяете событие, оно происходит один раз при возникновении, и при вращении его уже нет (устарело). Вам надо проверять состояние eb.holding() оно будет истинно пока удерживается кнопка.
 

Ник_87

✩✩✩✩✩✩✩
9 Фев 2025
8
0
Оформи код соответствующим тэгом, см. Правила
@viktor1703,
#include <Arduino.h>
#include <EncButton.h>
EncButton eb(8, 11, 12);
uint8_t s = 1;
#include <GyverOLED.h>
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
void setup() {
oled.init(); // инициализация
oled.clear(); // очистка
oled.setScale(4); // масштаб текста (1..4)
oled.setCursor(57, 2); // курсор в (пиксель X, строка Y)
oled.print(s);
eb.setBtnLevel(LOW);
eb.setClickTimeout(500);
eb.setDebTimeout(50);
eb.setHoldTimeout(600);
eb.setStepTimeout(200);
eb.setTimeout(1000);
eb.setEncReverse(0);
eb.setEncType(EB_STEP4_LOW);
eb.setFastTimeout(30);
eb.counter = 0;
}
void loop() {
eb.tick();

if (eb.hold())
{oled.invertDisplay(true);}
if ((eb.turn()) && (eb.hold()))
{
if (eb.left()) s--;
if (eb.right()) s++;
oled.setScale(4); // масштаб текста (1..4)
oled.setCursor(57, 2); // курсор в (пиксель X, строка Y)
oled.clear();
oled.print(uint8_t(s));
}
if (eb.press())
oled.invertDisplay(false);

}
Не работает

@Bruzzer,

eb.tick();
if (eb.holding()) {
oled.invertDisplay(true);
//if (eb.turn())
if (eb.left()) s--;
if (eb.right()) s++;
oled.setScale(4); // масштаб текста (1..4)
oled.setCursor(57, 2); // курсор в (пиксель X, строка Y)
oled.clear();
oled.print(uint8_t(s));
}
if (eb.press())
oled.invertDisplay(false);
}
не работает
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
652
153
Изменено:

viktor1703

★★★✩✩✩✩
9 Дек 2021
652
153
ну измените "enc" на то, как вы обозвали энкодер"eb". Копировал из примера и не переименовал.
 

Ник_87

✩✩✩✩✩✩✩
9 Фев 2025
8
0
Дисплей инвертируется, но изменить значения крутилкой не получается.
Я пытаюсь решить проблему достаточно долго, перепробовал много вариантов, но решение не нашёл. Не могу понять в чем проблема.
 

poty

★★★★★★✩
19 Фев 2020
3,279
952

@Ник_87, потому что формулировка неверная. Слово "нажать" обозначает действие "нажать на ручку энкодера и не отпускать". То есть Вы должны продолжать удерживать ручку нажатой, чтобы выполнялось условие. Но судя по второй фразе ("долгое нажатие") имеется в виду все же "клик". Тогда, при обнаружении клика нужно изменить флаг, проверять его для подсчёта, отменить изменение при длительном клике.
 

Ник_87

✩✩✩✩✩✩✩
9 Фев 2025
8
0
@poty,
Если по событию "нажать и держать" , все норм.
Флаги ставил, не работает.
А мне нужно нажал, дисплей инвертировался, поменял крутилкой значение, нажал и готово.
 

poty

★★★★★★✩
19 Фев 2020
3,279
952

@Ник_87, так покажите, что там с флагами, тогда и разговор будет. А так - ни о чём!
P.S. Судя по тому, что Вы продолжаете использовать неправильную лексику, программирование нужно немного отложить.
 

poty

★★★★★★✩
19 Фев 2020
3,279
952
@Ник_87, а зачем мне выполнять работу за Вас? Вы даже после подсказки ничего не сделали, и после моего "рабочего варианта" ничего делать не будете, просто выдадите его за свой.
 

Ник_87

✩✩✩✩✩✩✩
9 Фев 2025
8
0
Понятно, все это эфимерно.....
Буду пробовать с другой библиотекой
 
Статус
В этой теме нельзя размещать новые ответы.