Как остановить мерцание 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();
}
@paul1066, 👍0
Обсуждение2 ответа
Ваш цикл повторяет запись и очистку дисплея почти с максимально возможной скоростью (минус задержка в 1 мс внизу), что и является причиной мерцания, которое вы видите. Если вместо этого вы обновляете отображение только тогда, когда что-то меняется, оно будет выглядеть намного более плавным. Даже очистка и перезапись всего дисплея, когда что-то меняется (при условии, что изменения происходят нечасто), будет значительным улучшением. Конечно, это предполагает, что вы в конечном итоге будете записывать динамические данные; ваша тестовая программа, разумеется, записывает и перезаписывает статические данные.
Обновление:
Если я запускаю ту же структуру кода с библиотекой Adafruit, мерцают даже без задержки в цикле.
Можете ли вы сравнить две библиотеки, чтобы увидеть, что они делают по-разному?
В библиотеке Adafruit такой проблемы нет, но мне сказали, что она использует много памяти
Есть подсказка: возможно, Adafruit буферизует отображаемое содержимое в памяти, чтобы определить, какие позиции символов изменились, и обновить только их. Это был бы классический компромисс между временем и пространством.
Я показываю значения с гироскопа, поэтому их нужно постоянно обновлять. Если вы установите задержку на 1 секунду, все равно будет заметное мерцание при обновлении дисплея. Если я запускаю ту же структуру кода с библиотекой Adafruit, мерцания не будет, даже без задержки в цикле., @paul1066
Да, это связано с переписыванием всего дисплея. Обычно я переписываю только те части, которые были изменены, или, в худшем случае, использую команду ClearToEOL, чтобы убедиться, что все стерто.
Вы можете переписать только те части дисплея, которые меняются, что является значением гироскопа., @Sim Son
- Adafruit OLED 7 Pin Display - Аббревиатуры
- Можно ли изменить адрес этого дисплея?
- Дисплей SSD1306 i2c OLED — не может правильно отображать изображения
- Возникли проблемы с пониманием того, что делает "#define GET_STATUS"
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отобразить символ º на ЖК-дисплее?
- Путаница между SPI и I2C для SSD1306 OLED
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
откуда вы знаете, что проблема вызвана библиотекой?, @jsotola
какую отладку вы сделали?, @jsotola
Я поиграл с настройками частоты, которые ускоряют или замедляют мерцание, но, как я уже сказал, более распространенная библиотека Adafruit не производит такого эффекта при прохождении цикла. Я довольно новичок в этом, поэтому любое руководство очень ценится., @paul1066
Кроме того, я думаю, что могут быть способы обойти это, используя другие методы в библиотеке, чтобы манипулировать только областями, где значение изменяется, но это станет беспорядочным..., @paul1066
не запускайте очистку(). создайте массив, который умещается на экране, заполните массив данными по мере необходимости (не забывайте писать пробелы для пробелов) и каждый раз записывайте весь массив на экран., @dandavis
Да, я думал об этом, спасибо за помощь, я попробую., @paul1066