Bluetooth Reconect bei HC-05

Hallo zusammen,

nach und nach läuft mein System. Ich habe nun nur noch einen großen offen Punkt. Den Reconnect bei Verbindungsabbruch.

Folgende Ausgangslage habe ich:

Ein Arduino mit HC-05 Bluetooth (Grove Serial Bluetooth) in einem stationären Gerät. Es wird permanent mit Strom versorgt, solange es eingeschaltet ist.
Ein Bedienteil welches über Akku versorgt wird. Es ist ein Arduino Mega mit HC-05 Bluetooth.

Ich habe die beiden Geräte soweit, dass Sie sich verbinden und ein Lebensignal (alle drei Sekunden) senden. Nun möchte ich, dass wenn das Signal 60 Sekunden nicht kommt ein Reconnect bei beiden Geräten eingeleitet wird.

Die Einleitung als solches nach 60 Sekunden ist kein Problem. Das Problem habe ich mit dem Reconnect. Ein einfaches Rücksetzen zum BluetoothSetup geht zwar, aber es kommt keine Verbindung zustande.

Ich verwende für den Start des BT im Master (sprich Bedienteil) folgenden Code

void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=1\r\n");//set the bluetooth work in master mode
  blueToothSerial.print("\r\n+STNA=SeeedBTMaster\r\n");//set the bluetooth name as "SeeedBTMaster"
  blueToothSerial.print("\r\n+STPIN=0000\r\n");//Set Master pincode"0000",it must be same as Slave pincode
  blueToothSerial.print("\r\n+STAUTO=0\r\n");// Auto-connection is forbidden here
  delay(2000); // This delay is required.
  blueToothSerial.flush();
  blueToothSerial.print("\r\n+INQ=1\r\n");//make the master inquire
  Serial.println("Master is inquiring!");
  delay(2000); // This delay is required.

  //find the target slave
  char recvChar;
  while(1){
    if(blueToothSerial.available()){
      recvChar = blueToothSerial.read();
      recvBuf += recvChar;
      nameIndex = recvBuf.indexOf(slaveName);//get the position of slave name
      //nameIndex -= 1;//decrease the ';' in front of the slave name, to get the position of the end of the slave address
      if ( nameIndex != -1 ){
        //Serial.print(recvBuf);
        addrIndex = (recvBuf.indexOf(retSymb,(nameIndex - retSymb.length()- 18) ) + retSymb.length());//get the start position of slave address	 		
        slaveAddr = recvBuf.substring(addrIndex, nameIndex);//get the string of slave address 			
        break;
      }
    }
  }
  //form the full connection command
  connectCmd += slaveAddr;
  connectCmd += "\r\n";
  int connectOK = 0;
  Serial.print("Connecting to slave:");
  Serial.print(slaveAddr);
  Serial.println(slaveName);
  //connecting the slave till they are connected
  do{
    blueToothSerial.print(connectCmd);//send connection command
    recvBuf = "";
    while(1){
      if(blueToothSerial.available()){
        recvChar = blueToothSerial.read();
        recvBuf += recvChar;
        if(recvBuf.indexOf("CONNECT:OK") != -1){
          connectOK = 1;
          Serial.println("Connected!");
          blueToothSerial.print("Connected!");
          break;
        }
        else if(recvBuf.indexOf("CONNECT:FAIL") != -1){
          Serial.println("Connect again!");
          break;
        }
      }
    }
  }
  while(0 == connectOK);
}


void BluetoothWork()
{
  char recvChar;
  //while(1){
  if(blueToothSerial.available()){//check if there's any data sent from the remote bluetooth shield
    //recvChar = blueToothSerial.read();
    //Serial.print(recvChar);
    BTAuswertung();
  }
  if(Serial.available()){//check if there's any data sent from the local serial terminal, you can add the other applications here
    recvChar  = Serial.read();
    blueToothSerial.print(recvChar);
    //}	
  } 
}

Für den Slave verwende ich das hier

void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  blueToothSerial.print("\r\n+STPIN=0000\r\n");//Set SLAVE pincode"0000"
  blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable 
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  blueToothSerial.flush();
}

void BTWork()
{
  char recvChar;
  //recvChar = blueToothSerial.read();
  if(blueToothSerial.available())
  {
    BTAuswertung();
  }
  if(Serial.available())
  {//check if there's any data sent from the local serial terminal, you can add the other applications here
    recvChar  = Serial.read();
    blueToothSerial.print(recvChar);
  }
}

Ich habe bislang versucht

setupBlueToothConnection()

und das hier im Master um zu Verbinden, wenn der Slave im Einladungsmodus ist

    {
      char recvChar;
      //setupBlueToothConnection();
      int connectOK = 0;
      do{
        blueToothSerial.print("\r\n+CONN=0,13,EF,0,7,5C;SeeedBTSlave\r\n");//send connection command
        recvBuf = "";
        while(1){
          if(blueToothSerial.available()){
            recvChar = blueToothSerial.read();
            recvBuf += recvChar;
            if(recvBuf.indexOf("CONNECT:OK") != -1){
              connectOK = 1;
              Serial.println("Connected!");
              blueToothSerial.print("Connected!");
              break;
            }
            else if(recvBuf.indexOf("CONNECT:FAIL") != -1){
              Serial.println("Connect again!");
              break;
            }
          }
        }
      }
      while(0 == connectOK);
      TimeoutCount = 0;
    }

Beides war nicht von Erfolg gekrönnt. Was muss ich dahinschreiben?

Welche Bibliothek verwendest Du? bitte Link.
Grüße Uwe

Hallo Uwe,

ich verwende die hier angegebene Bibliothek.

Den Slave bekomme ich inzwischen auch am Master angemeldet bei Verbindungsverlust. Dazu habe ich in beiden Sketchen die folgenden Änderungen vorgenommen.

  • Autoreconnect bei Signalverlust eingefügt in der Methode setupBlueToothConnection()
    blueToothSerial.print("\r\n+LOSSRECONN=1\r\n"); // autoreconnect after power off 
void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=1\r\n");//set the bluetooth work in master mode
  blueToothSerial.print("\r\n+STNA=SeeedBTMaster\r\n");//set the bluetooth name as "SeeedBTMaster"
  blueToothSerial.print("\r\n+STPIN=0000\r\n");//Set Master pincode"0000",it must be same as Slave pincode
  blueToothSerial.print("\r\n+STAUTO=0\r\n");// Auto-connection is forbidden here
  blueToothSerial.print("\r\n+LOSSRECONN=1\r\n"); // autoreconnect after power off  
  delay(2000); // This delay is required.
  blueToothSerial.flush();
  blueToothSerial.print("\r\n+INQ=1\r\n");//make the master inquire
  Serial.println("Master is inquiring!");
  delay(2000); // This delay is required.

  //find the target slave
  char recvChar;
  while(1){
    if(blueToothSerial.available()){
      recvChar = blueToothSerial.read();
      recvBuf += recvChar;
      nameIndex = recvBuf.indexOf(slaveName);//get the position of slave name
      //nameIndex -= 1;//decrease the ';' in front of the slave name, to get the position of the end of the slave address
      if ( nameIndex != -1 ){
        //Serial.print(recvBuf);
        addrIndex = (recvBuf.indexOf(retSymb,(nameIndex - retSymb.length()- 18) ) + retSymb.length());//get the start position of slave address	 		
        slaveAddr = recvBuf.substring(addrIndex, nameIndex);//get the string of slave address 			
        break;
      }
    }
  }
  //form the full connection command
  connectCmd += slaveAddr;
  connectCmd += "\r\n";
  int connectOK = 0;
  Serial.print("Connecting to slave:");
  Serial.print(slaveAddr);
  Serial.println(slaveName);
  //connecting the slave till they are connected
  do{
    blueToothSerial.print(connectCmd);//send connection command
    recvBuf = "";
    while(1){
      if(blueToothSerial.available()){
        recvChar = blueToothSerial.read();
        recvBuf += recvChar;
        if(recvBuf.indexOf("CONNECT:OK") != -1){
          connectOK = 1;
          Serial.println("Connected!");
          blueToothSerial.print("Connected!");
          break;
        }
        else if(recvBuf.indexOf("CONNECT:FAIL") != -1){
          Serial.println("Connect again!");
          break;
        }
      }
    }
  }
  while(0 == connectOK);
}

Ausserdem habe ich in meine Heardbeatfunktion so hier angepasst

void checkHeartbeat()
{
  long aktuell = millis();
  if (aktuell - KeepAlive > 6100)
  {
    if(CTR_timer2(Alarm_timer2, 15000))
    {
      Serial.println("Slave broken");
      TimeoutCount++;
    }
    if (TimeoutCount > 2 & millis() > Resettime+30000)
    {
      //blueToothSerial.print("\r\n+LOSSRECONN=1\r\n"); // autoreconnect after power off
      //blueToothSerial.print("\r\n+CONN=0,13,EF,0,7,5C\r\n");
      setupBlueToothConnection();
      Resettime = millis();
      //ConnectControl = false;
    }  
  } 
  else
  {
    TimeoutCount = 0;
    if(CTR_timer2(Alarm_timer2, 15000))
    {
      Serial.println("Slave connected");
      TimeoutCount = 0;
      //ConnectControl = true;
    }
  }
}

Die Methode funktioniert so, dass geprüft wird ob der Slave anfragt. Wenn nicht läuft ein Zähler hoch und bei Erreichen eines Wertes wird das Setup für Bluetooth neugestartet. Der Resettimer ist dazu da um zu verhindern, dass das Setup in eine Sndlosschleife fällt. Die Ednlosschleife wäre möglich, wenn die Wiederverbindung einen Moment dauert.

Die gleiche Methode beim Slave klappt allerdings nicht. Auch hier war die Idee beide Geräte in den Paarungsmodus zu setzen wenn das Signal abbricht. Warum es beim Slave nicht klappt, also wenn das Signal vom Master abreißt, versteh ich nicht.

Für jeden Hinweis bin ich dankbar, denn ich glaube hier bin ich so langsam wirklich am Ende meines Laienwissens.

Die Sketche füge ich nochmal bei.

Flashcontroller_Userinterface.zip (8.32 KB)

Slave.zip (3.33 KB)

Rtdler:
Hallo Uwe,
ich verwende die hier angegebene Bibliothek.

Wo hast Du sie heruntergeladen?
Grüße Uwe

Hier ist die Lib.

http://www.seeedstudio.com/wiki/File:Bluetooth_demo_code.zip

Hallo Uwe,

was hatte es mit der Frage nach dem Democode/Lib auf sich?

Ich habe einen Lösungshinweis gefunden weiß aber nicht wie ich ihn umsetzen soll.

Auf der Herstellerseite steht für den Slave folgendes zum Verbindungsabbruch

6. Disconnect device Pulling PIO0 high will disconnect current working Bluetooth device.

Hier könnte ein Lösungsansatz liegen, da eben genau der Diconnect nicht funktioniert. Heißt wenn der Slave merkt, dass der Master weg ist startet er zwar das Einladungsverfahren neu, aber er trennt nicht die bestehende Verbindung. Dadurch bleibt der neue Verbindungsversuch erfolglos.

Hat jemand eine Idee, wie man das umsetzen kann? Einfach 5V von einem Ausgang drauflegen klappt leider nicht.