Informazioni sul HC-06

Ciao a tutti ragazzi , mi sono appena presentato e ho letto tutto il regolamento prima di scrivere cosi non mi linciate :smiley:
Scherzi a parte , ho acquistato questo modulo e l’ho collegato con il solito partitore resistevo per adattare i livelli logici del modulo con arduino , inoltre ho usato la libreria SoftwareSerial per riuscire a caricare i sketch e lasciare libera la vera seriale.
Vi posto il codice e vi spiego che problema ho , prima però voglio fare una premessa :
Questo codice ha solo lo scopo di farvi capire che tipo di problema ho , infatti il codice non è completo , per esempio sul pin di input non ho "attivato " la resistenza di pullup e nel complesso non ha senso.

#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); 
const int pulsante =6;
int stato =0;
char x;
void setup()  
{
  pinMode(13, OUTPUT);
  pinMode(pulsante,INPUT);
  BT.begin(9600);
  Serial.begin(9600);
}
 
void loop(){
  if (BT.available()){
  x=(BT.read());
}   
    stato=digitalRead(pulsante);
    if (x=='H' && stato=="HIGH"){
      digitalWrite(13, HIGH);
      Serial.println("LED on");
    }
    if (x=='H' && stato=="LOW"){
      digitalWrite(13, LOW);
      Serial.println("LED off");
   }
    if (x=='L' && stato=="LOW"){
      digitalWrite(13, LOW);
      Serial.println("LED off");
   }
    if (x=='L' && stato=="HIGH"){
      digitalWrite(13, LOW);
      Serial.println("LED off");
   }
}

Il mio problema è semplice , se il modulo è connesso con il disposivo , che in questo caso è il mio telefono android, il tutto funziona , quando ovviamente il telefono si scollega dal modulo e quest’ultimo lampeggia , il codice non funziona. Quindi …come posso riuscire a scrivere in una variabile l’ultimo stato ricevuto dal modulo? Quello che voglio ottenere è ; se io invio al modulo il carattere H , disconnetto il telefono dal modulo e premo il pulsante il led dovrebbe accendersi…
Scusate il ragionamento contorto , ma si è fatta una certa. :sleeping:
Vi ringrazio a tutti ragazzi per il vostro tempo

stato==“HIGH” HIGH mi sembra che non deve stare tra virgolette.
Prova dopo x=(BT.read()); ad inserire un Serial.println(x); così vedi se effettivamente ricevi solo H o L come comandi via BT

certo… come dice zef nei controlli stato== HIGH oppure stato==LOW senza virgolette :smiley:

Si scusate ho fatto un errore a riscrive il codice qui sul forum , in realtà nella editor di arduino le virgoletti prime e dopo lo stato HIGH e LOW non ci sono, ma vi ringrazio comunque per l'appunto.
Cerco di spiegarmi meglio, se mi collego all'HC-06 e invio il carattere "H" per esempio questo lo riceve e non ci sono problemi , il problema nasce quando il modulo viene disconnesso dal telefono , in quanto la variaible x si svuota e quindi il led non può accendersi se premo il pulsante...
Se mi spiego male chiedete pure...

La variabile "non si svuota", ma più semplicemente riceve qualcos'altro, ad esempio un CR o un LF
Se vuoi che funzioni solo quando riceve un H o un L, controlla semplicemte che sia uno dei due caratteri voluti

nel tuo programma le condizioni sono

1 pulsante High + H led acceso
2 pulsante High + L led spento
3 pulsante Low + H led spento
4 pulsante Low + L led spento

quindi la sola condizione in cui può accendersi il led è che ci sia il bt collegato e che arrivi una H oltre alla pressione del pulsante

in teoria.... se connetti il bt invii la H e disconnetti x non dovrebbe cambiare ma non ne sono sicuro

Per rispondervi , allora il punto è questo. La "tabella della veria" che ha postato Patrik_M è giusta e tutto funziona bene , però quando disconnetto il modulo dal telefono , come posso far "ricordardare" ad arduino l'ultimo stato ricevuto? Esempio:
Ora il comportamento che ho è questo;
Invio il carattere H , disconnetto il telefono dal modulo bluetooth , premo il pulsante, ma il led non si accende.
Io voglio invece che se invio il carattere H , anche se scollego il telefono dal modulo in un secondo momento , arduino si ricordi l'ultimo carattere che è statto inviato.
Esempio:
Invio il carattere H , disconnetto il telefono dal modulo bluetooth , premo il pulsante, il led si accende.

void loop(){
  char temp;
  if (BT.available()){ 
     temp=(BT.read());
     if (temp=='H' || temp=='L') {
        x=temp;
     }
   }

Patrick vediamo se ho capito provo a commentare il tuo codice.

void loop(){
  char temp; /
  if (BT.available()){ // Se il modulo è associato 
     temp=(BT.read()); //Leggo il carattere dal modulo
     if (temp=='H' || temp=='L') { //Se il carattere inviato è 'H' o 'L'  scrivo nella variabile x l'ultimo carattere inviato
        x=temp;
     }
   }

Correggimi se sbaglio :smiley:

si esatto :smiley:

No non funziona , ma ho trovato l'inghippo. Come consigliato da brunello22 ho dato un Serial.print della variabile temp e ho notato che quando disconnetto il modulo dal telefono , sul monitor seriale viene scritto questo...

Qualcuno mi può dare una mano non so dove sbattere la testa :frowning: ?

hai stampato anche x?

X è uguale a temp...Io credo che quando disconnetto il modulo dal telefono viene inviato quella stringa , ma questo a me non serve

solo se temp vale H o L però...

     if (temp=='H' || temp=='L') { //Se il carattere inviato è 'H' o 'L'  scrivo nella variabile x l'ultimo carattere inviato
        x=temp;
     }

casomai riposta il codice completo grazie

 if (x=='H' && stato=="HIGH"){
   .........
    if (x=='H' && stato=="LOW"){

Forse se togliessi quelle virgolette su HIGH e LOW funzionerebbe meglio

Il codice di Patrick funziona però il led sembra "lampeggiare" , non so se capite cosa intendo...

Non hai messo una resistenza di pullDown sul pulsante

:smiley: o x rimane ad H o non rimane ad H che il led "lampeggi" è un'altro problema :slight_smile:

brunello22:
Non hai messo una resistenza di pullDown sul pulsante

per esempio....