Некорректные данные с энкодера при подключении oled

Starter

✩✩✩✩✩✩✩
27 Янв 2022
1
0
При использовании команды oled.update() перестает корректно работать энкодер - срабатывает примерно 1 из 10 и не всегда. При отключении команды oled.update() энкодер работает отлично.
Библиотеки GyverOLED и EncButton. Энкодер REC20D-25-201-1. В чем может быть проблема? Может ли быть несовместимость библиотек?
C++:
#include <GyverOLED.h>
#include <Wire.h>
#include <SPI.h>
GyverOLED<SSD1306_128x64> oled;

#include <EncButton2.h>
EncButton2<EB_ENC> enc(INPUT, 7, 8);

void setup() {
  oled.init();
  oled.setContrast(255);
  Serial.begin(9600);
}

void loop() {
  enc.tick();
  if (enc.turn()) {
    if (enc.left()) Serial.println("left");     
    if (enc.right()) Serial.println("right");
  }
  oled.clear();
  oled.home();
  oled.update();
}
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
А что ж вы хотели .. что бы энкодер работал корректно его тик должен отрабатываться довольно часто. Чем чаще тем лучше. от 10 000 раз в секунду. Или по прерыванию.
А обновление экрана дает скорость не более 20 кадров в секунду. Обычно 10-16. Т.е. примерно в 500 раз медленнее.
 
  • Лойс +1
Реакции: Starter

bort707

★★★★★★✩
21 Сен 2020
3,066
914

@Starter,
с какой целью вы обновляете экран при каждом проходе loop() ? Так у вас не только энкодер, а и вся остальная программка начнет тормозить и подвисать. Экран следует обновлять только в том случае, когда вы на него вывели что-то новое.
 
  • Лойс +1
Реакции: kostyamat

Is7

✩✩✩✩✩✩✩
30 Май 2022
2
0
@Starter, Вам удалось решить эту проблему? Если да , то отпишитесь пожалуйста или напишите мне на почту [email protected]. Буду Вам очень благодарен.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
@Is7, вы ответы-то читали? нет никакой проблемы, опрашивайте энкодер почаще и все заработает.
 

Is7

✩✩✩✩✩✩✩
30 Май 2022
2
0
@bort707,боюсь показаться смешным , но я новичок в этом деле и буду Вам очень благодарен, если подскажите как почаще опрашивать энкодер в этой библиотеке(GyverEncoder).Заранее благодарю.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
В loop() не должно быть операций длиельностью более чем 10-20миллисек. Если надо сделать что-то долгое - нужно разбивать работу на части и опрашивать энкодер между ними
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Или опрашивать энкодер по прерываниям (см пример encoder_interrupt)
или запустить таймер и опрашивать энкодер по прерыванию тиймера
 
  • Лойс +1
Реакции: Neerones