[SOLUCIONADO] HC-05 Bluetooth - Lectura siempre -1

Buenos días,

Actualmente estoy probando un módulo bluetooth basando en un código de internet en el cual dependiendo de la cadena enviada ( Toda ella almacenada en un array de char ) habilita el estado de 3 diferentes led.

El problema reside en que siempre que leo cualquier carácter mandado por parte del bluetooth, me retorna -1 (Con independencia de que botón pulse ). Adjunto código:

#include <SoftwareSerial.h> //Librería que permite establecer comunicación serie en otros pins
 
//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(10,11); //10 RX, 11 TX.
 
int green=4;
int yellow=5;
int red=6;
char cadena[255]; //Creamos un array de caracteres de 256 cposiciones
int i=0; //Tamaño actual del array
 
int estado = 0;

void setup()
{
  BT.begin(9600);
  Serial.begin(9600);
  pinMode(green,OUTPUT);
  pinMode(yellow,OUTPUT);
  pinMode(red,OUTPUT);
}
 
void loop()
{
  //Cuando haya datos disponibles
  if(BT.available())
  {
     
    Serial.println(estado);
       
      /* Codigo debug */
      if(estado == 0)
      {
        digitalWrite(green,HIGH);
        Serial.println("ENCENDIDO");
        estado = 1;
      } else {
        digitalWrite(green,LOW);
        Serial.println("ENCENDIDO");
         estado = 0;
      }
     /* Fin Codigo debug */
     
    char dato=BT.read(); //Guarda los datos carácter a carácter en la variable "dato"

    cadena[i++]=dato; //Vamos colocando cada carácter recibido en el array "cadena"
 
 
    /* Codigo debug */
    Serial.println("Se ha pulsado una tecla");
    Serial.print((char)BT.read());
    /* Fin Codigo debug */
    
    //Cuando reciba una nueva línea (al pulsar enter en la app) entra en la función
    if(dato=='\n')
    {
      Serial.print(cadena); //Visualizamos el comando recibido en el Monitor Serial
 
      //GREEN LED
      if(strstr(cadena,"green on")!=0)
      {
        digitalWrite(green,HIGH);
      }
      if(strstr(cadena,"green off")!=0)
      {
        digitalWrite(green,LOW);
      }
      //YELLOW LED
      if(strstr(cadena,"yellow on")!=0)
      {
        digitalWrite(yellow,HIGH);
      }
      if(strstr(cadena,"yellow off")!=0)
      {
        digitalWrite(yellow,LOW);
      }
      //RED LED
      if(strstr(cadena,"red on")!=0)
      {
        digitalWrite(red,HIGH);
      }
      if(strstr(cadena,"red off")!=0)
      {
        digitalWrite(red,LOW);
      }
      //ALL ON
      if(strstr(cadena,"on all")!=0)
      {
        digitalWrite(green,HIGH);
        digitalWrite(yellow,HIGH);
        digitalWrite(red,HIGH);
      }
      //ALL OFF
      if(strstr(cadena,"off all")!=0)
      {
        digitalWrite(green,LOW);
        digitalWrite(yellow,LOW);
        digitalWrite(red,LOW);
      }
 
      BT.write("\r"); //Enviamos un retorno de carro de la app. La app ya crea una línea nueva
      clean(); //Ejecutamos la función clean() para limpiar el array
    }
  }
}
 
//Limpia el array
void clean()
{
  for (int cl=0; cl<=i; cl++)
  {
    cadena[cl]=0;
  }
  i=0;
}

¿Sabéis a que puede deberse esto? Necesito hacer alguna configuración en mi módulo ( Mediante comandos at ) para que pueda leer correctamente los datos.

Muchas gracias por todo!

Un saludo.

**EDIT: El seguimientos de este post será a partir del comentario #4 ya que he cambiado el código y el circuito por completo.

**EDIT [SOLUCIONADO] : Comentario #7

errores

Serial.println(estado);
       
      /* Codigo debug */
      if(estado == 0)  {
        
        digitalWrite(green,HIGH);
        Serial.println("ENCENDIDO");
        estado = 1;
      } else {
        digitalWrite(green,LOW);
        Serial.println("ENCENDIDO");
         estado = 0;
      }

Estado se define como global con valor = 0;
Y nadie lo cambia de modo que siempre sera HIGH y un ENCENDIDO por cierto, da igual estado = 0 que 1 siempre diras ENCENDIDO.

Todos tus

Todos tus if(strstr(cadena,"green on")!=0)
      {
        digitalWrite(green,HIGH);
      }

Consultan por la negación o sea, entiendo que green ON debe poner led GREEN en HIGH y acá dice lo opuesto.

Entonces debe ser simplemente

if(strstr(cadena,"green on"))
      {
        digitalWrite(green,HIGH);
      }

y finalmente cuando tienes estos problemas usa algunos trucos como poner por ejemplo algo que “te muestre” que va leyendo el Arduino del BT. solo un Serial.print(dato); ayuda…
luego de reconocer el ‘\n’ le pones un Serial.println(); y listo.

Pero más allá de los errores de código que comentas, el problema es que la variable dato ( char dato = BT.read (); ) siempre me devuelve un -1, dando a cualquier tecla del dispositivo móvil, de ahí que me generará una variable integer ( no entro en si es o no correcto ya que es una prueba ) para ir comenzando desde cero sobre el código que vi en internet.

Voy a tratar de montar nuevamente el circuito puesto que creo que la tiros van más por el fallo de los pines RX y TX.

Si se os ocurre algún motivo, por favor, comentarlo.

Muchas gracias por todo.

Un saludo.

El motivo es que tengas mal RX y TX o el módulo. Verifica que GND (masa) este compartida entre modulo y arduino. Bien alimentado con 5V?

Buenas,

He estado liado con esto toda la mañana y el resultado ha sido el mismo, adjunto tanto código cómo circuito con el que estoy trabajando ahora mismo.

Circuito:

Modulo que utilizo:

Código fuente:

 /*****************************************************************************************************************
   * TUTORIAL: http://seta43.blogspot.com.es/2014/09/arduino-android-buetooth-hc05-encender.html
   * AT+ROLE ( 0 : ESCLAVO ; 1 :MAESTRO )
   * AT+PRGL
   * AT+PSWD
   * AT+NAME
   * AT+UART
   * AT+CMODE
   * AT
   *****************************************************************************************************************/

#include <SoftwareSerial.h> //Librería que permite establecer comunicación serie en otros pins

//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(2,3); //2 RX, 3TX.

char entrada[100]="LedFelipe"; 
int contador;
boolean stringComplete = true;  

void setup() {
  pinMode(13, OUTPUT);
  for(contador=4;contador<=13;contador++)  pinMode(contador, OUTPUT);
  //BT.begin(38400); //Velocidad del puerto del módulo Bluetooth
  BT.begin(9600); //Velocidad del puerto del módulo Bluetooth para el modelo normal HC05
  Serial.begin(9600); //Abrimos la comunicación serie con el PC y establecemos velocidad
  digitalWrite(13, LOW);
}
  
void loop() {
  
  
  if(Serial.available()) {
        BT.println(BT.read());
        BT.write(Serial.read());
        
        while (BT.available()) {
          char inChar = (char)BT.read(); 
          entrada[contador]=inChar;  
          if (inChar == '\n')
              {
                stringComplete = true;
                entrada[contador]=0;
              } 
          contador++;
        }
       
        
        if (stringComplete) {    
          if(!strcmp(entrada,"0Dig13")){digitalWrite(13, LOW);  goto salto0;}
          if(!strcmp(entrada,"1Dig13")){digitalWrite(13, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig12")){digitalWrite(12, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig12")){digitalWrite(12, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig11")){digitalWrite(11, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig11")){digitalWrite(11, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig10")){digitalWrite(10, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig10")){digitalWrite(10, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig9")){digitalWrite(9, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig9")){digitalWrite(9, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig8")){digitalWrite(8, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig8")){digitalWrite(8, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig7")){digitalWrite(7, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig7")){digitalWrite(7, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig6")){digitalWrite(6, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig6")){digitalWrite(6, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig5")){digitalWrite(5, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig5")){digitalWrite(5, HIGH); goto salto0;}
          
          if(!strcmp(entrada,"0Dig4")){digitalWrite(4, LOW); goto salto0;}
          if(!strcmp(entrada,"1Dig4")){digitalWrite(4, HIGH); goto salto0;}
          
          BT.print(" Error->");
          Serial.print(" Error->");
          goto salto1;
      salto0:        
          BT.print(" OK->");
          Serial.print(" OK->");
      salto1:    
          BT.println(entrada);
          Serial.println(entrada);
          contador=0;
          stringComplete = false;
      }
    }
}

Programa Android para enviar mensajes por bluetooth:

Blueterm

Resultado:

Sigo sin poder leer los mensajes enviados desde el módulo HC-05. El resultado de “BT.read()” siempre es -1

¿Se os ocurre algo? Cómo última alternativa ¿Conocéis de algún manual sencillo para una toma de contacto con este módulo? Ninguno de los que he seguido hasta el momento me ha funcionado :frowning:

Descarto que estableciste contacto con el modulo BT no?

surbyte:
Descarto que estableciste contacto con el modulo BT no?

Sí de hecho, puedo hacer comunicación para configurar con comandos AT y he llegado a hacer que funcione la pulsación de tecla, es decir, que si pulso un botón en el móvil envié un -1 al programa, pero más allá de eso nada… y lo peor de todo es que el manejo del modulo debería ser trivial :’(

Buenos días,

Al fin he conseguido solucionarlo.

Motivo del error ( Siempre retorna -1 ): El problema residía en que estaba haciendo mal uso de la entrada/salida de Serial, por lo que lógicamente la lectura siempre era -1.

¿Cómo lo he detectado? Haciendo un debug a base de print hacia el serial del Arduino, adjunto código chorra:

  if (BT.available()>0) {
    /**************
     * PRINT DEBUG
    ***************/ 
    Serial.print("Estado Serial: ");
    Serial.println(Serial.available());
    Serial.print("Estado Serial Bluetooh: ");
    Serial.println(BT.available());
    
    
    /**************
     * PRINT DEBUG
     ***************/ 
    Serial.print("Estado Serial lectura: ");
    Serial.println(Serial.read());
    Serial.print("Estado Serial lectura Bluetooh: ");
    
    char result = (char)BT.read();
    Serial.println(result);
}

Destacar que también he detectado un problema que no había contemplado en ninguno de mis códigos y esta relacionada con la lectura del bluetooth. Debemos tener en cuenta que no podemos hacer dos invocaciones al método "Read()" en una mismo loop, es decir, en caso de realizar os invocaciones nos devolverá un segundo valor correspondiente al buffer, por lo que no será el carácter esperado.

Muchas gracias a todos por la ayuda.

Un saludo.