Как остановить мерцание OLED при использовании SSD1306Ascii.h?

Почему OLED-дисплей мерцает при использовании библиотеки SSD1306Ascii.h? В библиотеке Adafruit такой проблемы нет, но мне сказали, что она использует много памяти, поэтому я пытаюсь использовать Ascii для экономии ресурсов памяти. Проблема проявляется, когда начинается void loop(). При использовании аналогичного кода с библиотекой Adafruit дисплей остается стабильным, как скала.

Вот мой пример кода. заранее большое спасибо.

// Отредактируйте AVRI2C_FASTMODE в SSD1306Ascii.h, чтобы изменить частоту I2C по умолчанию.

#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

#define I2C_ADDRESS 0x3C

// Определяем правильный RST_PIN, если требуется.
#define RST_PIN -1


SSD1306AsciiAvrI2c oled;
//------------------------------------------------ ------------------------------
void setup() {

#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
  // Вызываем oled.setI2cClock(частота) для изменения частоты по умолчанию.

  oled.setFont(System5x7);
  oled.clear();
  oled.print("Hello World!");
  delay(2000);
  oled.clear();


}
//------------------------------------------------ ------------------------------
void loop() {

  oled.setFont(System5x7);
  oled.print("Hello fuuuzzzzyyyy world!");
  delay(1);
  oled.clear();

}

, 👍0

Обсуждение

откуда вы знаете, что проблема вызвана библиотекой?, @jsotola

какую отладку вы сделали?, @jsotola

Я поиграл с настройками частоты, которые ускоряют или замедляют мерцание, но, как я уже сказал, более распространенная библиотека Adafruit не производит такого эффекта при прохождении цикла. Я довольно новичок в этом, поэтому любое руководство очень ценится., @paul1066

Кроме того, я думаю, что могут быть способы обойти это, используя другие методы в библиотеке, чтобы манипулировать только областями, где значение изменяется, но это станет беспорядочным..., @paul1066

не запускайте очистку(). создайте массив, который умещается на экране, заполните массив данными по мере необходимости (не забывайте писать пробелы для пробелов) и каждый раз записывайте весь массив на экран., @dandavis

Да, я думал об этом, спасибо за помощь, я попробую., @paul1066


2 ответа


1

Ваш цикл повторяет запись и очистку дисплея почти с максимально возможной скоростью (минус задержка в 1 мс внизу), что и является причиной мерцания, которое вы видите. Если вместо этого вы обновляете отображение только тогда, когда что-то меняется, оно будет выглядеть намного более плавным. Даже очистка и перезапись всего дисплея, когда что-то меняется (при условии, что изменения происходят нечасто), будет значительным улучшением. Конечно, это предполагает, что вы в конечном итоге будете записывать динамические данные; ваша тестовая программа, разумеется, записывает и перезаписывает статические данные.

Обновление:

Если я запускаю ту же структуру кода с библиотекой Adafruit, мерцают даже без задержки в цикле.

Можете ли вы сравнить две библиотеки, чтобы увидеть, что они делают по-разному?

В библиотеке Adafruit такой проблемы нет, но мне сказали, что она использует много памяти

Есть подсказка: возможно, Adafruit буферизует отображаемое содержимое в памяти, чтобы определить, какие позиции символов изменились, и обновить только их. Это был бы классический компромисс между временем и пространством.

,

Я показываю значения с гироскопа, поэтому их нужно постоянно обновлять. Если вы установите задержку на 1 секунду, все равно будет заметное мерцание при обновлении дисплея. Если я запускаю ту же структуру кода с библиотекой Adafruit, мерцания не будет, даже без задержки в цикле., @paul1066


0

Да, это связано с переписыванием всего дисплея. Обычно я переписываю только те части, которые были изменены, или, в худшем случае, использую команду ClearToEOL, чтобы убедиться, что все стерто.

,

Вы можете переписать только те части дисплея, которые меняются, что является значением гироскопа., @Sim Son