Прозрачный OLED-дисплей 240*320 с ардуино

display oled

Давным-давно я заказал этот прозрачный 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_

, 👍2

Обсуждение

Кто-нибудь знает похожий/сменный экран для этой модели, TP241MC01G? Снят с производства. С трудом нахожу прозрачный OLED больше 1,5" (128x64)., @Ryan Weiss


3 ответа


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

1

Важным моментом, если ваше оборудование работает, является запуск программного обеспечения. Не все 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


2

Ваш файл исходный code.txt содержит ошибку.

Файл PDF содержит код в нескольких столбцах на каждой странице, и не все столбцы заполнены.

Это код (я думаю, что он правильный)

  1. Пример исходного кода
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


2

Возможен ли метод связи SPI? В настоящее время я нашел чип, и, похоже, драйвер можно пересадить напрямую. Вы можете посмотреть на этот чип. https://nl.mouser.com/ProductDetail/Newhaven-Display/NHD-169-BREAKOUT?qs=wnTfsH77Xs6v7mYjAGElxw%3D%3D

,