Прозрачный OLED-дисплей 240*320 с ардуино
Давным-давно я заказал этот прозрачный OLED-дисплей (у китайского поставщика на Alibaba), планируя соединить его с Arduino, но у меня не было навыков, чтобы запустить проект.
У меня есть таблица данных (ссылка ниже) для драйвера, и, похоже, она поставляется со схемой, которая берет выходной сигнал от OLED и дает мне 8-битную проводку. Я планирую использовать с ним библиотеку adafruit GFX и, возможно, украсть код с это TFT adafruit.
Пожалуйста, скажите мне, если у этого нет надежды на работу, но мой план в его нынешнем виде таков:
1) нарисуйте схему таблицы данных в Kicad и распечатайте ее на печатной плате (я беспокоюсь, что если я буду макетировать / прототипировать ее, у меня возникнут всевозможные проблемы, связанные с моими плохими навыками перфбординга, и я хочу быть в состоянии чтобы сузить мои проблемы. Я знаю, что распечатывать печатную плату перед макетированием - плохая практика, но я не думаю, что с этим можно справиться)
2) подключите выходные контакты новой печатной платы так же, как и плата adafruit, и попробуйте использовать тот же код.
3) Вот где возникают проблемы, я думаю, поскольку я хорошо разбираюсь в простом коде (я, вероятно, не знаю, что «простой» код все еще намного выше моего уровня), например, функции/циклы и т. д... но написание кода, такого как пример adafruits для дисплеев, намного выше моего уровня. Я надеюсь, что я могу просто отредактировать некоторые из существующих примеров кода Adafruits, и он просто заработает.
Несколько лет назад я задал аналогичный вопрос на форуме Arduino, но тогда я был намного хуже в программировании и плохо представлял, с чего начать.
Если кто-то из вас может дать представление о том, сработает ли это, или какие-либо идеи получше, то я весь внимателен.
Спасибо
Документы, содержащие спецификации и примеры кода: https://drive.google.com/drive/folders/ 1ZTmipJKRKWNMudYVQ5ATxixbQtKD4hQm?usp=совместное использование
редактировать: есть также файл с именем example_code.txt, который содержит много (я не знаю, о чем я говорю на самом деле) шестнадцатеричных команд.
редактировать 2: - Пример фиктивного ILI9341
/*************************************************** ********
Это наш пример GFX для Adafruit ILI9341 Breakout and Shield.
----> http://www.adafruit.com/products/1651
Проверьте ссылки выше для наших руководств и электрических схем.
Эти дисплеи используют SPI для связи, для связи требуется 4 или 5 контактов.
интерфейс (RST опционально)
Adafruit вкладывает время и ресурсы, предоставляя этот открытый исходный код,
пожалуйста, поддержите Adafruit и оборудование с открытым исходным кодом, купив
продукты от Adafruit!
Написано Лимором Фридом/Ладьядой для Adafruit Industries.
Лицензия MIT, весь приведенный выше текст должен быть включен в любое распространение
******************************************************* **/
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
// Для щита Adafruit это значение по умолчанию.
#define TFT_DC 9
#define TFT_CS 10
// Использовать аппаратный SPI (на Uno, #13, #12, #11) и указанный выше для CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// При использовании прорыва поменяйте пины по желанию
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
void setup() {
Serial.begin(9600);
Serial.println("ILI9341 Test!");
tft.begin();
// чтение диагностики (необязательно, но может помочь в отладке проблем)
uint8_t x = tft.readcommand8(ILI9341_RDMODE);
Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDMADCTL);
Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDPIXFMT);
Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDIMGFMT);
Serial.print("Image Format: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDSELFDIAG);
Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
Serial.println(F("Benchmark Time (microseconds)"));
delay(10);
Serial.print(F("Screen fill "));
Serial.println(testFillScreen());
delay(500);
Serial.print(F("Text "));
Serial.println(testText());
delay(3000);
Serial.print(F("Lines "));
Serial.println(testLines(ILI9341_CYAN));
delay(500);
Serial.print(F("Horiz/Vert Lines "));
Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
delay(500);
Serial.print(F("Rectangles (outline) "));
Serial.println(testRects(ILI9341_GREEN));
delay(500);
Serial.print(F("Rectangles (filled) "));
Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
delay(500);
Serial.print(F("Circles (filled) "));
Serial.println(testFilledCircles(10, ILI9341_MAGENTA));
Serial.print(F("Circles (outline) "));
Serial.println(testCircles(10, ILI9341_WHITE));
delay(500);
Serial.print(F("Triangles (outline) "));
Serial.println(testTriangles());
delay(500);
Serial.print(F("Triangles (filled) "));
Serial.println(testFilledTriangles());
delay(500);
Serial.print(F("Rounded rects (outline) "));
Serial.println(testRoundRects());
delay(500);
Serial.print(F("Rounded rects (filled) "));
Serial.println(testFilledRoundRects());
delay(500);
Serial.println(F("Done!"));
}
void loop(void) {
for(uint8_t rotation=0; rotation<4; rotation++) {
tft.setRotation(rotation);
testText();
delay(1000);
}
}
unsigned long testFillScreen() {
unsigned long start = micros();
tft.fillScreen(ILI9341_BLACK);
yield();
tft.fillScreen(ILI9341_RED);
yield();
tft.fillScreen(ILI9341_GREEN);
yield();
tft.fillScreen(ILI9341_BLUE);
yield();
tft.fillScreen(ILI9341_BLACK);
yield();
return micros() - start;
}
unsigned long testText() {
tft.fillScreen(ILI9341_BLACK);
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(5);
tft.println("Groop");
tft.setTextSize(2);
tft.println("I implore thee,");
tft.setTextSize(1);
tft.println("my foonting turlingdromes.");
tft.println("And hooptiously drangle me");
tft.println("with crinkly bindlewurdles,");
tft.println("Or I will rend thee");
tft.println("in the gobberwarts");
tft.println("with my blurglecruncheon,");
tft.println("see if I don't!");
return micros() - start;
}
unsigned long testLines(uint16_t color) {
unsigned long start, t;
int x1, y1, x2, y2,
w = tft.width(),
h = tft.height();
tft.fillScreen(ILI9341_BLACK);
yield();
x1 = y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t = micros() - start; // fillScreen не учитывает время
yield();
tft.fillScreen(ILI9341_BLACK);
yield();
x1 = w - 1;
y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;
yield();
tft.fillScreen(ILI9341_BLACK);
yield();
x1 = 0;
y1 = h - 1;
y2 = 0;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;
yield();
tft.fillScreen(ILI9341_BLACK);
yield();
x1 = w - 1;
y1 = h - 1;
y2 = 0;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
yield();
return micros() - start;
}
unsigned long testFastLines(uint16_t color1, uint16_t color2) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height();
tft.fillScreen(ILI9341_BLACK);
start = micros();
for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);
return micros() - start;
}
unsigned long testRects(uint16_t color) {
unsigned long start;
int n, i, i2,
cx = tft.width() / 2,
cy = tft.height() / 2;
tft.fillScreen(ILI9341_BLACK);
n = min(tft.width(), tft.height());
start = micros();
for(i=2; i<n; i+=6) {
i2 = i / 2;
tft.drawRect(cx-i2, cy-i2, i, i, color);
}
return micros() - start;
}
unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
unsigned long start, t = 0;
int n, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(ILI9341_BLACK);
n = min(tft.width(), tft.height());
for(i=n; i>0; i-=6) {
i2 = i / 2;
start = micros();
tft.fillRect(cx-i2, cy-i2, i, i, color1);
t += micros() - start;
// Контуры не включаются в результаты хронометража
tft.drawRect(cx-i2, cy-i2, i, i, color2);
yield();
}
return t;
}
unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
tft.fillScreen(ILI9341_BLACK);
start = micros();
for(x=radius; x<w; x+=r2) {
for(y=radius; y<h; y+=r2) {
tft.fillCircle(x, y, radius, color);
}
}
return micros() - start;
}
unsigned long testCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, r2 = radius * 2,
w = tft.width() + radius,
h = tft.height() + radius;
// Экран для этого не очищается -- это
// преднамеренно и не влияет на сообщаемое время.
start = micros();
for(x=0; x<w; x+=r2) {
for(y=0; y<h; y+=r2) {
tft.drawCircle(x, y, radius, color);
}
}
return micros() - start;
}
unsigned long testTriangles() {
unsigned long start;
int n, i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(ILI9341_BLACK);
n = min(cx, cy);
start = micros();
for(i=0; i<n; i+=5) {
tft.drawTriangle(
cx , cy - i, // пик
cx - i, cy + i, // внизу слева
cx + i, cy + i, // внизу справа
tft.color565(i, i, i));
}
return micros() - start;
}
unsigned long testFilledTriangles() {
unsigned long start, t = 0;
int i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(ILI9341_BLACK);
start = micros();
for(i=min(cx,cy); i>10; i-=5) {
start = micros();
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, i*10, i*10));
t += micros() - start;
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(i*10, i*10, 0));
yield();
}
return t;
}
unsigned long testRoundRects() {
unsigned long start;
int w, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(ILI9341_BLACK);
w = min(tft.width(), tft.height());
start = micros();
for(i=0; i<w; i+=6) {
i2 = i / 2;
tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
}
return micros() - start;
}
unsigned long testFilledRoundRects() {
unsigned long start;
int i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(ILI9341_BLACK);
start = micros();
for(i=min(tft.width(), tft.height()); i>20; i-=6) {
i2 = i / 2;
tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
yield();
}
return micros() - start;
}
редактировать 3: - файл заголовка ili9341
/*!
* @файл Adafruit_ILI9341.h
*
* Это документация по драйверу Adafruit ILI9341 для
* Платформа Ардуино.
*
* Эта библиотека работает с Adafruit 2.8" Touch Shield V2 (SPI)
* http://www.adafruit.com/products/1651
* Adafruit 2,4-дюймовый ЖК-дисплей TFT с сенсорным экраном и разъемом MicroSD — ILI9341
* https://www.adafruit.com/product/2478
* 2,8-дюймовый ЖК-дисплей TFT с сенсорным экраном и разъемом MicroSD — ILI9341
* https://www.adafruit.com/product/1770
* 2,2-дюймовый 18-битный цветной ЖК-дисплей TFT с разъемом для карты памяти microSD — ILI9340
* https://www.adafruit.com/product/1770
* TFT FeatherWing - 2,4-дюймовый сенсорный экран 320x240 для всех перьев
* https://www.adafruit.com/product/3315
*
* Эти дисплеи используют SPI для связи, требуется 4 или 5 контактов
* к интерфейсу (RST необязателен).
*
* Adafruit инвестирует время и ресурсы, предоставляя этот открытый исходный код,
* пожалуйста, поддержите Adafruit и оборудование с открытым исходным кодом, купив
* продукты от Adafruit!
*
*
* Эта библиотека зависит от <a href="https://github.com/adafruit/Adafruit_GFX">
* Adafruit_GFX</a> присутствие в вашей системе. Пожалуйста, убедитесь, что у вас есть
* установил последнюю версию перед использованием этой библиотеки.
*
* Автор Limor "ladyada" Fried для Adafruit Industries.
*
* Лицензия BSD, весь текст здесь должен быть включен в любое распространение.
*
*/
#ifndef _ADAFRUIT_ILI9341H_
#define _ADAFRUIT_ILI9341H_
#include "Adafruit_GFX.h"
#include "Arduino.h"
#include "Print.h"
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <SPI.h>
#define ILI9341_TFTWIDTH 240 ///< ILI9341 максимальная ширина TFT
#define ILI9341_TFTHEIGHT 320 ///< ILI9341 максимальная высота TFT
#define ILI9341_NOP 0x00 ///< Неактивный регистр
#define ILI9341_SWRESET 0x01 ///< Реестр программного сброса
#define ILI9341_RDDID 0x04 ///< Чтение идентификационной информации дисплея
#define ILI9341_RDDST 0x09 ///< Чтение статуса дисплея
#define ILI9341_SLPIN 0x10 ///< Войти в спящий режим
#define ILI9341_SLPOUT 0x11 ///< Выспаться
#define ILI9341_PTLON 0x12 ///< Частичный режим включен
#define ILI9341_NORON 0x13 ///< Нормальный режим отображения включен
#define ILI9341_RDMODE 0x0A ///< Чтение режима питания дисплея
#define ILI9341_RDMADCTL 0x0B ///< Чтение дисплея MADCTL
#define ILI9341_RDPIXFMT 0x0C ///< Чтение формата пикселей дисплея
#define ILI9341_RDIMGFMT 0x0D ///< Чтение формата отображаемого изображения
#define ILI9341_RDSELFDIAG 0x0F ///< Чтение результатов самодиагностики дисплея
#define ILI9341_INVOFF 0x20 ///< Инверсия дисплея ВЫКЛ.
#define ILI9341_INVON 0x21 ///< Инверсия дисплея включена
#define ILI9341_GAMMASET 0x26 ///< Гамма-сет
#define ILI9341_DISPOFF 0x28 ///< Дисплей выключен
#define ILI9341_DISPON 0x29 ///< Дисплей включен
#define ILI9341_CASET 0x2A ///< Набор адресов столбцов
#define ILI9341_PASET 0x2B ///< Набор адресов страниц
#define ILI9341_RAMWR 0x2C ///< Запись в память
#define ILI9341_RAMRD 0x2E ///< Чтение памяти
#define ILI9341_PTLAR 0x30 ///< Частичная площадь
#define ILI9341_VSCRDEF 0x33 ///< Определение вертикальной прокрутки
#define ILI9341_MADCTL 0x36 ///< Контроль доступа к памяти
#define ILI9341_VSCRSADD 0x37 ///< Начальный адрес вертикальной прокрутки
#define ILI9341_PIXFMT 0x3A ///< COLMOD: набор форматов пикселей
#define ILI9341_FRMCTR1 \
0xB1 ///< Управление частотой кадров (в обычном режиме/полноцветном режиме)
#define ILI9341_FRMCTR2 0xB2 ///< Управление частотой кадров (в режиме ожидания/8 цветов)
#define ILI9341_FRMCTR3 \
0xB3 ///< Управление частотой кадров (в частичном режиме/полных цветах)
#define ILI9341_INVCTR 0xB4 ///< Отображение управления инверсией
#define ILI9341_DFUNCTR 0xB6 ///< Дисплей Функции управления
#define ILI9341_PWCTR1 0xC0 ///< Регулятор мощности 1
#define ILI9341_PWCTR2 0xC1 ///< Регулятор мощности 2
#define ILI9341_PWCTR3 0xC2 ///< Регулятор мощности 3
#define ILI9341_PWCTR4 0xC3 ///< Регулятор мощности 4
#define ILI9341_PWCTR5 0xC4 ///< Регулятор мощности 5
#define ILI9341_VMCTR1 0xC5 ///< Управление VCOM 1
#define ILI9341_VMCTR2 0xC7 ///< Управление VCOM 2
#define ILI9341_RDID1 0xDA ///< Идентификатор чтения 1
#define ILI9341_RDID2 0xDB ///< Чтение идентификатора 2
#define ILI9341_RDID3 0xDC ///< Чтение идентификатора 3
#define ILI9341_RDID4 0xDD ///< Чтение идентификатора 4
#define ILI9341_GMCTRP1 0xE0 ///< Положительная гамма-коррекция
#define ILI9341_GMCTRN1 0xE1 ///< Отрицательная гамма-коррекция
//# определить ILI9341_PWCTR6 0xFC
// Определения цвета
#define ILI9341_BLACK 0x0000 ///< 0, 0, 0
#define ILI9341_NAVY 0x000F ///< 0, 0, 123
#define ILI9341_DARKGREEN 0x03E0 ///< 0, 125, 0
#define ILI9341_DARKCYAN 0x03EF ///< 0, 125, 123
#define ILI9341_MAROON 0x7800 ///< 123, 0, 0
#define ILI9341_PURPLE 0x780F ///< 123, 0, 123
#define ILI9341_OLIVE 0x7BE0 ///< 123, 125, 0
#define ILI9341_LIGHTGREY 0xC618 ///< 198, 195, 198
#define ILI9341_DARKGREY 0x7BEF ///< 123, 125, 123
#define ILI9341_BLUE 0x001F ///< 0, 0, 255
#define ILI9341_GREEN 0x07E0 ///< 0, 255, 0
#define ILI9341_CYAN 0x07FF ///< 0, 255, 255
#define ILI9341_RED 0xF800 ///< 255, 0, 0
#define ILI9341_MAGENTA 0xF81F ///< 255, 0, 255
#define ILI9341_YELLOW 0xFFE0 ///< 255, 255, 0
#define ILI9341_WHITE 0xFFFF ///< 255, 255, 255
#define ILI9341_ORANGE 0xFD20 ///< 255, 165, 0
#define ILI9341_GREENYELLOW 0xAFE5 ///< 173, 255, 41
#define ILI9341_PINK 0xFC18 ///< 255, 130, 198
/**************************************************************************/
/*!
@brief Class to manage hardware interface with ILI9341 chipset (also seems to
work with ILI9340)
*/
/**************************************************************************/
class Adafruit_ILI9341 : public Adafruit_SPITFT {
public:
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,
int8_t _RST = -1, int8_t _MISO = -1);
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
#if !defined(ESP8266)
Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs = -1,
int8_t rst = -1);
#endif // конец !ESP8266
Adafruit_ILI9341(tftBusWidth busWidth, int8_t d0, int8_t wr, int8_t dc,
int8_t cs = -1, int8_t rst = -1, int8_t rd = -1);
void begin(uint32_t freq = 0);
void setRotation(uint8_t r);
void invertDisplay(bool i);
void scrollTo(uint16_t y);
void setScrollMargins(uint16_t top, uint16_t bottom);
// API транзакций, не используемый GFX
void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
uint8_t readcommand8(uint8_t reg, uint8_t index = 0);
};
#endif // _ADAFRUIT_ILI9341H_
@Vosem Media, 👍2
Обсуждение3 ответа
Лучший ответ:
Важным моментом, если ваше оборудование работает, является запуск программного обеспечения. Не все OLED-дисплеи одинаковы, и для их работы нужны разные команды.
Вы не можете просто взять случайный OLED и использовать случайную библиотеку — для его работы нужен драйвер.
В этом случае вам нужно беспокоиться о DA8620, который является основным чипом, и выбранная вами библиотека должна реализовывать команды и методологии для этого конкретного чипа.
Теперь у вас есть файл, содержащий эти команды (все «шестнадцатеричные команды»), и если вы не можете найти существующую библиотеку для работы с DA8620, вам придется написать или адаптировать ее, ссылаясь на эти команды. Вы можете узнать больше о том, что означают все команды, обратившись к таблице данных, в которой перечислены все команды и их параметры (начиная со страницы 78), поэтому вы должны быть в состоянии связать их с тем, что нужно существующей библиотеке, и соответствующим образом сопоставить вещи, в то время как соблюдение правильной последовательности включения питания.
Спасибо за информацию. К сожалению, DA8620 кажется нишевым и также снят с производства, поэтому очень сложно найти какую-либо информацию, не говоря уже о драйвере Arduino. Если бы я решил попробовать и адаптировать существующую библиотеку, например, Adafruit GFX, было бы так просто изменить некоторые команды в библиотеке, чтобы они соответствовали командам, написанным в таблице данных? Я предполагаю, что это работает совсем не так, и я, вероятно, не в своей тарелке. Как мне изменить библиотеку? Спасибо, @Vosem Media
@VosemMedia Вероятно, именно так это и работает. Найдите, что делает библиотека, а затем найдите команды, выполняющие эту работу, в таблице данных и сопоставьте их с примерами в имеющемся у вас файле команд., @Majenko
Хорошо, спасибо. Есть ли у вас какие-либо рекомендации для библиотек, с которых можно начать? Как вы думаете, тот, который я связал ранее, будет хорошей отправной точкой? Спасибо, @Vosem Media
Adafruit хорош тем, что разделен на разделы — один для примитивов рисования (библиотека GFX), а другой — для драйвера OLED., @Majenko
Хорошо, я отредактировал пример кода adafruit GFX для какого-то нерелевантного 2,4-дюймового tft. Он ссылается на некоторые функции, такие как tft.setTextColor
и tft.println
. Мне нужно отредактировать эти функции, верно? Или я ошибаюсь? и должен искать где-то еще. Если я не, эти волшебные команды были бы в Adafruit_GFX.h
или Adafruit_ILI9341.h
? Спасибо, @Vosem Media
Adafruit_GFX,h — родительский класс. Он содержит материалы высокого уровня, с которыми вы, как пользователь, взаимодействуете. Он не знает и не заботится о том, что такое OLED. Adafruit_ILI9341.h
— это низкоуровневый код взаимодействия OLED/ЖК-дисплея, который вам следует редактировать., @Majenko
Вау, это выглядит очень многообещающе. Я также редактировал Adafruit_ILI9341.h. Язык в таблице данных очень похож на язык в заголовочном файле, который выглядит хорошо. При условии, что оборудование работает, и мне удается правильно отредактировать все команды, смогу ли я запустить файл .ino примера ILI9341, и все будет работать гладко? Спосибо еще раз за помощь, @Vosem Media
Это то, на что можно надеяться, да., @Majenko
В таблице данных есть «0x06» (красный цвет чтения RDRED), «0x07» (зеленый) и «0x08» (синий), но не в заголовке. Должен ли я добавить его?, @Vosem Media
Также есть ряд, которые существуют только в заголовочном файле (0x10, 0x11,0x12, 0x13), @Vosem Media
В шапке должно быть то, что вам нужно. Удалите все, что характерно для старого ЖК-дисплея, и замените его аналогами из нового OLED. Если в OLED есть что-то, что не нужно библиотеке, просто игнорируйте их. Если есть вещи, которые делает старая библиотека, но не сразу понятно, как сделать в новом OLED, вам нужно проявить творческий подход. Любые #define являются чисто символическими для вашего собственного программирования. Если вы хотите их, то имейте их. Если вы не хотите их, то не имейте их., @Majenko
Ваш файл исходный code.txt
содержит ошибку.
Файл PDF содержит код в нескольких столбцах на каждой странице, и не все столбцы заполнены.
Это код (я думаю, что он правильный)
- Пример исходного кода
Command(0x11);
Data(0x00);
Delay_ms(255); // Задержка 255 мс или более
Command(0xC5);
Data(0x01);
Command(0xC4);
Data(0x2F);
Command(0xC0);
Data(0x10);
Data(0x00);
Command(0x26);
Data(0x00);
Command(0x2A);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0xEF);
Command(0x2B);
Data(0x00);
Data(0x00);
Data(0x01);
Data(0x3F);
Command(0x36);
Data(0x08);
Command(0xC0);
Data(0x50);
Data(0x00);
Command(0x3A);
Data(0x65); // Формат пикселей 16-битные данные
// Данные (0x67); // Формат пикселей 24-битные данные
Command(0xBB);
Data(0x4D);
Data(0x97);
Data(0x1C);
Command(0xC1);
Data(0x01);
Command(0xC6);
Data(0x6B);
Data(0x02);
Data(0x00);
Data(0x06);
Data(0x06);
Data(0x06);
Command(0xC9);
Data(0xF0);
Command(0xE0);
Data(0xC0);
Data(0x00);
Command(0xE2);
Data(0x00);
Command(0xE8);
Data(0x23);
Data(0x00);
Data(0x00);
Command(0xEB);
Data(0xC0);
Command(0xD9);
Data(0x40);
Data(0x00);
Command(0xD1);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Command(0xDF);
Data(0x35);
Data(0xAD);
Data(0x1C);
Data(0xE7);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x14);
Data(0xA5);
Data(0x18);
Data(0xC6);
Data(0x10);
Data(0x84);
Data(0x1C);
Data(0xE7);
Data(0x14);
Data(0xA5);
Data(0x10);
Data(0x84);
Data(0x1C);
Data(0xE7);
Data(0x08);
Data(0x42);
Data(0x0C);
Data(0x63);
Data(0x08);
Data(0x42);
Data(0x0C);
Data(0x63);
Data(0x10);
Data(0x84);
Data(0x08);
Data(0x42);
Data(0x0C);
Data(0x63);
Data(0x08);
Data(0x42);
Data(0x0C);
Data(0x63);
Data(0x10);
Data(0x84);
Data(0x14);
Data(0xA5);
Data(0x08);
Data(0x42);
Data(0x08);
Data(0x42);
Data(0x14);
Data(0xA5);
Data(0x0C);
Data(0x63);
Data(0x08);
Data(0x42);
Data(0x14);
Data(0xA5);
Data(0x08);
Data(0x42);
Data(0x08);
Data(0x42);
Data(0x0C);
Data(0x63);
Data(0x08);
Data(0x42);
Data(0x14);
Data(0xA5);
Data(0x14);
Data(0xA5);
Data(0x08);
Data(0x42);
Data(0x0C);
Data(0x63);
Command(0xD0);
Data(0x9F);
Data(0x19);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0x9F);
Data(0x19);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0x9F);
Data(0x19);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0x9F);
Data(0x19);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x0D);
Data(0x94);
Data(0x28);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x16);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x16);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x16);
Data(0x8F);
Data(0x35);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x20);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x20);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x20);
Data(0x8C);
Data(0x42);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x2A);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x2A);
Data(0xFF);
Data(0x00);
Data(0x04);
Data(0x2A);
Data(0x8A);
Data(0x50);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x08);
Data(0x33);
Data(0x88);
Data(0x64);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x08);
Data(0x46);
Data(0xFF);
Data(0x00);
Data(0x08);
Data(0x46);
Data(0xFF);
Data(0x00);
Data(0x08);
Data(0x46);
Data(0x7C);
Data(0x67);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x44);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x44);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x44);
Data(0x6E);
Data(0x74);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x54);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x54);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x54);
Data(0x64);
Data(0x90);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x5E);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x5E);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x5E);
Data(0x5A);
Data(0x92);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x5F);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x5F);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x5F);
Data(0x52);
Data(0x94);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x61);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x61);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x61);
Data(0x4C);
Data(0x95);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x65);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x65);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x65);
Data(0x47);
Data(0x97);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x62);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x62);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x62);
Data(0x42);
Data(0x99);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x64);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x64);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x64);
Data(0x3E);
Data(0x9A);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x66);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x66);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x66);
Data(0x3A);
Data(0x9C);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x65);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x65);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x65);
Data(0x37);
Data(0x9D);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x68);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x68);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x68);
Data(0x34);
Data(0x9F);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x6A);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x6A);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x6A);
Data(0x32);
Data(0xA0);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x6B);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x6B);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x6B);
Data(0x2F);
Data(0xA2);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x70);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x70);
Data(0xFF);
Data(0x00);
Data(0x10);
Data(0x70);
Data(0x2D);
Data(0xA4);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x72);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x72);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x72);
Data(0x2B);
Data(0xA6);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x75);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x75);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x75);
Data(0x29);
Data(0xA7);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x76);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x76);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x76);
Data(0x28);
Data(0xA8);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x79);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x79);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x79);
Data(0x26);
Data(0xAA);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x81);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x81);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x81);
Data(0x25);
Data(0xAC);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x81);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x81);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x81);
Data(0x23);
Data(0xAE);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x87);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x87);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x87);
Data(0x22);
Data(0xAF);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x89);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x89);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x89);
Data(0x21);
Data(0xB1);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x8D);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x8D);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x8D);
Data(0x20);
Data(0xB2);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x89);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x89);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x89);
Data(0x1F);
Data(0xB4);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x8E);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x8E);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x8E);
Data(0x1E);
Data(0xB6);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x93);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x93);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x93);
Data(0x1D);
Data(0xB8);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x98);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x98);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x98);
Data(0x1C);
Data(0xBA);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x95);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x95);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x95);
Data(0x1B);
Data(0xBC);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x95);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x95);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x95);
Data(0x1B);
Data(0xBC);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x91);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x91);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x91);
Data(0x1A);
Data(0xBE);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x9A);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x9A);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0x9A);
Data(0x19);
Data(0xC0);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0xA8);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0xA8);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0xA8);
Data(0x19);
Data(0xC0);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0xA0);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0xA0);
Data(0xFF);
Data(0x00);
Data(0x0C);
Data(0xA0);
Data(0x17);
Data(0xC6);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x2C);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x2C);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x2C);
Data(0x16);
Data(0xC9);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x45);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x45);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x45);
Data(0x14);
Data(0xD0);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x7F);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x7F);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0x7F);
Data(0x11);
Data(0xDE);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0xF0);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0xF0);
Data(0xFF);
Data(0x00);
Data(0x02);
Data(0xF0);
Data(0x0F);
Data(0xEB);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0x00);
Data(0x03);
Data(0x54);
Data(0xFF);
Data(0x00);
Data(0x03);
Data(0x54);
Data(0xFF);
Data(0x00);
Data(0x03);
Data(0x54);
Command(0xDD);
Data(0x0B);
Data(0x0B);
Data(0x0B);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Command(0xDE);
Data(0x1C);
Command(0xE4);
Data(0x7F);
Data(0x7F);
Data(0x7F);
Data(0xEF);
Data(0xEF);
Data(0xEF);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0xFF);
Data(0xFF);
Data(0xFF);
Data(0x00);
Data(0x00);
Data(0x00);
Command(0xED);
Data(0x0F);
Command(0xC7);
Data(0x00);
Command(0xC8);
Data(0xA4);
Command(0xD2);
Data(0xA7);
Command(0xE2);
Data(0x09);
Delay_ms(255);
Delay_ms(255);
Delay_ms(255);
Command(0xF0);
Data(0x7E);
Data(0x54);
Data(0x45);
Data(0x53);
Data(0x54);
Data(0x21);
Command(0x51);
Data(0x16);
Command(0x50);
Data(0x00);
Command(0xCE);
Data(0x80);
Data(0x00);
Data(0xE0);
Data(0x00);
Data(0x00);
Data(0x00);
Command(0xCD);
Data(0x06);
Data(0xC7);
Delay_ms(16); // Задержка 16 мс или более
Command(0xCE);
Data(0x80);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Data(0x00);
Command(0xCD);
Data(0x06);
Data(0xC7);
Command(0xCD);
Data(0x00);
Data(0x00);
Command(0x35);
Data(0x00);
Command(0xE0);
Data(0xD0);
Data(0x00);
Command(0x29);
Data(0x00);
Так это обновления и исправленный пример кода?, @Vosem Media
посмотрите на включенный вами txt-файл и сравните его с кодом в pdf-файле... txt-файл был создан путем копирования и вставки из pdf-файла... проблема в том, что pdf-файл имеет код, расположенный в четырех столбцах ... копирование и вставка четырех столбцов приводит к мусорным данным .... приведенный выше код соответствует правильной последовательности в файле pdf, @jsotola
А ладно я понимаю. Спасибо, что исправили это., @Vosem Media
Возможен ли метод связи SPI? В настоящее время я нашел чип, и, похоже, драйвер можно пересадить напрямую. Вы можете посмотреть на этот чип. https://nl.mouser.com/ProductDetail/Newhaven-Display/NHD-169-BREAKOUT?qs=wnTfsH77Xs6v7mYjAGElxw%3D%3D
- OLED 'SH1106_WHITE' was not declared in this scope
- Как прокручивать текст на OLED-дисплее, используя только библиотеку SSD1306Wire?
- Как ssd1306 справляется с разными размерами экрана?
- Эффективный рабочий процесс/инструменты для преобразования цветных изображений в шестнадцатеричные массивы
- Как отображать текст на OLED?
- Adafruit OLED 7 Pin Display - Аббревиатуры
- Артефакты на lcd при добавлении, казалось бы, не связанного кода
- Нужен дисплей в виде полосы для моего проекта Arduino
Кто-нибудь знает похожий/сменный экран для этой модели, TP241MC01G? Снят с производства. С трудом нахожу прозрачный OLED больше 1,5" (128x64)., @Ryan Weiss