Почему логотип Adafruit splashscreen отображается неправильно?
Я работаю с Oled - дисплеем 128x64. Я только что установил библиотеку Adafruit и запустил несколько примеров кодов. Я еще не изменил пример кода, просто проверяя, работает ли OLED-дисплей, но я заметил, что логотип splashscreen показывает только верхнюю половину изображения.
Как я могу это исправить?
@Emma, 👍2
Обсуждение1 ответ
Лучший ответ:
Сейчас я не могу это проверить, но вот что:
Оказывается, у меня была возможность протестировать его (нашел дополнительный модуль дисплея), и это действительно объясняет проблему. Единственное другое изменение, которое мне нужно было внести в ваш код, чтобы воспроизвести проблему, - это изменить адрес 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
- Adafruit OLED 7 Pin Display - Аббревиатуры
- Ошибка компиляции для платы Arduino Nano при использовании Adafruit GFX
- Дисплей SSD1306 i2c OLED — не может правильно отображать изображения
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Почему Adafruit motor shield не крутит моторы?
- Какие компоненты мне нужны маленького GPS-трекера
- Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
Какой пример кода вы используете? Похоже, что пример кода предполагает другую высоту дисплея, @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