Почему логотип Adafruit splashscreen отображается неправильно?

adafruit oled

Я работаю с Oled - дисплеем 128x64. Я только что установил библиотеку Adafruit и запустил несколько примеров кодов. Я еще не изменил пример кода, просто проверяя, работает ли OLED-дисплей, но я заметил, что логотип splashscreen показывает только верхнюю половину изображения.

Как я могу это исправить?

Splashscreen

, 👍2

Обсуждение

Какой пример кода вы используете? Похоже, что пример кода предполагает другую высоту дисплея, @chrisl

Я использую ssd1306_128x64_i2c, @Emma

Можете ли вы предоставить ссылку на него?, @chrisl

https://codebender.cc/example/Adafruit_SSD1306/ssd1306_128x64_i2c#ssd1306_128x64_i2c.ino, @Emma

Я добавил #define SSD1306_LCDHEIGHT 64 перед строкой #53, чтобы удалить ошибку компиляции, @Emma

Похоже, вы отображаете только 50% строк с пробелом между ними..., @Majenko


1 ответ


Лучший ответ:

3

Сейчас я не могу это проверить, но вот что:
Оказывается, у меня была возможность протестировать его (нашел дополнительный модуль дисплея), и это действительно объясняет проблему. Единственное другое изменение, которое мне нужно было внести в ваш код, чтобы воспроизвести проблему, - это изменить адрес I2C дисплея на 0x3C. Библиотека Adafruit GFX v1.10.13 и версия Adafruit SSD1306 v2.5.1.


Из комментариев к вопросу:

Я добавил #define SSD1306_LCDHEIGHT 64 перед строкой #53, чтобы удалить ошибку компиляции

Да, ты не можешь этого сделать. При старом методе определения размеров экрана предполагается изменить сам заголовок:

// ОДНА из следующих трех строк должна быть #defined:
//#define SSD1306_128_64 ///< УСТАРЕВШИЙ: старый способ указать экран 128x64
#define SSD1306_128_32 ///< УСТАРЕВШИЙ: старый способ указать экран 128x32
//#define SSD1306_96_16 ///< УСТАРЕВШИЙ: старый способ указать экран 96x16
// Это устанавливает размеры экрана в старых скетчах Adafruit_SSD1306
// (НОВЫЙ КОД ДОЛЖЕН ИГНОРИРОВАТЬ ЭТО, ИСПОЛЬЗОВАТЬ КОНСТРУКТОРЫ, КОТОРЫЕ ПРИНИМАЮТ ШИРИНУ
// И АРГУМЕНТЫ ВЫСОТЫ).

Вы можете видеть, что по умолчанию он использует экран с размерами 128x32. Позже в заголовке это используется для установки SSD1306_LCDHEIGHT на 32 в заголовке.

#if defined SSD1306_128_32
#define SSD1306_LCDWIDTH 128 ///< УСТАРЕЛО: ширина w/SSD1306_128_32 определена
#define SSD1306_LCDHEIGHT 32 ///< УСТАРЕЛО: высота w/SSD1306_128_32 определена
#endif

То, что вы сделали в своем коде, - это переопределить SSD1306_LCDHEIGHT до 64 с того момента, когда вы выпустили #define вниз, что влияет только на код, скомпилированный в вашем скетче.

Тем временем в Adafruit_SSD1306.cpp, SSD1306_LCDHEIGHT по-прежнему равен 32, потому что этот файл компилируется независимо от вашего .ino и не знает о вашем собственном re#define. Другими словами, часть кода, который вы вставили в свой Arduino, считает, что он имеет 32 строки, а часть-64 строки.


Таким образом, решение состояло бы в том, чтобы избавиться от #define, который вы вставили в скетч, и изменить заголовок следующим образом:

#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16  ///< DEPRECATED: old way to specify 96x16 screen

Или использовать новый метод предоставления измерений через конструктор, как это делается в более новых примерах:

#define SCREEN_WIDTH 128 // Ширина OLED-дисплея, в пикселях
#define SCREEN_HEIGHT 64 // ысота OLED-дисплея, в пикселях
/// ...
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Пример Adafruit SSD1306 версии v2.5.1 ssd1306_128x64_i2c. ino,который использует этот новый метод передачи размеров экрана в конструктор Adafruit_SSD1306 и скомпилирован и запущен без изменений в тестировании здесь.

,

Я отредактировал заголовочный файл, и он исправляет проблему, спасибо. Однако один вопрос: нужно ли мне использовать 0x3D в качестве адреса для oled? Я использовал 0x3C, потому что он не включается, когда я использую 0x3D. Я просто хочу знать, почему это произошло, @Emma

Короче говоря, если он работает, вы выбрали правильный адрес. Микросхема контроллера SSD1306 имеет множество различных контактов и режимов передачи. В режиме I2C один из этих выводов может быть использован для настройки чипа на реакцию либо на 0x3C, либо на 0x3D, так что два из этих дисплеев могут сосуществовать на одной и той же шине I2C без каких-либо других изменений. Для вашего дисплея выбор интерфейса I2C и адреса 0x3C был сделан за вас конструкцией печатной платы. Я считаю, что жесткая конфигурация 0x3C/0x3D имеет тенденцию следовать типу отображения x32/x64, но это ничего не гарантирует., @timemage