Reloj con ESP8266 NodeMCU, pantalla TFT ST7789 y RTC DS3231
Este tutorial muestra cómo hacer un reloj digital en tiempo real usando una tarjeta ESP8266 NodeMCU (ESP-12E) y un módulo RTC DS3231, donde la hora y la fecha se pueden ajustar con dos botones conectados al NodeMCU y se muestran (junto con la temperatura del chip RTC) en una pantalla TFT ST7789.
El módulo TFT ST7789 contiene un controlador de pantalla del mismo nombre: ST7789. Es una pantalla a color que utiliza el protocolo de interfaz SPI y requiere 3, 4 o 5 pines de control; es de bajo costo y fácil de usar. Esta pantalla es de tipo IPS y viene en distintos tamaños (1.3″, 1.54″ …), pero todas deben tener la misma resolución de 240×240 píxeles, es decir, 57600 píxeles. Este módulo funciona únicamente con 3.3V y no admite 5V.
TFT: Thin-Film Transistor (transistor de película delgada).
SPI: Serial Peripheral Interface (interfaz periférica serial).
IPS: In-Plane Switching (conmutación en el plano).
IIC (o I2C): Inter-Integrated Circuit (circuito interintegrado).
Para ver cómo conectar la tarjeta NodeMCU con la pantalla TFT ST7789, visita esta entrada:
Interfacing ESP8266 NodeMCU with ST7789 TFT Display
Hardware necesario:
- Tarjeta ESP8266 NodeMCU
- Módulo de pantalla TFT ST7789
- Módulo DS3231 —-> Hoja de datos del DS3231
- 2 botones (push button)
- 2 resistencias de 4.7k ohm
- Pila tipo botón de 3V
- Cable micro USB (para programar y alimentar todo el circuito)
- Protoboard
- Cables de conexión (jumpers)
Circuito del ESP8266 NodeMCU con TFT ST7789 y RTC DS3231:
La imagen de abajo muestra el diagrama esquemático del circuito del proyecto.
El módulo de pantalla ST7789 mostrado en el diagrama del circuito tiene 7 pines (de derecha a izquierda): GND (tierra), VCC, SCL (reloj serial), SDA (datos seriales), RES (reset), DC (o D/C: datos/comando) y BLK (retroiluminación).
Conectar el pin BLK es opcional. La retroiluminación se apaga cuando el pin BLK se conecta a tierra (GND).
El módulo de pantalla TFT ST7789 se conecta a la tarjeta NodeMCU de la siguiente manera:
GND se conecta al pin GND de la tarjeta NodeMCU,
VCC y BL se conectan al pin 3V3,
el pin SCL se conecta a D5 (GPIO14 del ESP8266EX),
el pin SDA se conecta a D7 (GPIO13 del ESP8266EX),
el pin RES se conecta a D8 (GPIO15 del ESP8266EX),
el pin DC se conecta a D4 (GPIO2 del ESP8266EX).
Si el módulo de pantalla tiene un pin CS (Chip Select), debe conectarse directamente al pin GND del NodeMCU.
Los pines D5 (GPIO14) y D7 (GPIO13) son los pines del módulo SPI por hardware del microcontrolador ESP8266EX, respectivamente para SCK (reloj serial) y MOSI (salida maestro-entrada esclavo).
Los pines SCL (reloj serial) y SDA (datos seriales) del módulo RTC DS3231 se conectan respectivamente a los pines D2 (GPIO4) y D1 (GPIO0) del NodeMCU.
Los dos botones, que se conectan a los pines D0 (GPIO16) y D1 (GPIO5) del NodeMCU, sirven para ajustar la hora y la fecha.
Código del ESP8266 NodeMCU con TFT ST7789 y RTC DS3231:
El siguiente código de Arduino requiere 3 librerías de Adafruit Industries:
La primera librería es un controlador para la pantalla TFT ST7789 que se puede instalar desde el gestor de librerías del IDE de Arduino (Sketch —> Include Library —> Manage Libraries …, en el cuadro de búsqueda escribe “st7789” e instala la de Adafruit).
La segunda librería es la librería de gráficos de Adafruit, que también se puede instalar desde el gestor de librerías del IDE de Arduino.
La tercera librería es para el RTC DS3231; se puede instalar con el gestor de librerías (en el cuadro de búsqueda escribe “rtclib” y elige la de Adafruit).
Las 3 librerías se pueden instalar manualmente; primero descárgalas desde los siguientes 3 enlaces:
Adafruit ST7789 TFT library —-> enlace directo
Adafruit graphics library —-> enlace directo
Adafruit RTC library —-> enlace directo
Después de la descarga, ve a Arduino IDE —> Sketch —> Include Library —> Add .ZIP Library … y busca el archivo .zip (descargado previamente).
Haz lo mismo con los demás archivos de librería.
Notas:
Las 3 librerías se incluyen (junto con la librería Wire de Arduino) en el código principal de la siguiente manera:
| #include <Wire.h> // Wire library (required for I2C devices) #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include “RTClib.h” // RTC library |
La conexión de la pantalla TFT ST7789 con el NodeMCU es la que se muestra a continuación, donde la pantalla se conecta al módulo SPI por hardware del NodeMCU (pines: SCK y MOSI):
| // ST7789 TFT module connections #define TFT_RST D8 // TFT RST pin is connected to NodeMCU pin D8 (GPIO15) #define TFT_DC D4 // TFT DC pin is connected to NodeMCU pin D4 (GPIO2) #define TFT_CS -1 // TFT CS pin is directly connected to GND // initialize ST7789 TFT library with hardware SPI module // SCK (CLK) —> NodeMCU pin D5 (GPIO14) // MOSI(DIN) —> NodeMCU pin D7 (GPIO13) Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); |
Y la pantalla TFT se inicializa con el siguiente comando:
| // if the display has CS pin try with SPI_MODE0 tft.init(240, 240, SPI_MODE2); // init ST7789 display 240×240 pixel |
Los dos botones se definen en el código como:
| const int button1 = D0; // button B1 is connected to NodeMCU D0 (GPIO16) const int button2 = D1; // button B2 is connected to NodeMCU D1 (GPIO5) |
Funciones usadas en el código:
bool debounce (): esta función realiza el antirrebote del botón B1; devuelve 1 si el botón fue estabilizado (debounced).
void RTC_display(): muestra el día de la semana, la fecha y la hora en la pantalla.
byte edit(byte parameter): esta función sirve para ajustar el reloj en tiempo real; devuelve el parámetro editado.
El resto del código se explica mediante comentarios.
Código completo de Arduino:

