I recently decided to order an arduino nano and a tft display from AliExpress. When I looked up online it took me some time to find a clear guide how to connect the display to the arduino, either the display had different pins or it was a slightly different model, but with some trial and error, I managed to get it to work.
- 1x Arduino Nano
- 1x AdaFruit 1.3" 240x240 ST7789 display
- 6x jumper wires or whatever else you can use to connect
Connect the display pins to arduino like so:
- GND to GND
- VCC to 3V3
- SCL to D13
- SDA to D11
- RES to D7
- DC to D9
- BLK to GND if you for some reason want to turn off the backlight, I left it as is
Go to Tools->Manage Libraries
and search for gfx install the AdaFruit graphics library and then search for ST7789 and install the display library.
#include <Adafruit_GFX.h> // graphics library
#include <Adafruit_ST7789.h> // library for this display
#include <SPI.h>
#define TFT_CS 10 // if your display has CS pin
#define TFT_RST 8 // reset pin
#define TFT_DC 9 // data pin
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
void setup() {
tft.init(240, 240, SPI_MODE2);
tft.setRotation(2); // rotates the screen
tft.fillScreen(ST77XX_BLACK); // fills the screen with black colour
tft.setCursor(10, 10); // starts to write text at y10 x10
tft.setTextColor(ST77XX_WHITE); // text colour to white you can use hex codes like 0xDAB420 too
tft.setTextSize(3); // sets font size
tft.setTextWrap(true);
tft.print("HELLO WORLD!");
}
void loop() {
}
And that's basically it! You've successfully connected a ST7789 display to an arduino nano!
There are a couple of very important notes about this guide.
First, for both Arduino Uno and Nano the display reset wire must go to the D8 pin, not D7! It still may work with D7 sometimes but very very very unstable (since D7 is floating and we do need to reset the display).
Second, the display works with 3.3 Volts and Arduino outputs high logic level as 5 V, so you need some kind of a level shifter. The easiest one is just 4 resistors connected in series with the each wire (SCL, SDA, RES, D/C). For me 220 Ohm works fine. If you are curious why it works - the display driver IC has diodes connected to the each input pin which conduct excessive positive voltage to the driver power line (+3.3 V). The higher resistor you use, the lower current will flow through it, but a too high value may result in transmission speed reduction.
And the last one - probably you need to use
SPI_MODE3
instead ofSPI_MODE2
since ST7789 datasheet stays it samples the data pin at the rising edge of the clock signal. It still works withSPI_MODE2
(since Arduino delays the clock signal a few nanoseconds relative to the data one and it's enough for ST7789), but for me with bothCPOL
andCPHA
(==SPI_MODE3
) it works more stable.