HC-05 deja de recibir datos tras un tiempo

Buenos días. Escribo para preguntar sobre un problema que estoy teniendo con el módulo de Bluetooth HC-05. La conexión Bluetooth se realiza de forma correcta, a una aplicación Android. Todo funciona bien, recibe y manda datos de forma correcta. El problema está en que después de un tiempo variable, entre los 30 segundos y el minuto, la aplicación Android sigue emitiendo datos pero el arduino no los recibe. No creo que la propia placa Arduino sea el problema, puesto que se siguen mostrando los mensajes de "Test" pero sin mostrar los valores recibidos del Bluetooth. Cuando se dejan de recibir datos del HC-05, al presionar el botón se retoma la conexión. La conexión Bluetooth no llega a cerrarse, puesto que las luces del HC-05 no cambian. Con este código, la desconexión ocurría despues de alrededor de un minuto.

void setup() {
  Serial.begin(9600); //Sets the baud for serial data transmission



}

byte data = 0;

void loop() {

if (Serial.available() > 0)
  {

    data = Serial.read(); 

    Serial.print ("Data: ");
    Serial.println (data);


    
  }

  Serial.println ("Test");
  Serial.write (data);

  delay (100);
  Serial.flush();

}

El HC-05 está conectado a los 5V y la tierra del arduino y a los puertos Tx y Rx del mismo. También probé con aligerar la transimisión de datos aumentando el delay que el Arduino y la aplicación Android compartían entre cada dato emitido. Cualquier ayuda se agradece.

Buen dia!
Esto que dices aqui:

También probé con aligerar la transimisión de datos aumentando el delay que el Arduino y la aplicación Android compartían entre cada dato emitido.

Segun entiendo tu pones un delay en arduino de 100 mlisegundos y pones un delay de 100 milisegundos en tu app y estás mandando datos entre esos 100ms de pausa. Si estoy en lo correcto, te pregunto: ¿como haces para sincronizar la transmisión de datos entre el bluetooth y el arduino para que coincidan exactamente esas pausas? ¿porque pregunto esto?
Veamos, mientras no recibes datos en en serial el arduino hace una pausa de 100ms y despues limpia buffer luego pregunta si hay algo en el puerto y se repite el ciclo, entonces ¿qué pasa si mandas el dato justo cuando el arduino está en otro mundo con ese delay(100); ? pues éste ni se entera! y justo despues saliendo del delay limpias el buffer por lo que cuando llegas al if (Serial.available>0) ya no hay nada en el serial y por eso ya no se ejecuta ésta instruccion.
Como no veo como funciona tu app es lo que estoy suponiendo, ya que el uso de delay ocasiona problemas en el 99.999% de los codigos (el 0.001% donde no hay problema es en el hola mundo)

La verdad es que simplememte confiaba en que se sincronizaran, y al probarlo ocurria, al menos al principio. El Serial.flush() lo incluí por si de algun modo el buffer del serial se llenaba y dejaba de recibir datos, aunque creo que no funciona así. Por otro lado, el delay en el arduino lo añadí por si acaso algun buffer o algo se llenara, pero hasta donde tengo entendido, no haría falta. Lo extraño es que al comprobar otra vez el programa, he podido ver que cuando el HC-05 deja de leer, primero realiza una corta pausa, luego muestra todas las lecturas que se le habían acumulado en esa pausa, y despues deja de leer definitivamente. Supongo que tampoco es culpa del HC-05 porque es recien comprado, pero tampoco tengo la certeza. Voy a comprobar si eliminando el flush y el delay sigue sucediendo, gracias por la idea.

Hi,
Como conectas el pin RX al arduino. Recuerda que el RX del HC-05 require un voltaje de 3.3 voltios. Si lo conectas directamente al arduino lo puedes danar. Necesitas un divizor de voltaje de 5 voltios a 3.3 voltios.

Leí que hacia falta, pero como también encontré algunos usuarios que lo conectaban directamente, supuse que no era necesario. Lo probaré en cuanto pueda a ver que tal. Sin embargo, no creo que sea el problema, porque parece como si se quedara sin espacio o algo y al pulsar el boton, retoma las lecturas y se pone al día, mostrando datos enviados varios segundos atrás.

Comprobé con las resostencias y el problema persiste. Cuando se dejan de recibir datos del HC-05, si pulso el botón de éste, la conexión vuelve durante un rato pero con los valores qie acumuló mientras no mostraba datos.

Hi,
No tines otro modulo de HC-05 para que pruebes si el que estas usando esta intermitente.

Ahora mismo no, pero a unas malas podria conprar otra y comprobar si se debe a eso.

Cabe mencionar que le envio un byte cada 100 o 200 milisegundos. Alomejor es demasiada información para el HC-05 y se congela por ello.

Hi,
Pregunta: Porque estas haciendo un delay si el formato de "available" lo que hace es esperar a que el HC-05 mande informacion. El se mantiene esperando todo el tiempo hasta que reciba data. Ahora si no recibe data se queda esperando.Tambien estas haciendo un flush despues del delay. Que pasa si durante el delay el HC-05 envia informacion. Si haces el flush hazlo antes del delay. En otras palbras flush y despues el delay. Yo eliminaria ambos comandos para ver si se sigue dejando de comunicarse.

En los ultimos intentos probé a quitarlo y seguía igual, funcionaba bien hasta que parecia como si se quedara sin memoria o algo y dejara de leer.

Hi,
Es posible que el problema es el HC-05. La razon es que estas usando la instrucion "available" esta instruccion lo que hace es esperar que el HC-05 este listo para enviarle la informacion. Si el HC-05 no responde/envia la informacion se queda esperando y creo que es lo que estas experimentando.

Podria ser. Probare con un HC05 nuevo o un HC06 a ver que tal. Tampoco tengo mucha alternativa porque el HC05 ha dejado misteriosamemte de funcionar asi que que le vamos a hacer.

Hi,
Se me ocurio una prueba y es de cambiar la instruccion if (Serial.available() < 0){}. Esto lo que va hacer es que se va quedar en el available todo el tiempo y no te va a printear la informacion de la data. Tratalo y si no printea la data quire decir que HC-05 se queda muerto y el arduino esta esperando que el HC-05 este listo para recibir la data.

El problema es Serial.flush() coméntalo y prueba.
Saca tambien ese delay(100). Nada tiene que hacer.
En realidad el codigo esta mal encaminado. Cada vez que se recibe un caracter se ingresa en el if pero jamas tendras toda la cadena enviada en

Serial.println ("Test");
  Serial.write (data);

De modo que dos veces imprimis lo mismo

Despues de mucho tiempo vuelvo al tema. Compré un HC06 nuevo y probandolo veo que le ocurre lo mismo. Añadiré todo el codigo de arduino por si sirve, pero el problema es el mismo. Recibe datos correctamente hasta que parece como si se atragantara y se queda pillado, y al rato intenta recuperarse mostrando todos los datos retrasados.

const byte diley = 100;
const byte blueLed = 11;
const byte redLed = 10;
const byte greenLed = 9;
const byte uno = 1;
byte percentage = 100;
void setup() {
  Serial.begin(9600); //Sets the baud for serial data transmission


  pinMode (blueLed, OUTPUT);
  pinMode (redLed, OUTPUT);
  pinMode (greenLed, OUTPUT);


//rgb(66, 245, 221) -> 
  analogWrite (redLed, 255);
    analogWrite (greenLed, 128);
    analogWrite (blueLed, 128);




}

byte data = 0;

void loop() {

  if (Serial.available() > 0) // Send data only when you receive data:
  {

    data = Serial.read(); // read the incoming data

    Serial.print ("Data: ");

    Serial.print (data);

    Serial.print (" - Percentage: ");

    percentage = (((data - 128*(data/128)) * 100 / 128) * 2 - 50);
    
    Serial.print (percentage);

    Serial.print ("% - Modo ");

    if (data/128 == 1) Serial.println (" D ");
    else Serial.println (" N ");

    analogWrite(blueLed, ((percentage * 255)-255));
    analogWrite(greenLed, ((percentage * 255)-255));



  }

}

El codigo en android le envia al HC06 valores entre 0 y 255 cada 100 milisegundos, lo cual no creo que sea demasiada informacion.