Дисплей ST7789 и Arduino nano

Всем привет. Помогите пожалуйста с дисплеем 240x240 на ST7789. Вожусь с ним уже 2 недели, не могу заставить вывести хотябы что нибудь. Подсветка работает, но изображения нет. Чёрный экран. В ардуину загружал такой тестовый скетч:

#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>

#define ST7789_CS   -1
#define ST7789_RST  9
#define ST7789_DC   8
Adafruit_ST7789 tft(ST7789_CS, ST7789_DC, ST7789_RST);

void setup(){
    tft.init(240, 240);
    tft.fillScreen(ST77XX_BLACK);
    tft.fillCircle(100, 60, 80, ST77XX_CYAN);
}

void loop() {
    tft.fillRect(160, 180, 230, 220, ST77XX_RED);
    delay(1000);
    tft.fillRect(160, 180, 230, 220, ST77XX_GREEN);
    delay(1000);
}

также проверял пример из библиотеки Adafruit (…\Adafruit_ST7735_and_ST7789_Library\examples\graphicstest_st7789\graphicstest_st7789.ino).

Сначала подключил к 5В, ничего. Потом выяснил что ему надо 3,3В и подключил контакт питания к 3,3В ардуины:

Ничего.
Заказал плату TXS0108E, подключил всё таким образом:

Опять ничего.
Я подумал что я испортил дисплей когда подключил к нему питание 5В, и заказал новый. Подключил его через TXS0108E. Не работает.
Нашёл у себя вот такую штучку

Взял 3,3В с неё, но опять безуспешно.
Пробовал подключать логические пины через резисторы 4,7кОм (мало ли TXS0108E не работает) - безуспешно.
Кстати TXS0108E прозванивал с помощью аналогового пина той же ардуины(китайцы не могут прислать мне мультиметр уже второй месяц), вроде все работает, сигнал преобразует как надо.
Пробовал подключать дисплей через програмный SPI, менял пины програмного SPI - безуспешно.

Пробовал и так, и этак, и всё сразу, и с первым дисплеем, и со вторым, результат один: подсветка горит, картинки нет. После кучи безуспешных попыток я так ничего и не смог выяснить. Наверно я рукожоп, но где? Помогите пожалуйста.

Надо использовать другие библиотеки для него, резисторные делители.

// ST7789 library example
// (c) 2019 Pawel A. Hernik

/*
 ST7789 240x240 IPS (without CS pin) connections (only 6 wires required):

 #01 GND -> GND
 #02 VCC -> VCC (3.3V only!)
 #03 SCL -> D13/SCK
 #04 SDA -> D11/MOSI
 #05 RES -> D8 or any digital
 #06 DC  -> D7 or any digital
 #07 BLK -> NC
*/

//#define TFT_CS    6
#define TFT_DC    7
#define TFT_RST   8 
#define SCR_WD   240
#define SCR_HT   240   // 320 - to allow access to full 240x320 frame buffer
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Arduino_ST7789_Fast.h>
Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST);
//Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST, TFT_CS);
 float k=3.14;//число к примеру

void setup(void) 
{
  lcd.cp437(true);//для правильного отображения русского алфавита
  //Serial.begin(9600);
  lcd.init(SCR_WD, SCR_HT); 
  lcd.fillScreen(BLACK);
  lcd.setCursor(0, 50);
  lcd.setTextColor(RGBto565(0,255,255),BLACK);
  lcd.setTextSize(3);
 // lcd.println("HELLO WORLD");
 lcd.println(utf8rus("ЧИСЛО ПИ"));
 lcd.println("");
 lcd.println(k); 
 }

void loop()
{
}
////////////////////////////////////////////////////////////////////
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
////////////////////////////////////////////////////////////////////


А какие у вас резисторы в делителях?

1,5 к и 3,6 к. Но номинал не столь важен, главное пропорция 1 : 2. Т.е. надо бы 1,7к и 3,4к или 4,7к и 10к.


Ураааа! Чота засветилось, спасибо огромное! Теперь буду разбираться что и как для него закодить.

Ну и хорошо. Русификацию библиотеки adafruit_gfx сделаете и будет так:

Хачю такие резисторы!

А нету, это футуристические резисторы и просто так их не найти.

Математика и закон Ома поможет.)))

как это нету!!!

Лучше поздно, чем никогда? :slight_smile:

А где ты там видишь резистор?


Или ты эту каракатицу резистором называешь?

Здравствуйте. Давно пытаюсь сделать секундомер. Использовал Ардуино, ESP32- контроллеры. Экраны на ST7789, ST7735. Подключал библиотеки GFX, eSPI, процесс счёта происходит одинаково: секунды 0,1,2,3, … 59 - первая минута. Далее 19,29,39, … ,99,10,11,12, … , 59 - вторая минута, и т.д. При этом если параллельно подключить экран на чипе HD44780 I2c, всё отображается правильно.

отлично.
если буду еще какие новости, держите нас в курсе.

1 лайк

где-то в примерах есть графические часики (стрелочный циферблат), работают

Попробуйте на библиотеке попроще:

// СЕКУНДОМЕР
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

float a = 0.00; // переменная для угла поворота стрелки
float aa = 0.00; // переменная для угла поворота стрелки (предыдущее значение)
int str = 55; //длина стрелки в пикселях
byte sek=16;//

void setup(void) {
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
   tft.cp437(true);//для правильного отображения русского алфавита
 tft.fillScreen(ST7735_BLACK);
 tft.setRotation(1);//ориентация экрана
 tft.drawCircle(80,64,63,ST7735_WHITE );//обод секундомера
 tft.drawCircle(80,64,62,ST7735_WHITE );
 tft.drawCircle(80,64,61,ST7735_WHITE );
  
}
void loop() {
 // 
 aa = a;
 //
  tft.setCursor(50, 45);
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN);
  tft.println(utf8rus("СЕКУНДОМЕР"));
  tft.setCursor(70, 80);
  tft.setTextSize(2);
  tft.setTextColor(ST7735_GREEN);
 if(sek<10){tft.print("0");}tft.println(sek);
 //  
  tft.fillTriangle(80+ cos(aa+1.5)*str*0.1, 64+ sin(aa+1.5)*str*0.1, 80 + cos(aa)*str, 64 + sin(aa)*str,80+ cos(aa-1.5)*str*0.1, 64+ sin(aa-1.5)*str*0.1,ST7735_BLACK );// стирание старой стрелки 
   a=a+PI/30;
    tft.fillCircle(80,64,7,ST7735_WHITE );
    for (float i = 0.01; i < 2 * PI; i = i + PI / 30) {
     tft.drawLine(80 + cos(i)*str * 0.90,  64 + sin(i)*str * 0.90, 80 + cos(i)*str,  64 + sin(i)*str,ST7735_GREEN    ); // риски-метки шкалы через 1 сек 
     }
    for (float i = 0.01; i < 2 * PI; i = i + PI / 6) {
     tft.drawLine(80 + cos(i)*str * 0.75,  64 + sin(i)*str * 0.75, 80 + cos(i)*str,  64 + sin(i)*str,ST7735_WHITE   ); // риски-метки шкалы через 5 сек 
     }
    tft.fillTriangle(80+ cos(a+1.5)*str*0.1, 64+ sin(a+1.5)*str*0.1, 80 + cos(a)*str, 64 + sin(a)*str,80+ cos(a-1.5)*str*0.1, 64+ sin(a-1.5)*str*0.1,ST7735_WHITE );// рисование новой стрелки
  tft.fillCircle(80,64,3,ST7735_BLACK );
     
  sek++;if(sek>59){sek=0;}
  //
 delay(835);//подбираем опытным путём
  tft.fillRect(70, 80, 30, 20, ST7735_BLACK);
}
////////////////////////////////////////////////////////////////////////
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
///////////////////////////////////////////////////////////////////////////



VID_20220828_075256

Спасибо за ответ, но дело в том, что секундомер используется как часть другого проекта, где нужны именно цифры. Да и вообще интересно, это у всех так или у меня одного.

только у вас

Если до вас еще не дошло - разговор этот без вашего кода не имеет смысла

Библиотеки использовал разные. Скетчи и сам писал и использовал чужие. Пробовал экраны на ST7735 и ST7789, результат одинаковый.

Ошибка элементарная.
Вместо того, чтобы выводить в начале минуты 0, 1, 2 , 3… - надо выводить 00, 01, 02, 03…