problema - inviare un comando bluetooth continuamente

Ciao a tutti
Allora grazie al vostro aiuto sono riuscito a realizzare un telecomando Bluetooth alimentato da un power-bank per cellulari che comanda a distanza diversi relè.
La parte ricevente (su arduino uno) e quella trasmittente (su arduino nano) utlizzano moduli bluerooth HC-05 configurati in modalità SLAVE/MASTER).
Il tutto funziona perfettamente. C'è solo un particolare che vorrei capire e se possibile sistemare.
Tenendo premuto un pulsante sul telecomando invio "A" rilasciando invio "a" e qui tutto apposto il problema si pone se nell'istante in cui tengo premuto il relativo tasto spengo il telecomando o si scarica la batteria succede che il comando inviato "A" rimane attivo sulla parte ricevente bloccando di conseguenza per es. l'apertura di un relè.
Sarebbe bene sapere se è possibile che la parte ricevente controlli la presenza della parte trasmittente in modo da azzerare eventuali comandi impartiti quando ques'ultimo non è attivo.
Si può fare?

Ecco il codice parte trasmittente:

    int pulsante_suPin = 8;              
    int pulsante_giuPin = 9;     
    int pulsante_suState = 0;             
    int pulsante_giuState = 0;  

#include <SoftwareSerial.h> // includo la libreria per la comunicazione seriale

SoftwareSerial mySerial(10, 11); // imposto i pin per la comunicazione seriale
// Collegare i pin: RX=>11 TX=>10

void setup()
{
  pinMode(pulsante_suPin, INPUT);      
  pinMode(pulsante_giuPin, INPUT);  
  mySerial.begin(9600); 
}

void loop()
{
pulsante_suState = digitalRead(pulsante_suPin);
if(pulsante_suState == 1){
mySerial.println("a"); // se il pulsante sù è premuto invio lettera a
}
else {  
    mySerial.println("A");   //altrimenti invio lettera A 
  }
pulsante_giuState = digitalRead(pulsante_giuPin);
if(pulsante_giuState == 1){
    mySerial.println("b");  // se il pulsante giù è premuto invio lettera b
  }
else {  
    mySerial.println("B");   //altrimenti invio lettera B  
  }
  delay (100);
}

Secondo me l'errore è nella parte ricevente, posta quella. E magari usa prima la formattazione automatica.

codice parte ricevente

    int pulsante_suPin = 8;              
    int pulsante_giuPin = 9;     
    int pulsantefinecorsaPin = 12;  
    int pulsante_suState = 0;             
    int pulsante_giuState = 0;  
    int pulsantefinecorsaState = 0;    



#include <SoftwareSerial.h> // includo la libreria per la comunicazione seriale

SoftwareSerial mySerial(10, 11); // imposto i pin per la comunicazione seriale
// Collegare i pin: RX=>11 TX=>10

void setup()
{
  pinMode(2, OUTPUT); 
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);  
  pinMode(pulsante_suPin, INPUT);      
  pinMode(pulsante_giuPin, INPUT);      
  pinMode(pulsantefinecorsaPin, INPUT);   


   mySerial.begin(9600); 
}

void funzione_sali (){
  digitalWrite(2, LOW); 
  digitalWrite(3, HIGH);  
  digitalWrite(4, LOW);  
  digitalWrite(5, LOW);  
  }
void funzione_scendi (){
  digitalWrite(2, HIGH); 
  digitalWrite(3, LOW);  
  digitalWrite(4, LOW);  
  digitalWrite(5, LOW); 
}
void funzione_stop (){
  digitalWrite(2, HIGH); 
  digitalWrite(3, HIGH);  
  digitalWrite(4, HIGH);  
  digitalWrite(5, HIGH); 
}

void loop()
{
   while (mySerial.available())
   {
       char dato= mySerial.read(); 
       switch(dato)
       {
         case 'A': 
         {
  digitalWrite(6, HIGH); 
           break;
         }
         case 'a': 
         {
  digitalWrite(6, LOW);
           break;
         }    
                  case 'B':
         {
  digitalWrite(7, HIGH);
           break;
         }
         case 'b':
         {
  digitalWrite(7, LOW); 
           break;
         }    
       
        }       
   } 
   {
     pulsante_suState = digitalRead(pulsante_suPin);  
     pulsante_giuState = digitalRead(pulsante_giuPin);    
     pulsantefinecorsaState = digitalRead(pulsantefinecorsaPin);
     
     if (pulsante_suState == 1 && pulsante_giuState == 1 && pulsantefinecorsaState == 1) {  
       funzione_stop(); 
       delay (10);        
       }
     if (pulsante_suState == 1 && pulsante_giuState == 1 && pulsantefinecorsaState == 0) {  
       funzione_stop();  
       delay (10);        
       }
     if (pulsante_suState == 0 && pulsante_giuState == 1 && pulsantefinecorsaState == 1) {  
       funzione_scendi();  
       delay (10);        
     }  
     if (pulsante_suState == 1 && pulsante_giuState == 0 && pulsantefinecorsaState == 0) {  
       funzione_stop();  
       delay (10);        
     }  
     if (pulsante_suState == 0 && pulsante_giuState == 1 && pulsantefinecorsaState == 0) {  
       funzione_scendi();  
       delay (10);        
     }  
     if (pulsante_suState == 0 && pulsante_giuState == 0 && pulsantefinecorsaState == 1) {  
       funzione_stop();   
       delay (10);        
     }  
     if (pulsante_suState == 1 && pulsante_giuState == 0 && pulsantefinecorsaState == 1) {  
       funzione_sali(); 
       delay (10);        
     }   
     if (pulsante_suState == 0 && pulsante_giuState == 0 && pulsantefinecorsaState == 0) {  
       funzione_stop(); 
       delay (10);        
     }     
}
}

Servirebbe un qualche codice che permette di verificare la presenza dell'accoppiamento tra i due moduli Bluetooth e che quando questi non sono collegati tra di loro (es. nel momento in cui il telecomando si spegne a causa della batteria scarica) permetta alla parte ricevente di resettarsi.

Ho visto che i moduli bluethoot HC-05 hanno 6 pin dei quali ne utilizzo solo 4 per far funzionare tutto questo sistema. Ma per caso qualche pin non usato potrebbe essere utilizzato per sapere se è accoppiato o no e mandare qualche impulso ad arduino?

Una soluzione ci sarà sicuramente

Trovi tutto nei comandi AT del modulo e nel suo datasheet ...
... guarda in allegato.

Guglielmo

HC-05 AT Commamd.pdf (83.7 KB)

HC-05 datasheet 201104 revised.pdf (634 KB)

Si a quanto pare c'è un pin STATE che credo dovrebbe indicare lo stato del modulo (come non lo so forse con un segnale HIGH o LOW). Quindi collegandolo ad un pin digitale di arduino potrebbe dirgli se resettarsi o meno.
Facile a dirsi :o