Enviar datos de un HC05 a un HC06

Buenas, que tal, tengo un problema, necesito enviar datos desde mi componente maestro HC05 (Bluetooth) a un componente esclavo HC06 (Bluetooth). Hasta el momento pude hacer que los datos sean recibidos, en lo que se podria decir "correcto". Ahora, mi problema surge por el lado de que se vuelve basura, quiero decir, inicialmente primero recibe "bien los datos" aunque a veces cambie algun caracter que otro, pero bien... pero despues de un tiempo (creo que cuando configuro los baudios de mi hc06) empieza a mandar los datos pero ya todo con basura, a veces envia la cadena cambiando muchos caracteres, otra veces hace saltos de lineas dejando espacios en blanco y/o imprime dos cadenas una al lado de la otra.
Estuve intentando e investigando y asi llegue a lo que tengo, pero aun asi no logro solucionar el problema de la basura, muchos dicen que es temas de baudios y otros no se, estan peor que yo creo.

Como van a ver, yo configuro el HC06 en el proceso de su ejecucion, esto debido a un problema con la configuracion ya que no me deja modificar con comandos AT en monitor serial los valores (toque algo y quedo asi jeje) pero funciona si hago las sentencias directas desde el setup.

CODIGO MAESTRO

#include <SoftwareSerial.h>

SoftwareSerial miBlue(10, 11);

void setup(){
  Serial.begin(9600);
  miBlue.begin(9600);
  delay(100);
}

void loop(){

  if(miBlue.available()){
    Serial.write(miBlue.read());
  }
  if(Serial.available()){
    miBlue.write(Serial.read());
  }

  miBlue.print(" (1,2,3,4,5,6,7,8,9,10,11,12)\t\n");
  delay(1000);
}

CODIGO ESCLAVO

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11); // RX, TX

String datos = "";
String mostrar = "";
int index = 0;
char recived;

void setup() {
  Serial.begin(9600);
  bluetooth.begin(115200); // Intenta primero con 115200

  // Comandos para configurar el módulo
  Serial.println("Configurando HC-06...");
  sendATCommand("AT+NAMEAutito");
  sendATCommand("AT+PIN2305");
  sendATCommand("AT+BAUD4"); // Cambiar a 9600 bps
  delay(1000);
}

void loop() {
  while(bluetooth.available() && recived != '\t'){
    recived = bluetooth.read();
    if(recived == '(' || recived == ')'){
      concatenarDatos(char(recived));
    } else {
      concatenarDatos(recived);
    }
  }

  if(datos != '\0'){
    mostrar = datos;
    Serial.println(mostrar);
  }
  datos = "\0";
  recived = "a";

  delay(100);
}

void concatenarDatos(char inputData) {
  datos += inputData;  // Concatenar el carácter al String
}

void sendATCommand(String command) {
  Serial.print("Enviando: ");
  Serial.println(command);
  bluetooth.println(command);
  delay(1000);
}

DATOS DE CONFIGURACION DE CADA COMPONENTE POR COMANDO AT

HC-05:
	Nombre: BLUE
	UART: 9600 baudios
	Modo de acceso (CMODE): 0
	Direccion bluetooth vinculante: (Direccion MAC del HC06)
        PAIR: (Direccion MAC del HC06 con 10 segundos de vinculacion).
	

HC-06:
	Nombre
	Codigo vinculacion (PIN)
	Baudios: 9600 baudios.

En la imagen pueden ver como esta cargando los datos, los carga bien de la nada, es decir, uno atras del otro (a veces solo voltea los parentesis) y luego comienza a dar saltos de linea y cuando finaliza hace todo ese desastre con basura. No entiendo ya el por que

y aca otro ejemplo de como lo manda, es muy aleatorio esto

¿Qué placas estás usando? ¿UNO?

Si es así, SoftwareSerial no trabaja a 115200 baudios, con mucha suerte llega a 57600, entonces tal vez está fallando la configuración.

Si, es arduino Uno. Pero si cambio de 115200 comienza a fallar, directamente ni recibe los datos.
Aunque, igualmente despues se configura sendATCommand("AT+BAUD4"); a 9600 el esclavo.

Por cierto, cabe aclarar que quien trabaja con los 115200 es el bluetooth hc06

Si, claro, porque el HC-06 está a 115200 bps.

Ya, pero con comandos AT luego le estoy asignando los 9600, asi que practicamente esto de los 115200 a la hora de iniciar no tienen un efecto como tal

Si, es cierto, lo que no tiene explicación es por qué no guarda la configuración y reinicia a 115200 en lugar de 9600.

Ahora mira, pude configurar ambos a 9600, de xxxx pude descubrir porque no me dejaba usar los comandos AT.

Aun asi, el problema sigue siendo el mismo, ahora uso readStringUntil para hacerlo mas directo, pero nada

#include <SoftwareSerial.h>

SoftwareSerial hc06(10, 11); // RX, TX

String datos = "";
String mostrar = "";
int index = 0;
String recived = "";

void setup() {
  Serial.begin(9600);
  hc06.begin(9600);
}

void loop() {
  while(hc06.available()){
    recived = hc06.readStringUntil('\n');
    Serial.println(recived);
  }
  delay(100);
}

xxxx Editado por Moderador

Hacé una prueba simple, después ves lo demás.

#include <SoftwareSerial.h>

SoftwareSerial hc06(10, 11); // RX, TX

String datos = "";
String mostrar = "";
int index = 0;
String recived = "";

void setup() {
  Serial.begin(9600);
  hc06.begin(9600);
}

void loop() {
  while(hc06.available()){
//    recived = hc06.readStringUntil('\n');
//    Serial.println(recived);
    Serial.write(hc06.read());
  }
  delay(100);
}

Tendrías que ver en la terminal lo que recibe

1 Like

Ahora imprime las cosas asi, se ve muchisimo mas limpio. Pero tengo un tema, no se si es algo del componente ya o que, es que cuando cargo el codigo de nuevo, imprime pero se detiene de la nada, pero asi como lo ves, tal vez solo paso de read a readStringUntil y se detiene, y asi viceversa. Es raro, tengo que desconectar ambos y volver a conectarlos para que funciones, pasa mas al actualizar el codigo del maestro.

Normal

Ahora se detuvo con el Serial.write, aunque pasa con otros

Mi nuevo codigo maestro
Sigue siendo el mismo, solo borre el verificar si recibia algo por bluetooth, total el otro es esclavo.

#include <SoftwareSerial.h>

SoftwareSerial miBlue(10, 11);

void setup(){
  Serial.begin(9600);
  miBlue.begin(38400);
}

void loop(){
  miBlue.print("12345678\n");
  delay(1000);
}

Ahora estoy probando con cambiar a 38400 el UART del maestro y a 9600 de nuevo, a ver si hace algo

LISTO! LISTOOOOO LO CONSEGUI AAHHH!!!
Les comparto a todos esto, tal vez en algun momento haga una explicacion de tal. Eso si, hay defectos, por ejemplo, envia 12345678 pero puede de la nada enviar 123456789 12345 y asi repetido, pero es una vez cada tanto y a ver, eso a tocar cosas que si lenght, que si termina en tal y listo. Ahora

El codigo maestro se relaciona con un HC-05 Bluetooth.
El codigo esclavo se relaciona con un HC-06 Bluetooth.

CODIGO MAESTRO

#include <SoftwareSerial.h>

SoftwareSerial miBlue(10, 11);

void setup(){
  Serial.begin(9600);
  miBlue.begin(9600);
}

void loop(){
  miBlue.print("(1,2,3,4,5,6,7,8)\n");
  delay(1000);
}

CODIGO ESCLAVO

#include <SoftwareSerial.h>

SoftwareSerial hc06(10, 11); // RX, TX

String datos = "";
String mostrar = "";
int index = 0;
String recived = "";

void setup() {
  Serial.begin(9600);
  hc06.begin(9600);
  Serial.println("Iniciando");
}

void loop() {
  while(hc06.available()){
    Serial.write(hc06.read());
  }
  delay(100);
}

Configuraciones COMANDOS AT

CONSULTA: https://forum.arduino.cc/t/enviar-datos-de-un-hc05-a-un-hc06/1325759

HC-05:
	Nombre: AT+NAME=NOMBRE
	Contraseña: AT+PSWD=CONTRASEÑA
	UART (AT+UART): 9600 baudios
	Modo de acceso (CMODE): 0
	Direccion bluetooth vinculante (AT+BIND): La direccion MAC del HC-06.
	Tiempo de vinculacion (AT+PAIR): La direccion MAC del HC-06 con 5 o 10 segundos.
	Vinculacion directa (AT+LINK): La direccion MAC del HC-06.
	

HC-06:
	Nombre: AT+NAMENombre
	Codigo vinculacion (PIN): AT+PINNumero
	Version: V1.8
	Baudios: 9600 baudios.

Espero le sirva a futuros para arreglar sus problemas.

Gracias y saludos!.

No me habia dado algo como tal, pero si me sirvio para probar algo nuevo y funciono, ahi quedo perfecto. Gracias y saludos!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.