Problema comunicazione bluetooth

Ciao

Ho connesso due Arduino con due moduli bluetooth HC-05, il mio scopo è quello di inviare dei dati nel momento in cui premo un pulsante. Il codice funziona ma nel momento in cui aggiungo la parte di codice contrassegnata dal commento "//nuovo" i valori che riceve il ricevitore o sono tutti sballati o non arrivano proprio.

Rx e tx sono i pin a cui sono connessi i moduli bluetooth, al pin 9 dell'Arduino che invia è connesso un pulsante

Sapreste aiutarmi?

Codice Arduino che invia i dati:

#include <SoftwareSerial.h>  
int a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,l=10,m=11;
int old_valp=0,statop=1,valp=0;
int pp=9;
int k,y;
const int rx = 12;  
const int tx = 11; 
SoftwareSerial bt(rx, tx); 
void setup() {
  bt.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);
   pinMode(pp,INPUT);
   digitalWrite(pp,HIGH);
}

void loop() {
  if(bt.available()>0){//nuovo
  k=bt.read();//nuovo
  y=bt.read();//nuovo
  }//nuovo
letturapp();
if(statop==1){statop=0;
        bt.write(0xFF);
        bt.write(a);
        bt.write(b);
        bt.write(c);
        bt.write(d);
        bt.write(e);
        bt.write(f);
        bt.write(g);
        bt.write(h);  
        bt.write(i);
        bt.write(l);
        bt.write(m);        
        bt.write(5);
         }  
     }
void letturapp(){
 valp=digitalRead(pp);
 if(valp==HIGH&&old_valp==LOW)
     statop=1-statop;
   old_valp=valp;
   }

Codice Arduino che riceve i dati:

#include <SoftwareSerial.h>
const int TX=12;
const int RX=11; 
int a,b,c,d,e,f,g,h,i,l,m,s,z=0;
SoftwareSerial bt =  SoftwareSerial(RX, TX);
void setup() {
  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);
  Serial.begin(9600);
  bt.begin(9600);

}

void loop() {
  bt.write(10);//nuovo
  bt.write(11);//nuovo
        if(bt.available()>=13){
          if(bt.read()==0xFF){      
          a=bt.read();
          b=bt.read();
          c=bt.read();
          d=bt.read();
          e=bt.read();
          f=bt.read();
          g=bt.read();
          h=bt.read();  
          i=bt.read();
          l=bt.read();
          m=bt.read();
          s=bt.read();
          Serial.print(a); 
          Serial.print(" "); 
          Serial.print(b); 
          Serial.print(" "); 
          Serial.print(c);
          Serial.print(" ");  
          Serial.print(d); 
          Serial.print(" "); 
          Serial.print(e); 
          Serial.print(" "); 
          Serial.print(f); 
          Serial.print(" "); 
          Serial.print(g);
          Serial.print(" ");     
          Serial.print(h);
          Serial.print(i);
          Serial.print(" ");     
          Serial.print(l);
          Serial.print(" ");     
          Serial.println(m);          
          if(s==5) {Serial.print("STOP ");Serial.println(z);z++;}
          }
       }
    }

innanzi tutto in genere si usa il pin 10 come RX di Arduino, al posto del 12 che hai indicato tu e immagino tu stia usando Arduino UNO. Non so, forse va bene uguale. A proposito quali board Arduino utilizzi ?
Inoltre la funzione read() di SoftwareSerial restituisce un char, mentre tu lo assegni ad un int. Non sono sicura, ma non so se va bene.
Se guardi in rete, oppure sul tuo pc
/reference/www.arduino.cc/en/Reference/SoftwareSerialRead.html

vedrai che : Return a character that was received on the RX pin of the software serial port
L'esempio riportato è

SoftwareSerial mySerial(10,11);

void setup()  {
  mySerial.begin(9600);
}
void loop()  {
  char c = mySerial.read();
}

Aaa da un char, non ne avevo proprio idea ora provo con le modifiche che mi hai suggerito, uso l'Arduino uno

Ho modificato il codice ed ho cambiato i pin del bluetooth, funziona ma nel momento in cui inserisco il codice segnato dal commento "//nuovo" non funziona più. Però inserendo due delay da 100 funziona meglio ma sempre avvolte il segnale che arriva è tutto sballato. Ti metto il nuovo codice

Codice Arduino che invia i dati:

#include <SoftwareSerial.h>  
char a='1',b='2',c='3',d='4',e='5',f='6',g='7',h='8',i='9',l='10',m='11';
int old_valp=0,statop=1,valp=0;
int pp=9;
char k,y;
const int rx = 10;  
const int tx = 11; 
SoftwareSerial bt(rx, tx); 
void setup() {
  bt.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);
   pinMode(pp,INPUT);
   digitalWrite(pp,HIGH);
}

void loop() {
  if(bt.available()>0){//nuovo
  k=bt.read();//nuovo
  y=bt.read();//nuovo
  }//nuovo
  delay(100);
letturapp();
if(statop==1){statop=0;
        bt.write(0xFF);
        bt.write(a);
        bt.write(b);
        bt.write(c);
        bt.write(d);
        bt.write(e);
        bt.write(f);
        bt.write(g);
        bt.write(h);  
        bt.write(i);
        bt.write(l);
        bt.write(m);        
        bt.write(5);
         }  
     }
void letturapp(){
 valp=digitalRead(pp);
 if(valp==HIGH&&old_valp==LOW)
     statop=1-statop;
   old_valp=valp;
   }

Codice Arduino che riceve i dati:

#include <SoftwareSerial.h>
const int TX=11;
const int RX=10; 
char a,b,c,d,e,f,g,h,i,l,m,s;int z=0;
SoftwareSerial bt =  SoftwareSerial(RX, TX);
void setup() {
  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);
  Serial.begin(9600);
  bt.begin(9600);

}

void loop() {
        bt.write('10');//nuovo
  bt.write('11');//nuovo
  delay(100);
        if(bt.available()>=13){
          if(bt.read()==0xFF){      
          a=bt.read();
          b=bt.read();
          c=bt.read();
          d=bt.read();
          e=bt.read();
          f=bt.read();
          g=bt.read();
          h=bt.read();  
          i=bt.read();
          l=bt.read();
          m=bt.read();
          s=bt.read();
          Serial.write(a); 
          Serial.print(" "); 
          Serial.write(b); 
          Serial.print(" "); 
          Serial.write(c);
          Serial.print(" ");  
          Serial.write(d); 
          Serial.print(" "); 
          Serial.write(e); 
          Serial.print(" "); 
          Serial.write(f); 
          Serial.print(" "); 
          Serial.write(g);
          Serial.print(" ");     
          Serial.write(h);
          Serial.write(i);
          Serial.print(" ");     
          Serial.write(l);
          Serial.print(" ");     
          Serial.write(m);          
          if(s==5) {Serial.print("STOP ");Serial.println(z);z++;}
          }
       }
    }

supponiamo che al modulo bluetooth viene inviato un messaggio, e si fissa un carattere terminale per il messaggio, supponiamo nel mio caso il carattere '&'.
Con questo codice, se il carattere letto è diverso dal carattere finale, if ( toSend != '&')
vuol dire che non sono arrivata alla fine del messaggio, quindi devo accumulare i char letti nel messaggio (String msg), con l'istruzione msg += toSend ,
se invece sono alla fine, perché ricevo &, else if ( toSend == '&' ) ,
allora eseguo quello che voglio fare con la funzione esegui per esempio nel mio caso, che prende in input il messaggio totale letto e poi resetto il messaggio (msg="")

String msg;
char toSend;
if (bt.available())  {      //Read from bluetooth and write to usb serial
      toSend = brt.read();

      if ( toSend != '&')    msg += toSend ;
      else if ( toSend == '&' ) {    // con il char ‘&’ termina il messaggio ricevuto
        esegui(msg) ;  
        msg = "" ;
      }
    }

poi, si, alla fine del loop() è bene mettere un delay

Grazie mille ora funziona :slight_smile:

codice del ricevitore

#include <SoftwareSerial.h>
const int TX=11;
const int RX=10; 
char a,b,c,d,e,f,g,h,i,l,m,s;int z=0;
SoftwareSerial bt =  SoftwareSerial(RX, TX);
void setup() {
 pinMode(RX, INPUT);
 pinMode(TX, OUTPUT);
 Serial.begin(9600);
 bt.begin(9600);

}
String msg;
char toSend;
void loop() {
       bt.write('10');//nuovo
 bt.write('11');//nuovo
while (bt.available()>0)  {      //Read from bluetooth and write to usb serial
     toSend = bt.read();

     if ( toSend != '&')    msg += toSend ;
     else if ( toSend == '&' ) {    // con il char '&' termina il messaggio ricevuto
       Serial.print("STOP ");z++;Serial.println(z); 
       msg = "" ;
     }
   }
   delay(100);
      }

Codice Arduino che invia

#include <SoftwareSerial.h>  
char a='1',b='2',c='3',d='4',e='5',f='6',g='7',h='8',i='9',l='10',m='11';
int old_valp=0,statop=1,valp=0;
int pp=9;
char k,y;
const int rx = 10;  
const int tx = 11; 
SoftwareSerial bt(rx, tx); 
void setup() {
  bt.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);
   pinMode(pp,INPUT);
   digitalWrite(pp,HIGH);
}

void loop() {
  if(bt.available()>0){//nuovo
  k=bt.read();//nuovo
  y=bt.read();//nuovo
  }//nuovo
letturapp();
if(statop==1){statop=0;
        bt.write(0xFF);
        bt.write(a);
        bt.write(b);
        bt.write(c);
        bt.write(d);
        bt.write(e);
        bt.write(f);
        bt.write(g);
        bt.write(h);  
        bt.write(i);
        bt.write(l);
        bt.write(m);        
        bt.write('&');
         }  
     }
void letturapp(){
 valp=digitalRead(pp);
 if(valp==HIGH&&old_valp==LOW)
     statop=1-statop;
   old_valp=valp;
   }

Bene! Ti suggerisco solo questo ritocco (la funzione available ti dice quanti byte sono disponibili nel buffer, dato che tu li leggi a coppie devi fare la read solo se ce ne sono almeno 2):

  if( bt.available() >= 2 ){//nuovo
  k=bt.read();//nuovo
  y=bt.read();//nuovo
  }//nuovo

Grazie del suggerimento :slight_smile: