Conexión rápida de una pantalla OLED a un ESP32


Conectar una pantalla TFT pequeña a un ESP32 parece, sobre el papel, una tarea sencilla: cuatro cables SPI, una librería y listo. La realidad, como suele pasar en electrónica, es bastante distinta. En este artículo quiero contar el proceso completo, incluyendo los errores, las dudas y la solución final estable, porque estoy seguro de que le ahorrará tiempo a más de uno.

La pantalla en cuestión es una TFT IPS de 0,96 pulgadas, resolución 80×160, (exactamente este modelo https://amzn.to/4p0DjKF ) basada en el controlador ST7735S, muy similar (y compatible) con la conocida Adafruit Mini TFT 0.96″ 160×80. El microcontrolador es un ESP32 DevKit con módulo ESP-WROOM-32.

1. El hardware de partida

El montaje inicial estaba compuesto por:

  • ESP32 DevKit (ESP-WROOM-32)–> comprado en Amazon por unos 11.99€
  • Pantalla TFT IPS 0,96” 80×160 SPI (ST7735S)–>comprada en Amazon por unos 6.99€
  • Comunicación SPI
  • Alimentación desde el propio ESP32

Un punto importante: aunque el módulo TFT permite alimentación a 5 V porque incorpora un regulador en la propia placa, finalmente decidí alimentarlo a 3,3 V directamente desde el ESP32. Es más limpio, más seguro y suficiente para un funcionamiento correcto.

2. Primer obstáculo: el ESP32 no programaba

Antes incluso de ver algo en pantalla, apareció el primer problema serio:el ESP32 no se dejaba programar. El Arduino IDE devolvía errores del tipo:

Failed to connect / no serial data received / exit status 2

En Windows, el chip CP2102 aparecía con el clásico triángulo amarillo en el Administrador de dispositivos. La solución fue sencilla, pero nada obvia para quien empieza con un PC sin todo bien configurado:

  • Instalar el driver oficial CP210x USB-to-UART de Silicon Labs
  • Seleccionar el puerto COM correcto en el Arduino IDE
  • Bajar la velocidad de carga a 115200 baudios
  • Desconectar cualquier periférico hasta conseguir un programa mínimo estable (un Blink)

Una vez superado esto, el ESP32 empezó a comportarse como debía.

3. Pantalla encendida… pero en negro

El siguiente síntoma fue frustrante: la pantalla encendía la retroiluminación, pero no mostraba absolutamente nada.

El primer intento fue con la popular librería TFT_eSPI, que suele funcionar muy bien con ESP32. Sin embargo, aquí empezaron los problemas:

  • El archivo User_Setup_Select.h estaba prácticamente todo comentado
  • No había un controlador ST7735 correctamente definido
  • Los pines SPI no coincidían con los que estaba usando

Incluso después de configurar explícitamente ST7735 y definir pines personalizados (MOSI, SCLK, CS, DC, RST), ningún ejemplo funcionaba, ni siquiera los más básicos.

4. ¿La habré dañado alimentándola a 5 V?

En ese punto surgió la duda clásica:“¿Habré quemado la pantalla?”

Investigando el modelo exacto, encontré que este tipo de módulos incluye un regulador de tensión, exactamente igual que los de Adafruit, diseñados para:

  • VCC = 5 V
  • Lógica SPI a 3,3 V

Conclusión: la probabilidad de daño era baja. El problema no era eléctrico, sino de driver y configuración.

5. El verdadero lío: los buses SPI del ESP32

Aquí estaba una de las claves del problema.

El ESP32 dispone de dos buses SPI por hardware:

  • VSPI (por defecto):
    • SCK = GPIO18
    • MOSI = GPIO23
    • MISO = GPIO19
  • HSPI (alternativo):
    • SCK = GPIO14
    • MOSI = GPIO13
    • MISO = GPIO12 / 19 (configurable)

Yo ya tenía un lector de tarjeta SD funcionando en VSPI, y no quería tocarlo. Intentar colgar la TFT del mismo bus solo complicaba la configuración.

La solución fue clara: 👉 dedicar HSPI exclusivamente a la pantalla TFT.

6. Cambio de estrategia: librerías de Adafruit

La pista definitiva llegó revisando una reseña del propio módulo TFT, donde alguien lo hacía funcionar como si fuera una Adafruit Mini TFT 0.96″ 160×80.

Eso implicaba dos cosas importantes:

  • Usar las librerías:
    • Adafruit_GFX
    • Adafruit_ST7735
  • Inicializar la pantalla con: tft.initR(INITR_MINI160x80);

Este detalle es crítico: no todas las pantallas ST7735 se inicializan igual.

Tras instalar ambas librerías desde el gestor del Arduino IDE, todo empezó a encajar.

7. Conexión definitiva de la pantalla al ESP32

Separando claramente los buses SPI, el esquema final quedó así:

SPI

  • VSPI → Tarjeta SD
  • HSPI → Pantalla TFT

Conexiones TFT → ESP32

  • GND → GND
  • VCC → 3V3
  • SCL (SCK) → GPIO14
  • SDA (MOSI) → GPIO13
  • CS → GPIO26
  • DC → GPIO27
  • RES → GPIO12
  • BLK → 3V3 (retroiluminación permanente)

De este modo, una TFT y un futuro lector/grabador de SD pueden funcionar simultáneamente sin interferencias.

8. Código final que funciona (por fin)

Una prueba basica una vez instaladas desde el propio IDE de Arduino las librerías de Adafruit (Adafruit_GFX.h y Adafruit_ST7735) es el siguiente código funcional:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

#define TFT_CS   26
#define TFT_DC   27
#define TFT_RST  12

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  // Usar HSPI con 14 (SCK) y 13 (MOSI)
  SPI.begin(14, 19, 13);  // SCK=14, MISO=19 (no usado), MOSI=13

  tft.initR(INITR_MINI160x80);  // 0.96" 160x80
  tft.setRotation(3);

  tft.fillScreen(ST77XX_RED);
  delay(1000);
  tft.fillScreen(ST77XX_GREEN);
  delay(1000);
  tft.fillScreen(ST77XX_BLUE);
  delay(1000);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_WHITE);
  tft.setCursor(0, 0);
  tft.println("Hola");
}

void loop() {}

!Funciona !, ya se ven colores al prinicpio a pantalla completa y al final de la secuencia un texto, pero como inconveniente del código anterior es que el texto que se muestra es demasiado pequeño para poderse leer.

Esta claro que el codigo anterior se puede mejorar. Este es el sketch de prueba definitivo, limpio y funcional:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

#define TFT_CS   26
#define TFT_DC   27
#define TFT_RST  12

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  // HSPI: SCK=14, MISO=19, MOSI=13
  SPI.begin(14, 19, 13);

  tft.initR(INITR_MINI160x80);
  tft.setRotation(3);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextSize(2);

  tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
  tft.setCursor(5, 10);
  tft.print("0123456789");

  tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
  tft.setCursor(5, 35);
  tft.print("0123456789");

  tft.setTextColor(ST77XX_BLUE, ST77XX_BLACK);
  tft.setCursor(5, 60);
  tft.print("0123456789");
}

void loop() {
}

El resultado: imagen estable, colores correctos y orientación perfecta.

9. Conclusiones importantes

Si estás intentando conectar una pantalla TFT pequeña a un ESP32, quédate con estas ideas clave:

  • El ESP32 tiene dos buses SPI: aprovéchalos
  • No todas las pantallas ST7735 usan la misma inicialización
  • La librería Adafruit_ST7735 es a veces más fiable que TFT_eSPI
  • Que la pantalla se ilumine no significa que esté bien configurada
  • Alimentar a 3,3 V suele ser la opción más segura

En el próximo proyecto, esta TFT ya no será un problema… pero este “viaje” merecía ser contado.

Mucho cuidado con circuitos mal diseñados para obtener una mayor corriente


El LM317 es un todo un clásico: un regulador de tensión lineal ajustable que proporciona una salida de entre 1,2 y 37 voltios con una corriente máxima de 1,5 A. Sus terminales principales son entrada (IN), salida (OUT) y ajuste (ADJ), y solo requiere dos resistencias externas para fijar el voltaje deseado. Incluye protecciones contra sobrecarga, limitación de corriente y exceso de temperatura, lo que lo hace más robusto que reguladores fijos. Funciona como regulador flotante, tolerando hasta 40 V de diferencia entre entrada y salida, y suele necesitar pocos condensadores si está cerca de los filtros de alimentación. La salida mínima estable es de 1,25 V, ideal para fuentes de laboratorio o proyectos con motores y LEDs.​

Para configurarlo, debemos conectar un resistencia fija (como 220-240 Ω) entre OUT y ADJ,y un potenciómetro (5 kΩ) entre ADJ y masa para ajustar el voltaje. En módulos comerciales step-down, el potenciómetro ya está integrado, aceptando entradas de 4-40 V y entregando hasta 2 A con disipador. Para corrientes mayores, se acopla con transistores como TIP35 o se usa el LM350.

Este CI se emplea en fuentes de alimentación variables para prototipos, control de motores DC o estabilización de voltajes en IoT y electrónica embebida. En entornos como Arduino o ESP32, es útil para generar 3,3 V o 5 V estables desde baterías de 12 V. Requiere un disipador si la diferencia de voltaje genera calor significativo.

Ejemplo de Implementación

Este circuito utiliza el IC LM317 como regulador de voltaje variable. El voltaje de salida puede ajustarse entre 1,5V y 24V mediante el potenciómetro de 5KΩ. El condensador de 1000µF filtra el voltaje de entrada para mantenerlo estable, mientras que el condensador de 10µF en la salida reduce el rizado. La resistencia de 270Ω actúa como limitador de corriente de referencia para la regulación de voltaje.

Ejemplos de circuitos mal diseñados para obtener una mayor corriente

Es posible aumentar la corriente de salida del circuito anterior usando mosfet de potencia, pero no al modo de muchos tutoriales que existen circulando por la red. Aunque sí, es factible construir una fuente de alimentación regulada ajustable de hasta 40 A utilizando el LM317 con MOSFETs como el IRF4905 (P-channel, hasta -74 A, -55 V) , mucho cuidado con usar esquemas no verificados disponibles en redes sociales pues en muchos casos no van a funcionar. ​El LM317 solo soporta 1.5 A de forma nativa, y de hecho se puede combinar con MOSFETs en paralelo para desviar la corriente extra mientras el IC controla el voltaje de salida (típicamente 0-35 V). Circuitos probados usan varios IRF4905 conectados al OUT/ADJ del LM317, con una resistencia de puerta (como 10 Ω/10 W) para activación. Obviamente se necesitaran disipadores masivos con ventilador y un potenciómetro para ajuste.​​

En muchos esquemas disponibles en redes sociales aparece el IRF4505 que no debería estar en diseños estándar (posible error tipográfico por IRFP450, N-channel de 14 A/500 V, no compatible directamente), pero múltiples IRF4905 en paralelo si podrían alcanzan 40 A con baja Rds(on) de 0.02 Ω. Requiere entrada DC > salida + dropout (~3 V), protección contra cortos y buena refrigeración para evitar sobrecalentamiento.

El esquema erróneo es el siguiente (NO probar porque no funcionará):

La imagen muestra un módulo regulador de voltaje teórico basado en el LM317, diseñado para manejar corrientes elevadas (hasta 40 A) gracias al uso de transistores MOSFET de potencia IRF4905 e ¿IRF4505(MAL)?. En el diagrama esquemático revela los siguientes detalles:

  • Entrada de alimentación de 12 a 30 V DC.
  • El LM317 configurado para regular el voltaje.
  • Transistores MOSFET que permiten entregar altas corrientes.
  • Un regulador LM7812 para alimentar un ventilador de refrigeración.
  • Conexiones opcionales para un voltímetro externo.

Hay algunos detalles en el esquema que nos pueden dar que sospechar: claramente falta el potenciómetro para ajustar el voltaje de salida y claramente el segundo mosfet debería ser también un IRF4905 (hay un error tipográfico pues pone IRF4505) .Además los mosfet estan claramente mal conexionados pues en ambos cortocircuitan dos terminales (drain y source) y lo peor !en ambos transistores!. Además por si fuera poco se muestra una imagen (mas abajo) claramente generada con IA con las conexiones igualmente incorrectas ( obsérvese por ejemplo lo sospechoso de los cables rojo y negro que parecen salir de las clemas de entrada y salida):

En resumen hay que tener mucho cuidado pues con los esquemas de circuitos generados por la IA o por algunos aficionados porque no siempre son correctos como vemos en este ejemplo .