# 🚗 Proyecto: Tablero de instrumentos (Dash) de SimRacing en ESP32-S3 y pantalla GC9A01.
## 📌 Descripción general del proyecto
Se ha desarrollado un panel de instrumentos completo para simuladores de carreras (Assetto Corsa y otros, compatibles con SimHub) basado en un microcontrolador.ESP32-S3y una pantalla TFT circular.GC9A01(Resolución de 240×240 píxeles). El dispositivo recibe telemetría (velocidad, revoluciones, nivel de combustible) a través del puerto USB del programa.SimHub., muestra sus valores en la pantalla en forma de escala de revoluciones por LED (10 segmentos), cifras grandes de velocidad y porcentaje de combustible. Además, se ha implementadoCaja de botones.– 6 botones independientes y 2 encoders (con botones), cuyos estados se envían de vuelta a SimHub para controlar las funciones del juego (por ejemplo, limpiaparabrisas, cambio de modos, ajuste de TC/ABS, etc.).
---
🧩 Componentes utilizados
| Componente | Modelo / características | Cantidad |
|-----------|------------------------|-------------|
| Microcontrolador | ESP32-S3 (8 MB de memoria flash, 2 MB de PSRAM) | 1 |
| Pantalla | GC9A01 240×240, SPI | 1 |
| Botones | táctiles (6 piezas) | 6 |
| Encoders | EC11 (con botón) | 2 |
| Resistores | 10 kOhm –No se requieren.(se utilizan sujetadores internos) | – |
| Alimentación | desde el USB del ordenador o desde un adaptador externo de 5V | – |
---
📚 Bibliotecas utilizadas (Arduino IDE)
| Biblioteca | Versión | Propósito |
|------------|--------|-------------|
| TFT_eSPI | 2.5.2 | Controlador de pantalla GC9A01 |
| LVGL | 8.3.11 | Biblioteca gráfica para la interfaz |
| ArduinoJson | 6.x | Procesamiento de datos JSON de SimHub |
| ESP32Encoder | 0.8.1 | Trabajo con encoders (PCNT de hardware) |
Atención:La biblioteca ESP32Encoder requiere la presencia de PCNT, que solo está disponible en ESP32 y ESP32-S3 (no funciona en ESP32-C3).
---
## 🖥 Configuración de SimHub (PC)
### 1. Instalación del plugin Dispositivo Serie Personalizado.
- En SimHub: Ajustes → Plugins → activar Dispositivos Serie Personalizados.
### 2. Creación de un nuevo dispositivo.
- Arduino y placas → Mi hardware → Añadir nuevo dispositivo serie.
- Seleccionar el puerto COM del ESP32, velocidad.115200,Desactivar RTS y DTR..
- Incluir el carácter de nueva línea (\n).
### 3. Configuración del protocolo de salida (de SimHub a ESP32)
Seleccione el tipoJavaScript.Y en el campo de Mensajes de actualización, inserte:
JS
var speed = $prop('DataCorePlugin.GameData.NewData.SpeedKmh') ||
$prop('DataCorePlugin.GameData.NewData.Speed') || 0;
var rpm = $prop('DataCorePlugin.GameData.NewData.Rpms') || 0;
var combustible = $prop('DataCorePlugin.GameData.NewData.Fuel') || 0;
var maxRpm = $prop('DataCorePlugin.GameData.NewData.MaxRpm') || 10000;
Regresa JSON.stringify({ Velocidad: velocidad, RPM: rpm, Combustible: combustible, RPM máximo: maxRpm }) + "\n";
### 4. Configuración de las visualizaciones entrantes (para botones y encoders)
En la pestaña Incoming, cree reglas (mapeos):
| Desencadenador (proveniente de ESP32) | Acción |
|-----------------------------|-------------------|
| btn1 … btn6 | Emular teclado → asignar tecla o Acción del simulador → comando del juego |
| Enc1Clk, Enc2Clk | Acción del simulador → por ejemplo, Intermitentes Toggle |
| Enc1Value con un valor de 1 (o >0) | Aumentar valor (por ejemplo, TC+) |
| Enc1Value con un valor de -1 (o <0) | Disminuir valor (TC-) |
Para los codificadores, es conveniente usar *Acción A / Acción B** o *Ajustar valor**.
---
🎨 Aspecto del interfaz
-Fondo:Negro.
-10 LEDs naranjas.En la circunferencia, se encienden consecutivamente a medida que aumentan las revoluciones (cada 1000 rpm).
-Velocidad digital:Fuente 48, color blanco, en el centro (un poco más arriba).
-Unidades de medida:"km/h" en letra pequeña debajo de la velocidad.
-Combinustible:Fuente azul de 20, signo de repostaje, porcentaje, ubicado por debajo de la velocidad.
-Al iniciar:Durante 2 segundos, se muestra el logotipo naranja de "SIM RACING" en letras grandes.
---
## 🔧 Posibles mejoras
- Control de la intensidad de la iluminación a través de PWM (conectar el pin BL a cualquier GPIO, por ejemplo 4, y usar ledcWrite).
- Añadir una zona roja al tacómetro (cambiar el color del LED cuando la velocidad de rotación sea superior a 7000 rpm).
- Transmisión del número de transmisión, temperatura, tiempo del círculo (añadir campos en JSON y mostrarlos en la pantalla).
- Uso de codificadores para navegar por el menú en el panel (cambio de páginas).
---
⚠ Notas
- Para ESP32-S3, en la configuración de la placa en Arduino IDE, seleccione USB CDC On Boot: Activado, de lo contrario, el puerto serie podría no funcionar.
- No se recomienda utilizar los pines 35-40 para los botones, ya que son solo de entrada y no tienen tensión interna.
- Si los encoders funcionan de manera inestable, conecte resistores de 10 kOhm entre CLK/Dt y 3.3V o utilice el método setFilter(1023).
- La frecuencia de fotogramas en GC9A01 es suficiente para una actualización fluida de la velocidad y las revoluciones (gracias al SPI y LVGL del hardware).
---
✅ Conclusión
El proyecto consiste en un panel de instrumentos de automóvil completo para simracing, que combina una hermosa interfaz gráfica (LVGL) y controles físicos (botones + codificadores). Es fácilmente escalable, compatible con cualquier juego compatible con SimHub y se puede utilizar como un dispositivo DIY para los aficionados de las carreras.
모델 소스
