Código Bluetooth ESP32 serial que compila
Aprende a cargar un código Bluetooth ESP32 serial, enlazarlo con Android y resolver errores frecuentes de placas, puertos y librerías en el Arduino IDE.
Un código Bluetooth ESP32 serial puede parecer una tarea de cinco minutos: cargar un ejemplo, emparejar el móvil y enviar texto. En una placa ESP32 original suele ser así. El problema aparece cuando se usa un ESP32-C3, S3, C6 o S2 esperando el mismo resultado, cuando se instala una librería que no corresponde o cuando se confunde Bluetooth clásico con BLE. Antes de copiar código, hay que confirmar qué radio incorpora la placa.
Qué hace un código Bluetooth ESP32 serial
La comunicación serie por Bluetooth permite usar el ESP32 como si tuviera un puerto serie inalámbrico. Desde una app de terminal Bluetooth en un teléfono Android, o desde un ordenador compatible, se pueden enviar comandos y recibir mensajes sin conectar el cable USB para cada prueba.
En el ESP32 original, el método más directo usa Bluetooth clásico con el perfil SPP, siglas de Serial Port Profile. La librería `BluetoothSerial.h` crea ese canal y expone funciones muy parecidas a las de `Serial`: `print()`, `println()`, `available()` y `read()`.
Esto resulta útil para ajustar un proyecto instalado dentro de una caja, enviar órdenes a un relé, cambiar el umbral de un sensor o revisar valores de depuración. No sustituye siempre a WiFi: Bluetooth tiene menos alcance, normalmente trabaja con un único cliente serie y no ofrece por sí mismo una interfaz web. A cambio, no necesita router ni credenciales de red.
Antes de compilar: confirma tu modelo de ESP32
Aquí está el límite que más tiempo hace perder. El código basado en `BluetoothSerial.h` y SPP funciona con el ESP32 original, habitual en placas ESP32 DevKit, ESP32-WROOM-32 y ESP32-WROVER.
No funciona como Bluetooth serie clásico en ESP32-S2, ESP32-C3, ESP32-S3 ni ESP32-C6. Estos modelos pueden incorporar BLE, pero no Bluetooth clásico SPP. No es un fallo de la placa ni una librería mal instalada: es una diferencia de hardware y de protocolo.
Si tu proyecto necesita conectar una app Android de terminal serie sin modificarla, elige un ESP32 original con Bluetooth clásico. Si ya tienes un C3, S3 o C6, debes implementar un servicio BLE UART y usar una app compatible con BLE. La experiencia se parece para el usuario, pero el código y las aplicaciones no son intercambiables.
También conviene separar Bluetooth clásico de Bluetooth BLE. BLE consume menos energía y es adecuado para sensores a batería, pero requiere definir servicios y características. SPP es más rápido de poner en marcha cuando quieres una consola inalámbrica para desarrollo.
Código Bluetooth ESP32 serial mínimo
Selecciona en Arduino IDE una placa compatible, por ejemplo `ESP32 Dev Module`, y un puerto serie que aparezca al conectar la placa por USB. Instala el paquete de placas ESP32 desde el gestor de tarjetas. No hace falta instalar `BluetoothSerial` desde el gestor de librerías: forma parte del núcleo Arduino para ESP32 original.
Carga este ejemplo en una placa ESP32-WROOM o equivalente:
```cpp #include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() { Serial.begin(115200);
if (!SerialBT.begin("ESP32-Serial")) { Serial.println("No se pudo iniciar Bluetooth"); while (true) { delay(1000); } }
Serial.println("Bluetooth listo"); Serial.println("Empareja el dispositivo ESP32-Serial"); }
void loop() { // Del monitor serie USB al dispositivo Bluetooth while (Serial.available()) { SerialBT.write(Serial.read()); }
// Del dispositivo Bluetooth al monitor serie USB while (SerialBT.available()) { Serial.write(SerialBT.read()); } } ```
El programa crea un dispositivo llamado `ESP32-Serial` y hace de puente entre el USB y Bluetooth. Lo que escribas en el monitor serie del IDE se verá en el terminal Bluetooth. Lo que envíes desde el móvil aparecerá en el monitor serie.
No hay conexiones adicionales: el Bluetooth está integrado en el chip. Sí necesitas una alimentación estable por USB durante las pruebas. Si el proyecto lleva motores, tiras LED o relés, no alimentes esas cargas desde el pin de 3,3 V de la placa. Las caídas de tensión y los reinicios se pueden confundir fácilmente con un problema de Bluetooth.
Cómo probarlo desde Android
Tras cargar el programa, abre el monitor serie a 115200 baudios. Deberías leer `Bluetooth listo`. Activa Bluetooth en el teléfono, busca `ESP32-Serial`, empareja y abre una aplicación de terminal que admita Bluetooth clásico SPP. Conecta al dispositivo y envía una palabra, por ejemplo `hola`.
El texto debe aparecer en el monitor serie. Después escribe desde el monitor y comprueba que llega al móvil. Esta doble prueba descarta de inmediato tres problemas distintos: carga incorrecta del firmware, emparejamiento fallido y configuración errónea de la aplicación.
En iPhone y iPad, las aplicaciones no suelen poder usar SPP genérico como en Android. Si el destino es iOS, planifica BLE desde el principio. Intentar resolverlo con este mismo sketch no suele llevar a ninguna parte.
Añadir comandos útiles sin bloquear el programa
El puente anterior sirve para validar la conexión, pero un proyecto real necesita interpretar órdenes. Un error habitual es usar `readString()` o `readStringUntil()` dentro del bucle principal y esperar datos durante demasiado tiempo. Puede funcionar en una demo, pero bloquea la lectura de sensores, la actualización de una pantalla o el control de un motor.
Para comandos sencillos, acumula caracteres hasta recibir un salto de línea. Así puedes enviar `LED ON` o `LED OFF` desde el móvil. La idea es procesar datos disponibles y volver rápido al resto del programa.
```cpp String comando = "";
void leerBluetooth() { while (SerialBT.available()) { char c = (char)SerialBT.read();
if (c == '\n' || c == '\r') { comando.trim();
if (comando == "LED ON") { digitalWrite(2, HIGH); SerialBT.println("LED encendido"); } else if (comando == "LED OFF") { digitalWrite(2, LOW); SerialBT.println("LED apagado"); }
comando = ""; } else { comando += c; } } } ```
Para usarlo, declara el pin en `setup()` con `pinMode(2, OUTPUT);` y llama a `leerBluetooth();` dentro de `loop()`. El GPIO 2 corresponde al LED integrado en muchas placas, pero no en todas. Revisa siempre el pinout de tu modelo antes de asumir que hay un LED conectado ahí.
En proyectos más serios, evita `String` si el equipo va a funcionar durante semanas o meses. Un búfer fijo de caracteres reduce fragmentación de memoria y permite limitar el tamaño de cada mensaje. También define un protocolo claro: comandos terminados en salto de línea, respuestas cortas y mensajes de error comprensibles. Bluetooth serie transporta bytes, no adivina dónde empieza ni termina una orden.
Errores habituales y su causa real
Si aparece un error al compilar relacionado con `BluetoothSerial`, primero revisa la placa seleccionada. Compilar para ESP32-C3 o ESP32-S3 con un sketch SPP no se arregla cambiando de cable ni copiando otra versión del mismo ejemplo. Debes usar BLE UART o cambiar a un ESP32 original.
Si el sketch carga pero el dispositivo no aparece al buscarlo, abre el monitor serie y verifica el mensaje de inicio. Confirma además que la placa no se está reiniciando por una fuente insuficiente. En placas clon, un cable USB solo de carga también impide cargar firmware y abrir correctamente el puerto, aunque no afecta al Bluetooth una vez arrancada.
Si el móvil ve el ESP32 pero no conecta, asegúrate de que la app elegida usa Bluetooth clásico y no solo BLE. Muchas aplicaciones separan ambas opciones en menús distintos. Borra el emparejamiento anterior si cambiaste ajustes, reinicia la placa y vuelve a probar.
Por último, no mezcles la velocidad del monitor USB con Bluetooth. Los 115200 baudios de `Serial.begin(115200)` afectan al monitor serie cableado. La conexión SPP no requiere que configures esa misma velocidad en el teléfono. Si ves caracteres extraños por USB, el problema es la velocidad del monitor, no el enlace Bluetooth.
Empieza con el puente mínimo, pruébalo con la placa sola y añade sensores, relés o motores después. Esa secuencia no es burocracia: permite saber qué parte ha fallado antes de convertir una prueba sencilla en una tarde de diagnósticos.