Bt hc-06 hc-06-20190901

Hola a todos.

Tengo un proyecto que usa los HC-06 a una velocidad diferente a la de origen de esos modulos que es 9600, los cambio a 38400. Hasta ahora he funcionado sin problemas.

Dependiendo que version tenga e BT uso diferentes codigos y comandos AT para cambiar la velocidad.

Ultimamente todos los HC-06 que me llegan vienen con la version HC-06-20190901 y no encuentro la manera de poder setear la nueva velocidad con exito.

Alguien tiene experiencia con esta version de HC-06???

Gracias.

Hola @cas6678 te encontré algo que pueda ayudar

esta en alemán.
La traducción de Google a español da esto:

Recientemente recibí un nuevo lote de módulos HC-06.
Estos tienen la versión HC-06-20190901.
Hasta ahora, muy mal.

Hasta ahora he podido identificar tres tipos diferentes de módulos BT con relativa facilidad:

Retraso de AT + 1s
AT + nueva línea
AT + Newline & Baudchange con "AT + UART = 57600,0,0" (Bluetooth LE)
Para este propósito, construí una "detección" simple que pasa por todas las velocidades en baudios en un bucle y escucha para ver si algo regresa a "AT".
Una vez con un salto de línea, una vez con retraso (1000).
Luego, consígame la versión del módulo y cambie la velocidad en baudios, si es necesario.

Eso requirió algunas pruebas antes de que el método funcionara bastante bien. ¡Hasta este módulo mencionado anteriormente!

Parece que toma más de un segundo después de que el voltaje está encendido para que responda.
Un comando AT no se reconoce después de un segundo, sino después de aproximadamente 1200 ms.
Pero no siempre: see_no_evil:

Cuando reviso las velocidades en baudios, tengo que esperar unos 2 segundos después de un intento fallido para que el módulo vacíe el búfer.
Pero incluso aquí es como un juego de ruleta, funcione o no.
Incluso si agrego retrasos a mi boceto en un área grande, el módulo no se reconoce correctamente.
Desafortunadamente, el objetivo del ejercicio no puede ser que el inicio tarde varios segundos. Si un dispositivo se conecta al módulo mientras tanto, los comandos AT terminan allí. Para ser tolerado en la primera detección, pero no en todos los comienzos.

Incluso después de que cambié la velocidad en baudios manualmente y quemé la versión correcta en la EEPROM de mi Arduino, existe una probabilidad de 50-50 de una reacción a un AT.
-> Probado con diferentes módulos, directamente en un Nano y en su propia placa con ATMega328. ¡Se tienen en cuenta los 3.3V en RX & TX!

Por supuesto, ordené 10 de ellos de inmediato: roll_eyes:

¿Alguien ha experimentado con un comportamiento tan obstinado o incluso esta versión?
HC-06-20190901

PD: todavía tengo una versión anterior de la función de detección aquí. Tengo que actualizarlo: músculo: t2:
*¡Puede que ya haya encontrado la solución al acertijo!

Al probar la velocidad en baudios correcta, estoy destruyendo el búfer del HC-06 por completo.
Los otros módulos, obviamente, parecen vaciar el búfer en modo AT después de aproximadamente 1 segundo si no hay nada decente, pero esto no es así.

¡Así que "sólo" tengo que llenar menos el búfer!
Si simplemente cambio la prueba de baudios 4800 -> 115200 al revés, ¡parece funcionar!*

long BtFindCurrentBaud() {
  static const long rates[] = { 4800, 9600, 19200, 38400, 57600, 115200 };
  uint8_t numRates = sizeof(rates) / sizeof(long);  //6
  //for (int rn = 0; rn < numRates; rn++) {
  for (int rn = numRates-1; rn >= 0 ; rn--) {
    BT.begin(rates[rn]);        
    delay(200);
    PrintBtAt();
    BT.flush();
    if (btVersion >= 3)
      delay(100);
    else
      delay(BT_Cmd_Delay);  //No Linefeed, but 1Sec idle

    if (BtDataAvailable())
      return rates[rn];
  }
  return 0L;
}

void PrintBtAt() {
  if (btVersion >= 3)
    BT.println(F("AT"));
  else
    BT.print(F("AT"));  
}

bool BtDataAvailable() {
  if (BT.available()) {
    //Read what´s on the buffer
    while (BT.available())
      BT.read();
    return true;
  }
  return false;
}

Obviamente, no llega nada debido a las altas velocidades en baudios y, por lo tanto, el búfer permanece al menos algo vacío.
Ahora es el momento de probar mis otros módulos BT, si no son alérgicos a esta adaptación ..
*Qué violín ...

Afortunadamente, los otros módulos HC-06 no quedaron impresionados por la adaptación.
Actualmente funciona con las siguientes versiones:*

Etiquetado AT+Version Salto de línea AT-Delay
ohne HC-06-20190901 Nein ~1200
FC-114 hc01.comV2 Nein 1000
1744 VERSION:3.0-20170609 Ja 0
ZS-40 Firmware V3.0.6,Bluetooth V4.0 LE Ja 0
ZS-040 DX_smartv2.0 Nein 1000

*Sin embargo, debe esperar unos buenos 1-2 segundos para el módulo mencionado en primer lugar al comenzar.
Luego, el reconocimiento se ejecuta primero con un salto de línea y luego sin él.
Comenzando con la tasa de baudios más alta posible. Después de BT.begin () espero 200ms.
Actualmente espero 2 segundos entre los comandos AT antes de verificar una reacción.

Por lo tanto, todo lleva mucho tiempo la primera vez que se usa, pero como ocurre después de que se quema el FW, no es crítico el tiempo.
Se ve diferente con el inicio normal, donde tengo que esperar al menos 2 segundos hasta que el módulo BT se haya "calentado".
Luego, la seguridad verifica si la velocidad en baudios + la versión coinciden y espera otros 2 segundos para la respuesta ...
Después de una cuidadosa consideración, ¡esto es superfluo! Tan pronto como la versión de Bluetooth esté en la EEPROM! = 0xff, ¡todo debería encajar! También dispara y olvida: muecas:
Por supuesto, si algo falla durante la inicialización, la versión debe configurarse internamente en 0xff una y otra vez hasta que funcione.

Quizás ayude a alguien.*

Bueno si te sirve @cas6678 creo que debes traductor mediante darle las gracias porque lo merece.

El alemán @TriB ha hecho una actualización en su repositorio Github

#include <SoftwareSerial.h>

#define BT_Baud 57600
#define BT_BaudFallback 9600
#define BT_Cmd_Delay 2000 //1000 is okay, until HC-06-20190901

SoftwareSerial BT(8, 7);
long baud = 0;
uint8_t btVersion = 0xFF;

void setup() {
  Serial.begin(115200);
  InitializeBluetooth();
}

void loop() {
  bool received;
  while (BT.available()) {
    Serial.write(BT.read());
    received = true;
  }

  if (received) {
    received = false;
    Serial.println();
  }

  while (Serial.available())
  {
    char c = Serial.read();
    BT.write(c);
  }
}

void InitializeBluetooth() {
  GetBtVersion();
  //Uninitialized
  if (btVersion == 0xFF)
    FindBtModule();

  //Clear outgoing buffer
  BT.flush();
  //Clear incoming buffer
  BtDataAvailable();
}

bool FindBtModule() {
  Serial.println(F("BT Init"));
  delay(BT_Cmd_Delay);
  //First try with CarriageReturn/Linefeed. Otherwise the buffer might be filled with previous value
  btVersion = 3;
  baud = BtFindCurrentBaud();

  //Change Version to use delay(1000) without linebreak
  if (baud == 0L) {
    btVersion = 0;
    baud = BtFindCurrentBaud();
  }

  //Nothing found
  if (baud == 0L) {
    //Reset Version to uninitialized
    btVersion = 0xff;
    baud = BT_BaudFallback;
    //Try  with default value
    BT.begin(baud);
    Serial.println(F("BaudNotFound"));
    return false;
  }

  //Get Version to use lineend or delay
  if (BtGetVersion())
    SetBtVersion();

  //Clear incoming Buffer
  BtDataAvailable();

  //Baud not 57000
  if (baud != BT_Baud)
    if (!ChangeBtBaud()) {
      Serial.println(F("BaudNotChanged"));
      //Stay with found baud or default value
      if (baud == 0L)
        baud = BT_BaudFallback;
      BT.begin(baud);
      return false;
    }
  baud = BT_Baud;
  BT.begin(baud);
  return true;
}

long BtFindCurrentBaud() {
  static const long rates[] = { 4800, 9600, 19200, 38400, 57600, 115200 };
  uint8_t numRates = sizeof(rates) / sizeof(long);  //6
  //start with highest baud, to not buffer crap into HC-06
  //for (int rn = 0; rn < numRates; rn++) {
  for (int rn = numRates - 1; rn >= 0 ; rn--) {
    BT.begin(rates[rn]);
    BtDataAvailable();
    delay(200);
    PrintBtAt();
    BT.flush();
    if (btVersion >= 3)
      delay(100);
    else
      delay(BT_Cmd_Delay);  //No Linefeed, but 1Sec idle

    if (BtDataAvailable())
      return rates[rn];
  }
  return 0L;
}

// AT+BAUD<X> -> OK<X>
// X=4 : 9600bps (Default)
// X=6 : 38400bps
// X=7 : 57600bps
// X=8 : 115200bps
bool ChangeBtBaud() {
  Serial.println(F("BT ChangeBaud"));
  if (btVersion < 3)
    BT.print(F("AT+BAUD7"));
  if (btVersion == 3)
    BT.println(F("AT+UART=57600,0,0"));
  if (btVersion > 3)
    BT.println(F("AT+BAUD7"));
  delay(BT_Cmd_Delay);
  return BtDataAvailable();
}

void PrintBtAt() {
  if (btVersion >= 3)
    BT.println(F("AT"));
  else
    BT.print(F("AT"));
}

bool BtDataAvailable() {
  if (BT.available()) {
    //Read what´s on the buffer
    while (BT.available())
      BT.read();
    return true;
  }
  return false;
}

bool BtGetVersion() {
  if (btVersion != 0xFF)
    return BtGetVersion(btVersion >= 3);

  if (BtGetVersion(true))
    return true;
  delay(BT_Cmd_Delay);
  return BtGetVersion(false);
}

bool BtGetVersion(bool linebreak) {
  BT.print(F("AT+VERSION"));
  if (linebreak) {
    BT.println();
    delay(200);
  }
  else
    delay(BT_Cmd_Delay);
  char input[40];
  uint8_t j = 0;
  while (BT.available()) {
    if (j < sizeof(input))
      input[j++] = BT.read();
    else
      BT.read();

    //0 HC-06-20190901
    //1 ZS-040 (DX_smartv2.0)
    //2 FC-114 (hc01.comV2)
    //3 1744  (VERSION:3.0-20170609)
    //4 ZS-40 (Firmware V3.0.6,Bluetooth V4.0 LE)
    //4 BT05 (+VERSION=Firmware V3.0.6,Bluetooth V4.0 LE)

    if (input[0] == 'O' && input[1] == 'K') {
      btVersion = 1;
      return true;
    }
    if (input[0] == 'D' && input[1] == 'X') {
      btVersion = 1;
      return true;
    }
    if (input[8] == 'V' && input[9] == '2') {
      btVersion = 2;
      return true;
    }
    if (input[0] == 'H' && input[1] == 'C') {
      btVersion = 0;
      return true;
    }
    if (input[8] == '3' && input[10] == '0') {
      btVersion = 3;
      return true;
    }
    if (input[10] == '3' && input[27] == '4') {
      btVersion = 4;
      return true;
    }
    if (input[19] == '3' && input[36] == '4') {
      btVersion = 4;
      return true;
    }
  }
  if (j > sizeof(input) - 1)
    j = sizeof(input) - 1;
  input[j] = '\0';

  Serial.println(F("VersionNotFound"));
  return false;
}

void GetBtVersion() {
  //ToDo: get version from EEPROM
}
void SetBtVersion() {
  //ToDo: store version to EEPROM
}

Te saluda y dice que es un copy & paste de su código y que tienes que usarlo tal como esta. El código compila y espera que te sirva.
El código encuentra la versión en uso, la velocidad de comunicación, etc, etc.
Creo que deberías probarlo @cas6678 .