Módulo Bluetooth HM-20 se me desconecta a los 28-30 segundos

Buenas a todos,

Estoy haciendo un proyecto en el que trato de enviar datos de un sensor (sensor ultrasonido HC-SR04) con un Arduino Uno (a partir de ahora llamado "Arduino 1") y procesar posteriormente estos datos con el software "Matlab" para representarlo.

Para hacerlo inalámbrico se me ocurrió la idea de emparejarlos con módulos Bluetooth.

Antes de comprar los módulos Bluetooth estuve haciendo un análisis previo de la tecnología Bluetooth, y como quiero usar también un segundo Arduino Uno (a partir de ahora llamado "Arduino 2") para mover unos motores; vi que si quería emparejar más de un módulo Bluetooth simultáneamente y de manera fluida necesitaba que los módulos que comprara tuvieran como mínimo la versión Bluetooth 5.2.

Estuve buscando y finalmente me compré los módulos Bluetooth HM-20, que tiene Bluetooth 5.3, por lo que no tendría que tener problemas.

De manera que conseguí emparejar el módulo HM-20 de "Arduino 1" con el software "Matlab". De está forma Matlab estaba recibiendo los datos del sensor HC-SR04 cada 100ms o menos y representándolos en 3D.

El problema me viene cuando entre los 28 y 30 segundos aproximadamente después de establecer la conexión el módulo HM-20 decide desconectarse automáticamente.

Llevo unos cuantos días buscando una solución y la verdad que no he avanzado gran cosa.

Os comento lo último que he probado por si os sirve de ayuda:
1.- Al ser una aplicación que quiero usar en "tiempo real" (es decir, con un envío de datos inferior a 200 ms) no me vale andar emparejándolo después de que se me desempareje; porque en emparejarlo de nuevo tarda 1.5 segundos y me va metiendo lagazos en la representación. Y si posteriormente lo quiero implementar con algún control en tiempo real no es útil.

2.- He probado a enviar un mensaje cada 1 segundo desde Matlab al módulo HM-20 para que detecte que hay conexión y no se desconecte. Pero aunque el módulo detecta el mensaje de Matlab se sigue desconectando.

La versión firmware del módulo HM-20 es la: "HMSoft V109"

Tiene pinta de que tengo que configurar algún parámetro del Módulo HM-20 y he estado mirando el datasheet del fabricante ("https://www.deshide.com/product-details_HM-20.html") pero no consigo dar con ello.

Sigo investigando.

Muchas gracias de antemano por vuestro tiempo y ayuda. Cualquier ayuda la agradezco de corazón.

Estás seguro que es el HM-20 el que se desconecta?

Qué sistema operativo usas?

Si fuese Windows, revisaste que no esté activada la opción de apagar bluetooth para ahorrar energía?

Olvida lo que has hecho.
Coloca algo simple, que use BT 5.X y Matlab y prueba.

Hola MaximoEsfuerzo,

Yo diría que estoy al 99% seguro de que es el HM-20 el que se desconecta.

El módulo HM-20 tiene un led rojo que parpadea cuando no está emparejado y se mantiene fijo brillando cuando está emparejado.

Una vez lanzo el programa y el módulo HM-20 está emparejado y enviando datos (si observo el led está fijo brillando). Pero a los 28 - 30 segundos aprox se pone a parpadear.

Esto visto desde Matlab: una vez que se empareja con el módulo HM-20 estoy recibiendo datos cada 100 ms aprox y justo a los 28 - 30 segundos (cuando se pone a parpadear el led del módulo HM-20) Matlab deja al instante de recibir datos; posteriormente a los pocos segundos me sale en Matlab un error de que se ha perdido la conexión.

El mensaje de Matlab es: "Device has not sent new data. If device is
disconnected, then clear existing ble object and recreate it."

El sistema operativo de mi equipo es Windows 11.

Tal y como me has indicado, acabo de revisar la opción "apagar bluetooth para ahorrar energía" y estaba activada. Por lo que la he desactivado.

También he desactivado la opción de ahorro de energía en caso de no tener el cargador conectado al portátil.

He reiniciado el ordenador para asegurarme de aplicar los cambios.

Al lanzar el programa de nuevo me sigue sucediendo lo mismo. El módulo HM-20 se sigue desconectando a los 28 - 30 aprox (se pone a parpadear el led y matlab deja de recibir datos al instante).

Agradezco tu sugerencia y tu tiempo MaximoEsfuerzo :slight_smile:

Cualquier cosa que se te pueda ocurrir será bienvenida.

Buena observación, Surbyte.

Voy a probar y os comento. Gracias por la sugerencia.

Adjunta el código a ver si te escapó algo.

A mi me da la sensación que es algún parámetro del Módulo HM-20 que viene configurado por defecto para que se desconecte en esos 28- 30 segundos, pero no logro dar con él al ser la primera vez que me peleo con el protocolo Bluetooth.

Aquí te adjunto el código de Arduino:

/* Code Description:
 *  
 *  Measures data from an HC-SR04 sensor and sends it via Bluetooth communication using the HM-20 module
 *  
 *  NARPA CODE
 *  Created by Narpa - in 2025
 */

// Load the library
#include <SoftwareSerial.h>

// Set up a new SoftwareSerial object (Bluetooth Serial Port); used to transmit data via Bluetooth
SoftwareSerial mySerial(2, 3); // RX, TX

//// the arduino pins to which the trig and echo pins of the HC-SR04 sensor are attached to
const int trigPin_S1 = 4;
const int echoPin_S1 = 5;

int distance_S1;

long duration, distance;

// --------------------------------------------------------------

void setup()
{

  // opens serial port, sets data rate to 9600 bps
  //Serial.begin(9600);

  // opens Bluetooth Serial Port, sets data rate to 9600 bps
  mySerial.begin(9600);

  // Setup Pins Sensor
  pinMode(trigPin_S1, OUTPUT); 
  pinMode(echoPin_S1, INPUT);
  
}

void loop() {

    // START THE LOOP FUNCTION
    distance_S1 = SonarSensor(trigPin_S1,echoPin_S1);   // Distance Sensor 1; look bellow to find the definition of the SonarSensor function

    //display distance on arduino serial port
    //  Serial.println((String)distance_S1);  // print data in string format
    //  delay(100);
    
    //display distance on Bluetooth serial port
    mySerial.println((String)distance_S1);  // print data in string format
    delay(100);
}


// SonarSensor function used to generate and read the ultrasonic wave
int SonarSensor(int trigPinSensor, int echoPinSensor){  // NARPA CODE

  //STAR SonarSensor FUNCTION
  //generate the ultrasonic wave
  
  //-----------------------------------------------------------------------------------------------
  digitalWrite(trigPinSensor, LOW);   // put trigpin LOW
  delayMicroseconds(2);               // wait 2 microseconds
  digitalWrite(trigPinSensor, HIGH);  // switch trigpin HIGH
  delayMicroseconds(10);              // wait 10 microsenconds
  digitalWrite(trigPinSensor, LOW);   // turn it LOW again
  //-----------------------------------------------------------------------------------------------

  // read de distance

  //------------------------------------------------------------------------------------------------
  duration = pulseIn(echoPinSensor, HIGH);  // The pulseIn function will return the time it takes for the sound to reach the target and return to the sensor.
  distance = (duration*0.034/2);            // Divide de distance by two and multiple by sound speed
  //------------------------------------------------------------------------------------------------
  return distance;
  
}// END SonarSensor FUNCTION