Comunicación entre bluetooth maestro / esclavo

Buenas tardes. tengo una consulta acerca de un proyecto que realizo.

es una comunicación por medio de bluetooth, utilizo 2 Arduino Uno y tengo 2 módulos bluetooth HC-05 uno configurado como maestro y el otro como esclavo, al momento de ejecutar los programas me mandan el mensaje que le establecí que si hay conexión o no la hay, el detalle esta en que manda confirmación de conexión y también de que no la hay, si alguien me pudiera ayudar de porque sucede esto o que esta fallando? :roll_eyes:

Sin que nos muestres tu código es muy dificil ayudarte.

Saludos

Moderador:
Hola, bienvenido al foro Arduino.
Esta es una sección para todo microcontrolador que se programe estilo Arduino pero que no sea Arduino.
Hay que leer las normas y los encabezamientos de cada sección para postear debidamente.
Movido a Software.

Normas del foro

gatul:
Sin que nos muestres tu código es muy dificil ayudarte.

Saludos

aquí se los muestro :

Código del Maestro

#define  pinBuzzer 8


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


if (Serial.available() > 0) 
{
  Serial.println("Conexión está OK");
  }
  else 
  { 
    Serial.println("FALLO en la Conexión");  
}

Serial.write('2');
tone(pinBuzzer, 523, 300);
delay (500);

Serial.write('3');
delay(1000);


}

Código del Esclavo

char c;
const int pinBuzzer = 8;

void setup ()
{


//inicializa la comunicacion serial  
  Serial.begin(9600);


//se configura los pines de entrada y salida   
  pinMode(13,OUTPUT);
  pinMode(8, OUTPUT);


// inicializa el estado  
  digitalWrite(13,LOW); 
  digitalWrite(8,LOW);
}


void loop()
{
 if (Serial.available() > 0) 
 {
   Serial.println("Conexión está OK");
   }
   else 
   { 
     Serial.println("FALLO en la Conexión");  
 }
 
   if(Serial.available())
 {
   c=Serial.read();
   if(c=='2')
   digitalWrite(13, !digitalRead(13));
      
   else if (c=='3') 
   digitalWrite(pinBuzzer, !digitalRead(pinBuzzer));


}


}

Primero que nada, por favor edita tu posteo anterior e inserta el código como corresponde (ver Normas del foro, punto 7).

Yendo a tu consulta, estás usando mal la función Serial.available() porque esta función devuelve el número de caracteres disponibles para leer, no el estado de la conexión.

A primera vista podría parecer lo mismo, si tengo algo que leer entonces tengo conexión, pero... ¿Qué pasa cuando no hay nada por leer y entonces devuelve 0? ¿No hay conexión o si la hay?
Puede que no la haya o que la haya pero solo no hay datos recibidos pendientes de leer. ¿Se entiende?

Por eso tu "esclavo" dice que hay conexión y luego de leer el serial te da fallo de conexión cuando en realidad es que no hay nada por leer.
Y fijate que el "maestro" nunca recibe nada entonces siempre te daría error cuando en realidad no lo hay.

Lo que se debería hacer (si funcionase) es

// *** ¡Atención! Este código no tiene utilidad en este caso***

if(Serial) {
   Serial.println("Conexión está OK");
 }
 else  { 
    Serial.println("FALLO en la Conexión");  
 }

Pero Serial siempre devuelve true (salvo en algunas placas como las Leonardo) entonces la realidad es que no es de ninguna utilidad.

La placa HC-05 tiene un pin "state" que, teóricamente, te indica con HIGH si está conectada entonces solo conectas ese pin a uno del arduino y leyendo el pin sabes si tienes o no conexión. Como dije, en teoría, porque parece ser que no en todas las placas el pin "state" funciona como se espera.

Por otro lado, así como planteas el código está usando el mismo puerto para la consola y para el bluetooth, ahí tienes una fuente de conflictos, ojo con eso.
Lo normal es usar SoftwareSerial para el bluetooth (salvo que haya otro puerto hardware disponible, por ej. en Mega tienes 4 puertos).

Situación curiosa: Si el serial tiene fallo en la conexión ¿Cómo transmitiría el mensaje "FALLO en la Conexión"? :wink:

gatul:
Primero que nada, por favor edita tu posteo anterior e inserta el código como corresponde (ver Normas del foro, punto 7).

Yendo a tu consulta, estás usando mal la función Serial.available() porque esta función devuelve el número de caracteres disponibles para leer, no el estado de la conexión.

A primera vista podría parecer lo mismo, si tengo algo que leer entonces tengo conexión, pero... ¿Qué pasa cuando no hay nada por leer y entonces devuelve 0? ¿No hay conexión o si la hay?
Puede que no la haya o que la haya pero solo no hay datos recibidos pendientes de leer. ¿Se entiende?

Por eso tu "esclavo" dice que hay conexión y luego de leer el serial te da fallo de conexión cuando en realidad es que no hay nada por leer.
Y fijate que el "maestro" nunca recibe nada entonces siempre te daría error cuando en realidad no lo hay.

Lo que se debería hacer (si funcionase) es

// *** ¡Atención! Este código no tiene utilidad en este caso***

if(Serial) {
  Serial.println("Conexión está OK");
}
else  {
   Serial.println("FALLO en la Conexión");  
}



Pero Serial siempre devuelve *true* (salvo en algunas placas como las Leonardo) entonces la realidad es que no es de ninguna utilidad.

La placa HC-05 tiene un pin "state" que, teóricamente, te indica con HIGH si está conectada entonces solo conectas ese pin a uno del arduino y leyendo el pin sabes si tienes o no conexión. Como dije, en teoría, porque parece ser que no en todas las placas el pin "state" funciona como se espera.

Por otro lado, así como planteas el código está usando el mismo puerto para la consola y para el bluetooth, ahí tienes una fuente de conflictos, ojo con eso. 
Lo normal es usar SoftwareSerial para el bluetooth (salvo que haya otro puerto hardware disponible, por ej. en Mega tienes 4 puertos).

Situación curiosa: Si el serial tiene fallo en la conexión ¿Cómo transmitiría el mensaje "FALLO en la Conexión"? ;)

Gracias por la información, ya corregí el post.
Bueno respecto a su respuesta, si comprendo lo que dice respecto a que puede parecer lo mismo pero no lo es.
si lo del SoftwareSerial ya lo arregle, es que tengo varios códigos de pruebas.
Bueno y respecto a lo del serial no se, porque he estado haciendo cambios y el mensaje de fallo es el que me manda, ahora solo manda que hay fallo, así que seguiré investigando y tratando de encontrar la solución.

Gracias por su comentario, ha sido de ayuda para aclarar algunas interrogantes.

Creo que no entendiste...
Te manda "Fallo..." porque no ha recibido nada, no porque haya un fallo de conexión.

Serial.available() solo sirve para saber si hay datos por leer en el buffer serie, nada más.

El puerto serie siempre está abierto, si recibe algo bien y si no también.
No tiene sentido chequear su estado porque no tiene una señal portadora, como por ej. un modem, entonces no hay forma de saber si la conexión está "caída" salvo que la mantengas "viva" enviando datos continuamente.

Te hago una analogía con una canilla y un vaso debajo.
begin() abre la canilla sin importar si hay agua en la cañería.
available() te dice cuanta agua hay en el vaso, si es que hay, para que la uses, nada mas que eso.
Pero nada te avisa si hay agua en el caño, se entiende?

gatul:
Creo que no entendiste...
Te manda "Fallo..." porque no ha recibido nada, no porque haya un fallo de conexión.

Serial.available() solo sirve para saber si hay datos por leer en el buffer serie, nada más.

El puerto serie siempre está abierto, si recibe algo bien y si no también.
No tiene sentido chequear su estado porque no tiene una señal portadora, como por ej. un modem, entonces no hay forma de saber si la conexión está "caída" salvo que la mantengas "viva" enviando datos continuamente.

Te hago una analogía con una canilla y un vaso debajo.
begin() abre la canilla sin importar si hay agua en la cañería.
available() te dice cuanta agua hay en el vaso, si es que hay, para que la uses, nada mas que eso.
Pero nada te avisa si hay agua en el caño, se entiende?

Es como lo dijo en la primera respuesta que no esta recibiendo dato alguno .
Entonces si nada me avisa que hay agua allí, se podría saber si existe agua en el caño?

No cites todo el texto, te van a "tirar de la oreja".

Saber si hay agua en el caño no, solo saber si la hay en el vaso.
Tal vez se puede inferir que después de determinado tiempo con el vaso vacío podría no haber agua en el caño, pero definitivamente no lo puedes saber apenas abres la canilla

De todos modos creo que no has entendido que tu problema es eso de los mensajes de fallo o "todo lindo", deshazte de esto

 if (Serial.available() > 0) 
 {
   Serial.println("Conexión está OK");
   }
   else 
   { 
     Serial.println("FALLO en la Conexión");  
 }

No te sirve para nada más que para complicarte y confundirte.

Ya te lo dije antes pero lo reitero:
El maestro no recibe datos, entonces available() te va a devolver 0 siempre y va indicar un fallo que no es tal.
En el esclavo mientras no reciba datos va a pasar lo mismo, va a marcar fallo cuando simplemente es que no hay nada por leer.

Mira tu código:
El maestro envía el caracter "2", el envío de ese caracter hacia el esclavo a 9600 bps demora apenas 1.04 ms, luego pasa 1.5 segundos hasta que envía el "3" y 1 segundo más para volver a empezar el loop.
Por cierto, ¿Cuál es el sentido de ese segundo de delay antes de tone()?

Por su lado, el esclavo recibe el "2" casi instantáneamente de ser enviado por el maestro, procesarlo y cambiar el estado del led le lleva unos pocos microsegundos y vuelve al principio del loop.
Durante 1.5 segundos no va a recibir nada porque el "3" todavía no fue enviado por el maestro que anda por la vida haciendo beeeep! ¿De acuerdo?
Ahora está al principio del loop y como ya leyó el "2", el buffer serie quedó vacío entonces available() devuelve 0 y tu le dices que debe decir "FALLO...".
Pero eso no es un fallo, es que el maestro todavía no envió el "3" porque, ya sabes, está ocupado con su beep.
O sea, no hay ningún fallo de comunicación.
Simplemente debe seguir dando vueltas al loop, esperando a que llegue el "3" para poder emitir su beep a su tiempo.

¿Se entiende la idea?

Saludos

PD: Asegúrate que el uso de delay() no sea incompatible con SoftwareSerial sino vas a tener más problemas. Slds

gatul:
De todos modos creo que no has entendido que tu problema es eso de los mensajes de fallo o "todo lindo", deshazte de esto

 if (Serial.available() > 0) 

{
  Serial.println("Conexión está OK");
  }
  else
  {
    Serial.println("FALLO en la Conexión");  
}



No te sirve para nada más que para complicarte y confundirte.

Ya te lo dije antes pero lo reitero:
El maestro no recibe datos, entonces available() te va a devolver 0 **siempre** y va indicar un fallo que no es tal.
En el esclavo mientras no reciba datos va a pasar lo mismo, va a marcar fallo cuando simplemente es que no hay nada por leer.

Mira tu código: 
El maestro envía el caracter "2", el envío de ese caracter hacia el esclavo a 9600 bps demora apenas 1.04 ms, luego pasa 1.5 segundos hasta que envía el "3" y 1 segundo más para volver a empezar el loop.
Por cierto, ¿Cuál es el sentido de ese segundo de delay antes de tone()?

Por su lado, el esclavo recibe el "2" casi instantáneamente de ser enviado por el maestro, procesarlo y cambiar el estado del led le lleva unos pocos microsegundos y vuelve al principio del loop.
Durante 1.5 segundos no va a recibir nada porque el "3" todavía no fue enviado por el maestro que anda por la vida haciendo beeeep! ¿De acuerdo?
Ahora está al principio del loop y como ya leyó el "2", el buffer serie quedó vacío entonces available() devuelve 0 y tu le dices que debe decir "FALLO...".
Pero eso no es un fallo, es que el maestro todavía no envió el "3" porque, ya sabes, está ocupado con su beep.
O sea, no hay ningún fallo de comunicación.
Simplemente debe seguir dando vueltas al loop, esperando a que llegue el "3" para poder emitir su beep a su tiempo.

¿Se entiende la idea?

Saludos

PD: Asegúrate que el uso de delay() no sea incompatible con SoftwareSerial sino vas a tener más problemas. Slds

Esa parte del código ya la elimine.
a y ese delay que estaba antes del tone() estaba colado, ya lo corregí.
Entonces es esperar a que llegue el dato para poder que se cumpla el beep.
revisare acerca de los delay().

Básicamente la idea del proyecto es que cuando no exista la conexión entre ambos bluetooth, el buzzer mande alerta es como una alarma, jamás había trabajado con dispositivo bluetooth antes, por eso esto de la comunicación y demás me ha enredado un poco para comprenderla.
Pero voy de a poco comprendiendo lo que me explica. Gracias.

Fijate si el pin "state" del modulo bluetooth se pone en alto cuando está conectado, por lo que leí no en todos funciona pero con probar no pierdes nada.

gatul:
Fijate si el pin "state" del modulo bluetooth se pone en alto cuando está conectado, por lo que leí no en todos funciona pero con probar no pierdes nada.

Si cuando realice la configuración Maestro/Esclavo, el led que permanece en el state, parpadea igual y al mismo tiempo en ambos dispositivos bluetooth.
Cuando me dice que me fije si el estado se pone en alto, se refiere a HIGH cierto?.

Si (YES) :smiley:

Moderador:
Por favor no repitas lo que otra persona te dice.
Item 14 ultimo párrafo de las normas del foro.

Desde el post#5 en adelante repites lo que te responden, lo que esta de más en este foro, solo ensucia el hilo.

Creo que ayer te lo he pedido por privado y sigues haciéndolo.

Edita todas y cada una de las repeticiones.
Responde por privado por favor, donde tmb te he solicitado esto, porque este post será borrado cuando cumplas mi pedido.

Gracias.

kalial_14:
Buenas tardes. tengo una consulta acerca de un proyecto que realizo.

es una comunicación por medio de bluetooth, utilizo 2 Arduino Uno y tengo 2 módulos bluetooth HC-05 uno configurado como maestro y el otro como esclavo, al momento de ejecutar los programas me mandan el mensaje que le establecí que si hay conexión o no la hay, el detalle esta en que manda confirmación de conexión y también de que no la hay, si alguien me pudiera ayudar de porque sucede esto o que esta fallando? :roll_eyes:

Muchas gracias a gatul por la ayuda brindada.

La solución:

Investigando y con las respuestas a mis preguntas aquí, yo estaba utilizando solo 4 pines del bluetooth vcc, gnd, txd, rxd, entonces para verificar la conexión con el pin (state) se puede realizar y así pude resolver mi problema.

Le agregue esta parte de código al esclavo:

boolean BTconnected = false;
const byte BTpin = 4;

void loop()
{
if( digitalRead(BTpin)==HIGH) 
   {
      Serial.println("ON");
    }
    else 
    { 
      Serial.println("OFF");
    }
}

¡Excelente!
Gracias por compartir la solución, seguro le va a servir a alguien más.

Desde ya que a mi me va a servir cuando me ponga a experimentar con bluetooth. :wink:

Saludos

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