No recibo correctamente por BT HC-05

Vamos a ver si consigo explicarme, de un lado tengo un Nano Every con dos pulsadores y un HC-05 como transmisor, el codigo es el siguiente:

// Boceto básico de Bluetooth HC-05_03_9600
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "aa";
int subir_brazo = 9;
int bajar_brazo = 8;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Mando_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(subir_brazo, INPUT_PULLUP);
  pinMode(bajar_brazo, INPUT_PULLUP);
}

void loop()
{
  int up_brazo = digitalRead(subir_brazo);
  int down_brazo = digitalRead(bajar_brazo);

  if (up_brazo == LOW)
  {
    c = "sb";
    Serial.println("Pulsado el boton subir_brazo, c=" + c);
    BTserial.print(c);
    Serial.println("Enviado a BTserial, valor de c=" + c);
    c = "SB";
    Serial.println("Cambiado valor de c, c=" + c);
    Serial.println("");
    delay(300);
  }

  if (down_brazo == LOW)
  {
    c = "bb";
    Serial.println("Pulsado el boton bajar_brazo, valor de c=" + c);
    BTserial.print(c);
    Serial.println("Enviado a BTserial, valor de c=" + c);
    c = "BB";
    Serial.println("Cambiado valor de c, c=" + c);
    Serial.println("");
    delay(300);
  }


}

Y el resultado por el monitor serie es:

imagen

Como se puede ver el resultado es correcto, pulse el boton que pulse c siempre toma el valor correcto.


Ahora vamos al receptor, este está compuesto de un ATmega 2560, dos leds y un modulo HC-05, el codigo es:

// Boceto básico de Bluetooth HC-05_03_9600
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "aa";

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Receptor_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  if (BTserial.available())
  {
    c = BTserial.read();
    Serial.println("Recibido de BTserial, valor de c=" + c);
    if (c == "sb")
    {
      Serial.println("Entramos en el if de c==sb, valor de c=" + c);
      digitalWrite(LED_BUILTIN, HIGH);
      delay(200);
      digitalWrite(LED_BUILTIN, LOW);
      delay(200);
      c = "SB";
      Serial.println("Cambiado valor de c, c=" + c);
      Serial.println("");
    }

    if (c == "bb")
    {
      Serial.println("Entramos en el if de c==bb, valor de c=" + c);
      digitalWrite(8, HIGH);
      delay(500);
      digitalWrite(8, LOW);
      delay(500);
      c = "BB";
      Serial.println("Cambiado valor de c, c=" + c);
      Serial.println("");
    }
  }

}

Y el resultado por el monitor serie es:
imagen

Como se puede ver por por el monitor serie me saca el valor en la linea 44 del codigo pero no me salen los caracteres que yo he enviado incluso a veces aunque pulse el segundo pulsador me repite el valor del primero (marcado en rojo)

Y no entra en ninguno de los dos if ¿porque no me llegan las cadenas "sb" o"bb"

Un saludo

Bueno ya he avanzado un poco, ahora por cada pulsacion del boton recibo dos numeros pero separados, en el Mando he cambiado la linea

    BTserial.print(c);

por

    BTserial.println(c);

El resultado ahora en el receptor es:
imagen

pero no se como concatenarlos y pasarlos a ASCII

Dado que c es String, me parece que

c = BTserial.read();

que lee un solo caracter, debería ser

c = BTserial.readString();

Saludos

Gracias @anon90500195, el caso es que me habia repasado la libreria SoftwareSerial pero no aparece documentado readString() así que muchas gracias porque así lo he implemetado.

El resultado ha mejorado considerablemante pero aun tengo una pega, y es que con el codigo siguiente:

// Boceto básico de Bluetooth HC-05_03_9600
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
String s;
boolean nuevalinea = false;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Receptor_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 9600
  BTserial.begin(9600);
  Serial.println("BTserial iniciado a 9600");
  Serial.println("");
  Serial.println("");
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  while (BTserial.available() > 0)
  {
    s = BTserial.readString();
    Serial.println("Leido de BTserial, valor de s <" + s + ">");
//    if (s == "\r")
//      continue;
//    else if (s == "\n") {
//      nuevalinea = true;
//      break;
//    }
//    else
    c = c + s;
    Serial.println("Leido de BTserial, valor de s <" + s + ">");
    Serial.println("Leido total BTserial, valor de c <" + c + ">");
  }
  c = "";
//  nuevalinea = false;
//  if (nuevalinea) {
//    c = "";
//    nuevalinea = false;
//  }

  //  if (c == "sb")
  //  {
  //    Serial.println("Entramos en el if de c==sb, valor de c=" + c);
  //    digitalWrite(LED_BUILTIN, HIGH);
  //    delay(200);
  //    digitalWrite(LED_BUILTIN, LOW);
  //    delay(200);
  //    c = "SB";
  //    Serial.println("Cambiado valor de c, c=" + c);
  //    Serial.println("");
  //  }
  //
  //  if (c == "bb")
  //  {
  //    Serial.println("Entramos en el if de c==bb, valor de c=" + c);
  //    digitalWrite(8, HIGH);
  //    delay(200);
  //    digitalWrite(8, LOW);
  //    delay(200);
  //    c = "BB";
  //    Serial.println("Cambiado valor de c, c=" + c);
  //    Serial.println("");
  //  }
}

Obtengo el siguiente resultado:
imagen
Que como puedes ver de la primera lectura obtengo un "sb" y algo más porque me pasa a la linea siguiente el > y ademas deber de haber mas cosas porque el while le da otras dos pasadas, pero no consigo saber que son, lo he intentado interceptar con el codigo

//    if (s == "\r")
//      continue;
//    else if (s == "\n") {
//      nuevalinea = true;
//      break;
//    }
//    else

pero obtengo el mismo resultado, ¿como puedo ver que caracteres extras son esos? o alguna forma de decirle al while que lea solo los dos primeros caracteres.

Si cambias el código sobre la marcha haces que sea difícil ayudarte.

¿Por qué cambiaste if() por while()?
¿Por qué concatenas la entrada s con c si antes no lo hacías?

La única modificación que debías hacer era la que te marqué en el post anterior.

Por cierto, readString() se hereda de la clase Stream, aunque han olvidado documentarla, vale lo que explican en la documentación de Serial.

Saludos

Lo siento @gautul mi intencion no es entorpecer a nadie, no suelo quedarme de brazos cruzados sino que sigo buscando la solucion.

Cambie if() por while() pensando en que con el if() no detectaba correctamente lo que llegaba por BTserial y por eso lo cambie por while()
En el primer codigo no concatenaba nada me salian los numeros por separado, con el del post #5 ya al menos obtenia los dos caracteres juntos y no solo numeros por separado, y sí use lo que me dijiste

s = BTserial.readString();

por eso te daba las gracias en el mismo post #5, ya que al no estar documentada me era imposible conocerla, tambien he descubierto que BTserial.write(c) en el codigo del mando no compila aunque si esta documentado, cosas raras que pasan.

Por otro lado sigo sin identificar que caracter o caracteres son los que vienen detras aunque me imagino que es un CR pero no se como interceptarlo para que me quede la cadena limpia, asi que he optado por usar

  c = c.substring(0, 2);

Quedando el codigo así

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
String s;
boolean nuevalinea = false;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Receptor_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 9600");
  Serial.println("");
  Serial.println("");
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  while (BTserial.available() > 0)
  {
    s = BTserial.readString();
    //    if (s == "\r")
    //      continue;
    //    else if (s == "\n") {
    //      nuevalinea = true;
    //      break;
    //    }
    //    else
    c = c + s;
  c = c.substring(0, 2);
  Serial.println("c en limpio <" + c + ">");
  Serial.println("");
  }
  //  nuevalinea = false;
  //  if (nuevalinea) {
  //    c = "";
  //    nuevalinea = false;
  //  }

  if (c == "sb")
  {
    //    Serial.println("Entramos en el if de c==sb, valor de c=" + c);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
    //    delay(200);
    //    c = "SB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
  }

  if (c == "bb")
  {
    //    Serial.println("Entramos en el if de c==bb, valor de c=" + c);
    digitalWrite(8, HIGH);
    delay(200);
    digitalWrite(8, LOW);
    //    delay(200);
    //    c = "BB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
  }
  c = "";
}

Con el resultado esperado
imagen

Si esta documentada, cómo buscarlo es otro tema

Tienes razón, mi error ha sido buscar lo que soportaba la libreria <SoftwareSerial.h> sin saber que esta libreria podia heredar tambien todas las funciones de Serial , ¿es correcto?

Si, pero es difícil al comienzo entender como funciona todo.
Hay que ir familiarizándose y lleva tiempo y todo va ira contribuyendo a tu aprendizaje de Arduino y a su mundo tan particular.
Solo tómalo con tiempo y recuerda que todo esta ahi, solo hay que buscar y buscar.
Lo que preguntes ya fue respondido (casi siempre). El foro es una gran biblioteca de problemas y soluciones.

Gracias por tus consejos.

Ya he avanzado algo mas en los codigos del transmisor y del receptor, el transmisor lo tengo asi ahora mismo

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
int subir_brazo = 9;
int bajar_brazo = 8;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Mando_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(subir_brazo, INPUT_PULLUP);
  pinMode(bajar_brazo, INPUT_PULLUP);
}

void loop()
{
  int up_brazo = digitalRead(subir_brazo);
  int down_brazo = digitalRead(bajar_brazo);

  if (up_brazo == LOW)
  {
    c = "sb";
    c = c.substring(0, 2);
    //    Serial.println("Pulsado el boton subir_brazo, c=" + c);
    BTserial.print(c);
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "SB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    delay(30);
  }

  if (down_brazo == LOW)
  {
    c = "bb";
    //    Serial.println("Pulsado el boton bajar_brazo, valor de c=" + c);
    BTserial.print(c);
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "BB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    delay(30);
  }


}

Y el del receptor asi:

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
String s;
boolean nuevalinea = false;
String loncad;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Receptor_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 9600");
  Serial.println("");
  Serial.println("");
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  while (BTserial.available())
  {
    s = BTserial.readString();
    //    s = BTserial.readString().substring(0, 2);
    loncad = s.length();
    Serial.println("Longitud de s=" + loncad);
    //    if (s == "\r")
    //      continue;
    //    else if (s == "\n") {
    //      nuevalinea = true;
    //      break;
    //    }
    //    else
    //    c = c + s;
    //    Serial.println("Lo que contiene c <" + c + ">");
    //    c = c.substring(0, 2);
    c = s.substring(0, 2);
    Serial.println("Lo que vale s <" + s + ">");
    Serial.println("c en limpio <" + c + ">");
    Serial.println("");
  }
  //  nuevalinea = false;
  //  if (nuevalinea) {
  //    c = "";
  //    nuevalinea = false;
  //  }

  if (c == "sb")
  {
    //    Serial.println("Entramos en el if de c==sb, valor de c=" + c);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
    //    delay(100);
    //    c = "SB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
  }

  if (c == "bb")
  {
    //    Serial.println("Entramos en el if de c==bb, valor de c=" + c);
    digitalWrite(8, HIGH);
    delay(100);
    digitalWrite(8, LOW);
    //    delay(200);
    //    c = "BB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
  }
  c = "";
}

Y en el receptor obtengo el siguiente resultado
imagen
Como se puede observar apenas toco el pulsador y recibo una ristra de caracteres (y eso que el transmisor tengo un delay(30)

Y tengo algunas pegas:

  • Una que no se transmite nada mientras que no suelte el pulsador cosa que no quiero, quiero que se transmita inmediatamente.
  • Que mientras mantenga el pulsador siga transmitiendo.
  • Que el receptor acepte todos los "sb" u "bb" y los procese inmediatamente
  • Por otro lado veo que tarda mucho desde que pulso hasta que se enciende el led (aproximadamente 1 seg.)

¿Porque? pues porque aunque ahora estoy probando con en led (para comprobar que la transmision y recepcion son efectivas) en su lugar ira servo y necesito movimiento constante mientras mantengo el pulsador presionado, tal y como funciona si el servo y el pulsador estan en la misma placa.

Prueba poniendo

BTserial.flush();

antes del delay().

Recuerda que los datos los está enviando a la placa bluetooth y ésta los envía al receptor, deberías investigar que tan "instantánea" es la transmisión (recurre a la hoja de datos).

Los demás puntos puede que se solucionen si flush() es la respuesta al problema.

El while() en la recepción particularmente no me gusta, pero primero prueba lo que te sugerí.

Saludos

En lugar de eso haz esto

// Agrega up_brazoAnt en el mismo sitio que tienes up_brazo e igualala a LOW 
static int up_brazoAnt = LOW;
// debo agregar el static porque la has definido en el loop y no como global.

 if (up_brazo == LOW && up_brazoAnt == HIGH) {
    c = "sb";
    c = c.substring(0, 2);
    //    Serial.println("Pulsado el boton subir_brazo, c=" + c);
    BTserial.print(c);
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "SB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    delay(30);
  }
  up_brazoAnt = up_brazo;

Se te olvidó este detalle.

Así, detectando el flanco, solo envía al pulsar, no repite.

Saludos

Gracias a ambos por vuestra ayuda, en cuanto pueda pruebo vuestros consejos y os comento.

Pero antes no me queda más remedio que coger todas las funciones que admite serial, traducirlas y empaparmelas porque son bastantes y desconozco la mayoria, y en algunas de estas puede estar la solución.

Un saludo

No gastes energía en eso, no te servirán hasta donde yo se.

Esto no cambia nada, sigue igual, en cuanto a la hoja de datos he mirado varias y en ninguna viene dato alguno sobre latencia y volvere a ponerlo con if

Con este cambio recibo una sola cadena aunque aleatoriamente recibo dos cadenas y si lo mantengo pulsado no envia nada hasta que lo suelto.

Ahora mismo lo veo bien, con filtrar en la recepcion, pero no veo como conseguir que empieze a transmitir nada mas pulsar y que no se quede esperando a que suelte y en el receptor que se mantenga en UP mientras este recibiendo la cadena.

Se me ocurre que como puedo leer la longitud de la cadena recibida pues hacerlo con for = loncad

He probado con for = loncad en los dos botones.

En el que puse el codigo para el transmisor, up_brazo

el for del receptor termina rapido porque solo recibe dos caracteres y apenas le da tiempo a encenderse el led.

En el otro boton down_brazo no implemente el codigo de @Surbyte en el transmisor, pero si el for en el receptor, para ver la diferencia y dependiendo del tiempo que mantengo el boton pulsado el led permance encendido proporcionalmente al tiempo que mantengo pulsado down_brazo.

Pero siguo teniendo el mismo problema de que no empieza a transmitir o no da por terminada la recepcion hasta que suelto el boton y sigo teniendo un retraso de 1seg desde que suelto cualquier boton hasta que se enciende el led correspondiente.

Codigo Transmisor:

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
int subir_brazo = 9;
int bajar_brazo = 8;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Mando_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(subir_brazo, INPUT_PULLUP);
  pinMode(bajar_brazo, INPUT_PULLUP);
}

void loop()
{
  int up_brazo = digitalRead(subir_brazo);
  int down_brazo = digitalRead(bajar_brazo);
  static int up_brazoAnt = LOW;

  //  if (up_brazo == LOW)
  if (up_brazo == LOW && up_brazoAnt == HIGH)
  {
    c = "sb";
    //    c = c.substring(0, 2);
    //    Serial.println("Pulsado el boton subir_brazo, c=" + c);
    Serial.println("Mandando");
    BTserial.print(c);
    Serial.println("Mandado");
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "SB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    //    delay(30);
  }
  up_brazoAnt = up_brazo;

  if (down_brazo == LOW)
  {
    c = "bb";
    //    Serial.println("Pulsado el boton bajar_brazo, valor de c=" + c);
    Serial.println("Mandando");
    BTserial.print(c);
    Serial.println("Mandado");
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "BB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    delay(30);
  }


}

Codigo del Receptor:

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
String s;
//boolean nuevalinea = false;
String loncad;
int l;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Receptor_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(38400);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop()
{
  //  while (BTserial.available())
  if (BTserial.available())
  {
    s = BTserial.readString();
    //    s = BTserial.readString().substring(0, 2);
    loncad = s.length();
    l = loncad.toInt();
    Serial.println("Longitud de s=" + loncad);

    //    if (s == "\r")
    //      continue;
    //    else if (s == "\n") {
    //      nuevalinea = true;
    //      break;
    //    }
    //    else
    //    c = c + s;
    //    Serial.println("Lo que contiene c <" + c + ">");
    //    c = c.substring(0, 2);
    c = s.substring(0, 2);
    Serial.println("Lo que vale s <" + s + ">");
    Serial.println("c en limpio <" + c + ">");
    Serial.println("");
  }
  //  nuevalinea = false;
  //  if (nuevalinea) {
  //    c = "";
  //    nuevalinea = false;
  //  }

  if (c == "sb")
  {
    Serial.println("Entrando en el if = sb");
    for (int i = l; i > 0; i = i - 1) {
      Serial.println("Entrando en el for");
      Serial.println(i);
      //      delay(100);  // este delay es para que me de tiempo ver por el monitor serie
      //    Serial.println("Entramos en el if de c==bb, valor de c=" + c);

      //    Serial.println("Entramos en el if de c==sb, valor de c=" + c);
      digitalWrite(9, HIGH);
      //      delay(300);
      digitalWrite(9, LOW);
      //    delay(100);
      //    c = "SB";
      //    Serial.println("Cambiado valor de c, c=" + c);
      //    Serial.println("");
    }
    digitalWrite(8, LOW);
    c == "";
  }

  if (c == "bb")
  {
    Serial.println("Entrando en el if = sb");
    for (int i = l; i > 0; i = i - 1) {
      Serial.println("Entrando en el for");
      Serial.println(i);
      //      delay(100);  // este delay es para que me de tiempo ver por el monitor serie
      //    Serial.println("Entramos en el if de c==bb, valor de c=" + c);
      digitalWrite(8, HIGH);
      //    delay(200);
      //    c = "BB";
      //    Serial.println("Cambiado valor de c, c=" + c);
      //    Serial.println("");
    }
    digitalWrite(8, LOW);
  }
  c = "";
}

Ahora mismo lo quiero solucionar si o si es el tiempo de retardo porque con ese tiempo no es viable para lo que quiero hacer, incluso he puesto los modulos HC05 de 38400 a 115200 y tarda exactamente lo mismo, asi que si no consigo rebajar ese tiempo sustancialmente me estoy planteando pasarme a algun modulo del tipo NRF24L01, estoy abierto a cualquier sugerencia.

Prueba agregando

BTserial.setTimeout(200);

luego de

BTserial.begin(38400);

Si funciona como creo, debería reducir la demora a 200 ms.

Saludos

Gracias @anon90500195, he estado liado y en cuanto pueda lo pruebo y te comento.

Bueno pues con los dedos cruzados lo he probado y digo con los dedos cruzados porque la libreria <SoftwareSerial.h> no hereda todo, de hecho al principio lo hacia con

'BTserial.write(c);'

y me tiraba el error

no matching function for call to 'SoftwareSerial::write(String&)'

he probado

Y funcionaaaaaaa, al menos con con los leds de prueba, luego ya veremos como ajusto

BTserial.setTimeout(200);

para que haga lo mismo con los servos, de todas maneras he realizado varias pruebas con diferentes tiempos con los siguientes resultados:

  • (200) -> ≈ 250 milisegundos
  • (100) -> ≈ 170 milisegundos
  • (50) -> ≈ 250 milisegundos
  • (10) -> ≈ 16 milisegundos
  • (1) -> ≈ 1 milisegundos

La medicion de tiempos la he realizado con dos instancias al IDE y comparando los tiempos que me daban los dos monitores serie por lo que es algo muy aproximado pero no exacto.

imagen

De momento lo he dejado con

BTserial.setTimeout(1);

Ahora vienen días de fiestas así que seguramente tardare en decir algo con respecto a los resultados reales con los servos, los codigos han quedado así:

Transmisor

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
int subir_brazo = 9;
int bajar_brazo = 8;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Mando_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(115200);
  BTserial.setTimeout(1);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(subir_brazo, INPUT_PULLUP);
  pinMode(bajar_brazo, INPUT_PULLUP);
}

void loop()
{
  int up_brazo = digitalRead(subir_brazo);
  int down_brazo = digitalRead(bajar_brazo);
  //  static int up_brazoAnt = LOW;
  //  static int down_brazoAnt = LOW;

  if (up_brazo == LOW)
    //  if (up_brazo == LOW && up_brazoAnt == HIGH)
  {
    c = "sb";
    //    c = c.substring(0, 2);
    //    Serial.println("Pulsado el boton subir_brazo, c=" + c);
    Serial.println("Mandando");
    BTserial.print(c);
    Serial.println("Mandado");
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "SB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    //    delay(30);
  }
  //  up_brazoAnt = up_brazo;

  if (down_brazo == LOW)
    //  if (down_brazo == LOW && down_brazoAnt == HIGH)
  {
    c = "bb";
    //    Serial.println("Pulsado el boton bajar_brazo, valor de c=" + c);
    Serial.println("Mandando");
    BTserial.print(c);
    Serial.println("Mandado");
    //    Serial.println("Enviado a BTserial, valor de c=" + c);
    //    c = "BB";
    //    Serial.println("Cambiado valor de c, c=" + c);
    //    Serial.println("");
    //    delay(30);
  }
  //  down_brazoAnt = down_brazo;

}

Receptor

// Boceto básico de Bluetooth HC-05_03_38400
// Conecte el módulo HC-05 y comunícate mediante el monitor serie
//
// El HC-05 tiene por defecto el modo de conmincación cuando se enciende por primera vez.
// Necesita ser colocado en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
//
//
//  Pins
//  BT VCC a Arduino 5V
//  BT GND a GND
//  BT RX a Arduino pin 11 (a traves de un divisor de voltaje)
//  BT TX a Arduino pin 10 (no necesita divisor de voltaje)


#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Conecte el HC-05 TX al pin Arduino 10 RX.
// Conecte el HC-05 RX al pin Arduino 11 TX a través de un divisor de voltaje.

String c = "";
String s;
//boolean nuevalinea = false;
String loncad;
int l;

void setup()
{
  // Iniciar la comunicación serie con el equipo host
  Serial.begin(9600);
  Serial.println("Sketch: Receptor_BT_Grua_1");
  Serial.println("Arduino con HC-05 está listo");

  // iniciar la comunicación con el HC-05 usando 38400
  BTserial.begin(115200);
  BTserial.setTimeout(1);
  Serial.println("BTserial iniciado a 38400");
  Serial.println("");
  Serial.println("");
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop()
{
  //  while (BTserial.available())
  if (BTserial.available())
  {
    s = BTserial.readString();
    //    s = BTserial.readString().substring(0, 2);
    loncad = s.length();
    l = loncad.toInt();
    Serial.println("Longitud de s=" + loncad);

    //    if (s == "\r")
    //      continue;
    //    else if (s == "\n") {
    //      nuevalinea = true;
    //      break;
    //    }
    //    else
    //    c = c + s;
    //    Serial.println("Lo que contiene c <" + c + ">");
    //    c = c.substring(0, 2);
    c = s.substring(0, 2);
    Serial.println("Lo que vale s <" + s + ">");
    Serial.println("c en limpio <" + c + ">");
    Serial.println("");
  }
  //  nuevalinea = false;
  //  if (nuevalinea) {
  //    c = "";
  //    nuevalinea = false;
  //  }

  if (c == "sb")
  {
    Serial.println("Entrando en el if = sb");
    for (int i = l; i > 0; i = i - 1) {
      Serial.println("Entrando en el for de Subir Brazo");
      Serial.println(i);
      //    delay(100);  // este delay es para que me de tiempo ver por el monitor serie
      //    Serial.println("Entramos en el if de c==sb, valor de c=" + c);
      digitalWrite(9, HIGH);
      delay(200);
      digitalWrite(9, LOW);
      //    delay(100);
      //    c = "SB";
      //    Serial.println("Cambiado valor de c, c=" + c);
      //    Serial.println("");
    }
    digitalWrite(8, LOW);
    c == "";
  }

  if (c == "bb")
  {
    Serial.println("Entrando en el if = bb");
    for (int i = l; i > 0; i = i - 1) {
      Serial.println("Entrando en el for de Bajar Brazo");
      Serial.println(i);
      //    delay(100);  // este delay es para que me de tiempo ver por el monitor serie
      //    Serial.println("Entramos en el if de c==bb, valor de c=" + c);
      digitalWrite(8, HIGH);
      delay(200);
      digitalWrite(8, LOW);
      //    delay(100);
      //    c = "BB";
      //    Serial.println("Cambiado valor de c, c=" + c);
      //    Serial.println("");
    }
  }
  c = "";
}

Y de camino desearos un Feliz Fin de Año y una mejor entrada de 2022

PD. Una duda, si yo configuro el BT con 115200,0,2 (115200 baudios, 1 bit de parada, paridad par) cuando en el boceto llamo a

BTserial.begin(115200);

a secas el puero creado con

¿Arduino toma los con que he configurado el BT a 115200,0,2 o toma algun otro valor por defecto, por ejemplo 115200,0,0?