Posted by lex232 on

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Недавно заказал с алиэкпресс интересный экран, достаточно маленького размера, всего 1.44 дюйма, но обладающий разрешением 240х240 пикселей на матрице IPS, и обладающий SPI контроллером ST7789, т.е. его можно подружить с библиотекой Adafruit. Появление таких качественных экранов по бросовой цене, могу объяснить только тем, что возможно их сделали огромную партию под какие-нибудь смарт-часы или похожие устройства.

К AVR подключать его не сильно хотелось, ведь его тактовая частота выводит изображения с сильной задержкой, и я решил протестировать его на ESP8266. Конечно особой информации в сети не нашлось, но вроде стандартная библиотека, судя по быстрому описанию на гитхабе, позволяла легко его подключить (хаха, не тут то было). Добавляем библиотеку в Arduino IDE

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Открываем пример graphictest, который появится у нас после добавления библиотеки, и видим много ifdef, для разных чипов, и вариантов подключений. Я эти куски сразу почистил, до лаконичных выводов, которые мне нужны. Собственно, какую-то часть менять не нужно, так как она завязана на аппаратный SPI

#define TFT_CS         D2
#define TFT_RST        D3
#define TFT_DC         D4
//
// define not needed for all pins; reference for ESP32 physical pins connections to VSPI:
// SDA  GPIO23 aka VSPI MOSI
// SCLK GPIO18 aka SCK aka VSPI SCK
// D/C  GPIO21 aka A0 (also I2C SDA)
// RST  GPIO22 aka RESET (also I2C SCL)
// CS   GPIO5  aka chip select
// LED  3.3V
// VCC  5V
// GND - GND

Тут я всё понял, когда посмотрел на выводы дисплея, ведь зашитая на спех программа ничего не отобразила на дисплее. Причину нашёл быстро, ведь я никуда не подключил вывод CS. Стоп, а где он?

Смотрите также:  WG12864B + ds18b20
Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Почему-то китайцы решили, что он не нужен (и да, можно выйти из ситуации программно, но стандартная библиотека использует его, а паяльника я боюсь меньше, чем программирования). Нашёл этот дисплей ещё раз на алиэкпресс, и о чудо, на самой матрице вывод обнаружился

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

К сожалению вывод CS был припаян к земле, и я решил, что его переходной контакт будет под экраном и аккуратно ножом сдёрнул его.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Но там его не оказалось, и остался вариант сложнее — полностью отпаять шлейф экрана, что было не просто, ведь его легко порвать. Кстати теперь сам дисплей можно использовать в своих устройствах без этой синей площадки. Распаять его достаточно легко на свою плату, изготовленную ЛУТом например, шаг выводов позволяет.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Контакт этот я срезал ножом, что он не контактировал с контактом GND, это делать нужно тоже аккуратно.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Теперь запаиваем обратно шлейф матрицы, и к выводу CS припаиваем уже свой провод, который можно подключить в ESP8266.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Итоговая схема подключения дисплея на ST7789 (и ST7735) получилась такая

Смотрите также:  Open-source система контроля доступа. Часть 1 - опрос матричной клавиатуры на arduino
Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Ещё раз пройдёмся по коду из примера graphictest из библиотеки st7789 и st7735

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Как я писал выше, я убрал все замены ifdef, и оставил выводы, которые точно буду использовать (выше в статье). ЗАтем закомментировал ненужный контроллер, и раскомментировал тот, что установлен в этом дисплее

// For 1.54" TFT with ST7789:
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

Также раскомментировал строку, с разрешением, которое мне нужно. Остальные удалил

  // OR use this initializer (uncomment) if using a 1.54" 240x240 TFT:
  tft.init(240, 240);           // Init ST7789 240x240

Вот теперь, при подключённом выводе CS демка сразу заработала. Значит нам доступны все функции библиотек adafruit_gfx. Скорость работы намного выше, чем у AVR.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Чтобы оценить качество экрана в полной мере, лучше вывести изображение, обычно это делается с micro-sd карты, но в самом экране её нет (хотя у adafruit вроде есть версии с флеш-слотом). Вспомнив, что у ESP8266 достаточно много собственной памяти для программ, решил попробовать записать изображение в память программы. Для этого можно воспользоваться ссылкой

Смотрите также:  Установка Arduino IDE на Ubuntu 18

Загружаем картинку нужного разрешения, и конвертируем в *.с файл. Далее, я чищу header этого файла, переименовываю в *.h, кладу в папку с проектом, и подключаю командой

#import "*.h"

Файл очень большой, и когда он лежит в проекте занимает много места. Каждый пиксель описывается в 16 битной цветовой гамме, и это конечно избыточно, замедляет вывод изображения. В самом файле картинки нас интересует переменная памяти программ, я назвал её DogBitmap

const unsigned short DogBitmap[57600] PROGMEM={
код картинки
}

Теперь простой командой из библиотеки adafruit можно вывести её на экран

tft.drawRGBBitmap(0, 0, DogBitmap, 240, 240);

Где, первые два аргумента (0,0) — это стартовая позиция отрисовки, потом имя нашей переменной, и затем размеры изображения по ширине и высоте (240х240). Смотрим результат. Картинку я взял из известных стикеров Вконтакте.

Дисплеи ST7735 и ST7789. Подключаем к ESP8266, выводим изображение без SD карты.

Как я уже писал, у этого экрана потрясающие углы обзора, и большое разрешение на 1.4 дюйма размера, так что для отображения картинок в маленьких устройствах он подходит великолепно. Как обычно, код по ссылке