Questo display LCD da 1,3″ 240×240 tipo ST7789 a colori presenta un’alta risoluzione, 260 ppi.
Il display è del tipo In-Plane Switching o IPS, una tecnologia LCD sviluppata da Hitachi nel 1996 per migliorare l’angolo di visione e la riproduzione dei colori dei pannelli TN (o Twisted Nematic).
Indice
Caratteristiche principali del display
- LCD IPS da 1,3″ con ampio angolo di visione di ±80°
- Display RGB a colori
- Display 240 x 240 ad alta risoluzione da 260 PPI
- Area: 23.4×23.4mm
- Dimensioni modulo: 28x39x12 m
- Interfaccia SPI senza pin CS
- Controller display ST7789
- Tensione di alimentazione 3,3 V
Interfaccia SPI
Questo display incorpora un interfaccia SPI che fornisce aggiornamenti rapidi del display.
Poiché è un dispositivo di sola scrittura, non è necessario che la SPI MISO sia collegata.
L’interfaccia non è dotata del pin CS (Chip Select ) il che riduce il numero di pin, ma non permette di avere altri dispositivi SPI sullo stesso bus contemporaneamente.
Connettore del modulo
La connessione al display avviene tramite un header a 7 pin.
PIN | Descrizione |
---|---|
GND | Pin GND in comune con l'MCU. |
VCC | Pin alimentazione 3,3 V. Da MCU o da fonte esterna |
SCL | Connettere a SPI SCL (Clock) |
SDA | Connettere a SPI MOSI (Dati) |
RES | Reset per il controller LCD ST7789. Normalmente HIGH, Portare LOW per ripristinare |
DC | Dati/Comando. Determina il tipo di dati da inviare al display. HIGH= Comando, LOW = Dati |
BLK | Controllo retroilluminazione. Se scollegato è sempre attiva |
Collegamento del display
Il modulo display LCD da 1,3″ 240×240 tipo ST7789 funziona a 3,3 V, quindi se si utilizza con un MCU da 5 V, occorre assicurarsi di includere dei traslatori di livello logico sulle linee dati per evitare possibili danni.
Sul retro del modulo troviamo un transistor e alcuni resistori e condensatori per fornire il controllo della retroilluminazione.
Il modulo non è dotato di un proprio regolatore da 3,3 V e quindi deve essere alimentato direttamente con 3,3 V. Per il test del display si è utilizzata una scheda ESP32 DEVKIT1 v1 e i pin utilizzati sono visibili nello schema sotto riportato. Il pin BLK può essere lasciato scollegato, il che lascerà sempre accesa la retroilluminazione.
Libreria per driver ST7789
Per gestire il display si dovranno utilizzare due librerie.
La prima libreria Arduino-ST7789 dovrà essere scaricata manualmente dal sito GitHub poiché non è disponibile tramite il gestore della libreria IDE di Arduino. Questa libreria è una versione modificata della libreria Adafruit originale che lo rende facile da usare con questo display che non dispone del pin CS.
La troverete a questo link https://github.com/ananevilya/Arduino-ST7789-Library .
Nota :sfortunatamente il sito non è più disponile, scaricare la copia che avevo scaricato a suo tempo
La seconda libreria è la libreria grafica Adafruit che può essere installata tramite il gestore della libreria Arduino IDE ricercando “gfx“.
Nota: in caso di problemi scaricare questa versione che è compatibile con quel display
Per il funzionamento del programma sono necessarie le librerie
1 2 3 | #include <Adafruit_GFX.h> // Core graphics library by Adafruit #include <Arduino_ST7789.h> // Library for ST7789 (with or without CS pin) #include <SPI.h> |
e l’indicazione delle connessioni dei pin del modulo TFT ST7789 che sono definite come mostrato di seguito:
1 2 3 4 | #define TFT_DC 2 // Data/Command #define TFT_RST 4 // ST7789 Reset #define TFT_MOSI 23 // SPI data pin #define TFT_SCLK 18 // SPI sclk pin |
Segue il programma di test utilizzato:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | #include <Adafruit_GFX.h> // Core graphics library by Adafruit #include <Arduino_ST7789.h> // Library for ST7789 #include <SPI.h> #define TFT_DC 2 // Data/Command #define TFT_RST 4 // ST7789 Reset #define TFT_MOSI 23 // SPI data pin #define TFT_SCLK 18 // SPI sclk pin Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); float p = 3.1415926; //=============================================================================== // Initialization //=============================================================================== void setup() { tft.init(240, 240); // initialize ST7789 chip at 240x240 pixels // Paint red/green/blue rectangles tft.fillRect(0, 0 , 240, 80, RED); tft.fillRect(0, 80 , 240, 160, GREEN); tft.fillRect(0, 160 , 240, 240, BLUE); delay (1000); // large block of text tft.fillScreen(BLACK); tft.setTextSize(3); //Imposta la grandezza del testo tft.setTextColor(WHITE); //Imposta il colore del testo (Solo bianco) tft.setCursor(0, 0); //Imposta la posizione del cursore (Larghezza,Altezza) tft.println(" ADRIROBOT"); //Stringa da visualizzare tft.setTextColor(RED); //Imposta il colore del testo (Solo bianco) tft.println("PROVA DISPLAY"); //Stringa da visualizzare tft.setTextColor(YELLOW); //Imposta il colore del testo (Solo bianco) tft.println(" 240X240 IPS"); //Stringa da visualizzare delay(3000); // a single pixel tft.drawPixel(tft.width() / 2, tft.height() / 2, GREEN); delay(1000); // line draw test testlines(YELLOW); delay(1000); // optimized lines testfastlines(RED, BLUE); delay(1000); testdrawrects(GREEN); delay(1000); testfillrects(YELLOW, MAGENTA); delay(1000); tft.fillScreen(BLACK); testfillcircles(10, BLUE); testdrawcircles(10, WHITE); delay(1000); testroundrects(); delay(1000); testtriangles(); delay(1000); mediabuttons(); delay(1000); } //=============================================================================== // Main //=============================================================================== void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } //=============================================================================== // Subroutines //=============================================================================== void testlines(uint16_t color) { tft.fillScreen(BLACK); for (int16_t x = 0; x < tft.width(); x += 6) { tft.drawLine(0, 0, x, tft.height() - 1, color); } for (int16_t y = 0; y < tft.height(); y += 6) { tft.drawLine(0, 0, tft.width() - 1, y, color); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (int16_t y = 0; y < tft.height(); y += 5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x = 0; x < tft.width(); x += 5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(BLACK); for (int16_t x = 0; x < tft.width(); x += 6) { tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (int16_t x = tft.width() - 1; x > 6; x -= 6) { tft.fillRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color1); tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x = radius; x < tft.width(); x += radius * 2) { for (int16_t y = radius; y < tft.height(); y += radius * 2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x = 0; x < tft.width() + radius; x += radius * 2) { for (int16_t y = 0; y < tft.height() + radius; y += radius * 2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(BLACK); int color = 0xF800; int t; int w = tft.width() / 2; int x = tft.height() - 1; int y = 0; int z = tft.width(); for (t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x -= 4; y += 4; z -= 4; color += 100; } } void testroundrects() { tft.fillScreen(BLACK); int color = 100; int i; int t; for (t = 0 ; t <= 4; t += 1) { int x = 0; int y = 0; int w = tft.width() - 2; int h = tft.height() - 2; for (i = 0 ; i <= 16; i += 1) { tft.drawRoundRect(x, y, w, h, 5, color); x += 2; y += 3; w -= 4; h -= 6; color += 1100; } color += 100; } } void mediabuttons() { // play tft.fillScreen(BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, RED); tft.fillRoundRect(69, 98, 20, 45, 5, RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, GREEN); } |