HC-05 master/slave

Sono riuscito a far comunicare due HC-05 grazie a questa guida

Provando a copiare l'esempio mi funziona. Ora se provo a mettere un pulsante al posto della fotoresistenza, non riesco a farlo funzionare.
Codice master

#define BUTTON 7 
int  val = 0; 

void setup() {

Serial1.begin (9600); //Inizializziamo l’interfaccia seriale del bluetooth con baud rate 9600
pinMode(BUTTON, INPUT);
}

void loop() {

val = digitalRead(BUTTON); 

Serial1.write (val); //Inviamo tramite modulo bluetooth la variabile “messaggio”

delay (1500); //Attesa di un secondo e mezzo per sincronizzare i dati che arrivano all’altro bluetooth

}

codice Slave

#include <SoftwareSerial.h> //Si include la libreria riguardante l’utilizzo delle istruzioni per dispositivi wireless (necessario solo con Arduino UNO)


const int rxpin = 10; //Definiamo il pin di ricezione dati

const int txpin = 11; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin); //Assegnamo un nome ai pin di ricezione/trasmissione e indichiamo la loro funzione tramite un istruzione di libreria

int LED = 9; //Definiamo il pin collegato al led. Utilizziamo il 9 poichè consente il PWM

void setup() {
Serial.begin(9600);
pinMode (LED, OUTPUT); //Definiamo la modalità del pin come OUTPUT


bluetooth.begin (9600); //Inizializziamo l’interfaccia bluetooth di scambio dati e ne definiamo la velocità in baud (38400 per la modalità AT, 9600 per la trasmissione normale)

}

void loop() {

if(bluetooth.available()){ //Se il bluetooth riscontra dati in entrata

int val = bluetooth.read (); //Inseriamo in una variabile il dato ricevuto dal modulo

delay (1000); //Attendiamo 1 secondo


if (val == HIGH) {  
    digitalWrite(LED, HIGH);  //accende il led  
  }  
  else {  
    digitalWrite(LED, LOW);   //spegne il led  
  }  

}

}

Ciao,come hai collegato il pulsantino ? Hai messo una resistenza di pull-up ?
Nel master inizializzi la

Serial.begin(9600)

e nel loop scrivi:

Serial.println(digitalRead(BUTTON));

In questo modo vediamo la lettura dello stato del pulsantino.

Nella slave, nelle due condizioni, io non metterei HIGH o LOW ma rispettivamente (1) 0 (0).

Ciao Fabio.
L'ho collegato in questo modo foto

Vediamo se ho capito, nel master devo mettere nel loop quello che hai scritto?

??

Si, nel loop devi scrivere quello che ti ho detto nel commento precedente e serve per leggere lo stato del pulsantino. 0 risulta premuto e 1 risulta non premuto

Ho fatto e non và :frowning:

Quando clicchi rimane sempre 1 ?

Quando clicco non si accende e non si spegne

Ma cosa leggi nella seriale ??

Niente, tutto bianco

Ciao Gunstr94,

puoi postare lo sketch completo (immagino rivisto secondo indicazioni di fabio22) che dovrebbe leggerti lo stato del pulsante?

Ciao ORSO,
Master

#define BUTTON 7 
int  val = 0; 

void setup() {

Serial1.begin (9600); //Inizializziamo l'interfaccia seriale del bluetooth con baud rate 9600
pinMode(BUTTON, INPUT);
}

void loop() {

val = digitalRead(BUTTON); 

Serial1.write (val); //Inviamo tramite modulo bluetooth la variabile "messaggio"

delay (1500); //Attesa di un secondo e mezzo per sincronizzare i dati che arrivano all'altro bluetooth

}

Slave

#include <SoftwareSerial.h> //Si include la libreria riguardante l'utilizzo delle istruzioni per dispositivi wireless (necessario solo con Arduino UNO)


const int rxpin = 10; //Definiamo il pin di ricezione dati

const int txpin = 11; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin); //Assegnamo un nome ai pin di ricezione/trasmissione e indichiamo la loro funzione tramite un istruzione di libreria

int LED = 9; //Definiamo il pin collegato al led. Utilizziamo il 9 poichè consente il PWM

void setup() {
Serial.begin(9600);
pinMode (LED, OUTPUT); //Definiamo la modalità del pin come OUTPUT


bluetooth.begin (9600); //Inizializziamo l'interfaccia bluetooth di scambio dati e ne definiamo la velocità in baud (38400 per la modalità AT, 9600 per la trasmissione normale)

}

void loop() {

if(bluetooth.available()){ //Se il bluetooth riscontra dati in entrata

int val = bluetooth.read (); //Inseriamo in una variabile il dato ricevuto dal modulo

delay (1000); //Attendiamo 1 secondo


if (val == HIGH) {  
    digitalWrite(LED, 1);  //accende il led  
  }  
  else {  
    digitalWrite(LED, 0);   //spegne il led  
  }  

}

}

Ciao Gunstr94,

secondo me quel: if (val == HIGH) non va bene.

per dirla semplice...dal master tu non invii all' HC slave HIGH ma invii un "numero"...che presumo sarà 1 in caso di pulsante premuto e 0 in caso di pulsante non premuto...ma attenzione che tu vai a leggere, nel master, lo stato di quel pulsante ogni 1500 ms ...pausa del delay...e per una frazione ti tempo piccolissima...ed in questi 1500 ms di pausa si perde tutto quello che succede...detto questo nello sketch dello slave dov'è che gli dici di stampare nel monitor seriale?...non vedo Serial.print() o Serial.println().

Detto questo perchè usi delay()?
dal mio punto di vista...magari sbaglio...basta attendere l'evento...cioè nel master gestisci un cambio stato pulsante (pressione/rilascio) od un flag se vuoi farlo cambiare di stato ad ogni pressione...dell'altra parte usi, come fai già, bluethoot.available()...

tolto il delay e aggiunto il serial.println(); ma niente. Si collega, comunica ma non passa lo stato del pulsante

ciao...hai cambiato quel if (val == HIGH) in if (val == 1)?...o meglio togli l'if e stampa direttamente val...così vedi cosa t'invia l'HC master.

Sto facendo così, ma niente. Serial monitor bianco.

slave

#include <SoftwareSerial.h> //Si include la libreria riguardante l'utilizzo delle istruzioni per dispositivi wireless (necessario solo con Arduino UNO)


const int rxpin = 10; //Definiamo il pin di ricezione dati

const int txpin = 11; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin); //Assegnamo un nome ai pin di ricezione/trasmissione e indichiamo la loro funzione tramite un istruzione di libreria

int LED = 9; //Definiamo il pin collegato al led. Utilizziamo il 9 poichè consente il PWM

void setup() {
Serial.begin(38400);
pinMode (LED, OUTPUT); //Definiamo la modalità del pin come OUTPUT


bluetooth.begin (38400); //Inizializziamo l'interfaccia bluetooth di scambio dati e ne definiamo la velocità in baud (38400 per la modalità AT, 9600 per la trasmissione normale)

}

void loop() {

if(bluetooth.available()){ //Se il bluetooth riscontra dati in entrata

int val = bluetooth.read (); //Inseriamo in una variabile il dato ricevuto dal modulo

delay (1000); //Attendiamo 1 secondo


Serial.println("val");
}

}

master

#include <SoftwareSerial.h> 
#define BUTTON 7 

const int rxpin = 10; //Definiamo il pin di ricezione dati

const int txpin = 11; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin);
int  val = 0; 

void setup() {
bluetooth.begin (38400);
Serial.begin (38400); //Inizializziamo l'interfaccia seriale del bluetooth con baud rate 9600
pinMode(BUTTON, INPUT);
}

void loop() {

val = digitalRead(BUTTON); 

Serial.write (val); //Inviamo tramite modulo bluetooth la variabile "messaggio"

delay(1500); //Attesa di un secondo e mezzo per sincronizzare i dati che arrivano all'altro bluetooth

}

VOGLIO PRECISARE CHE HO TOLTO IL MEGA E USO DUE UNO

ciao...prova questi:

nel master:

#include <SoftwareSerial.h>
#define BUTTON 7

const int rxpin = 10; //Definiamo il pin di ricezione dati

const int txpin = 11; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin);
byte  val = 0;
int  pushedButton = 0;

void setup() {
  bluetooth.begin (38400);
  Serial.begin (38400); //Inizializziamo l'interfaccia seriale del bluetooth con baud rate 9600
  pinMode(BUTTON, INPUT);
}

void loop() {

  val = digitalRead(BUTTON);
  if (val != pushedButton && val == 1) {

    bluetooth.write(val); //Inviamo tramite modulo bluetooth la variabile "messaggio"
    Serial.println("pulsante premuto");
    pushedButton = val;
  }

  if (val == 0 && pushedButton == 1) {
    pushedButton = val;
  }
}

nello slave:

#include <SoftwareSerial.h> //Si include la libreria riguardante l'utilizzo delle istruzioni per dispositivi wireless (necessario solo con Arduino UNO)


const int rxpin = 10; //Definiamo il pin di ricezione dati

const int txpin = 11; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin); //Assegnamo un nome ai pin di ricezione/trasmissione e indichiamo la loro funzione tramite un istruzione di libreria

int LED = 9; //Definiamo il pin collegato al led. Utilizziamo il 9 poichè consente il PWM

void setup() {
  Serial.begin(38400);
  pinMode (LED, OUTPUT); //Definiamo la modalità del pin come OUTPUT


  bluetooth.begin (38400); //Inizializziamo l'interfaccia bluetooth di scambio dati e ne definiamo la velocità in baud (38400 per la modalità AT, 9600 per la trasmissione normale)

}

void loop() {

  while (bluetooth.available()>0) {

    Serial.write(bluetooth.read());
  }
}

così vediamo se realmente arriva qualche cosa...domande banali: hai impostato correttamente il monitor seriale per i Baud rate?

EDIT : ho modificato lo sketch del master ...avevo sbagliato un comando.

Penso che ora il valore del pulsante del master lo invia, siccome ogni volta che premo il pulsate il led tx dello slave si accende per meno di un secondo

??

ciao...se hai un attimo di pazienza a fine mese dovrebbero arrivarmi 2 HC-05 così posso fare le prove reali...al momento ho solo un HC-05 settato come slave e trasmetto con BT del cellulare...e mi funziona bene.