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);
}
|






