Comunicazione bluetooth tra Arduino e Android

Salve a tutti. Sto lavorando ad un progetto che richiede l'utilizzo del modulo bluetooth HC-05, ma non riesco a capire come trasferire un dato mediante bluetooth. La mia idea è quella di inviare un qualsiasi valore (string, byte, char, int) ad uno smartphone, quando pigio il pulsante della breadboard. Ho allegato il file al quale sto lavorando(non funzionante).

Grazie a tutti per l'impegno.

#include <SoftwareSerial.h>
#define RxD 6 // This is the pin that the Bluetooth (BT_TX) will transmit to the Arduino (RxD)
#define TxD 7 // This is the pin that the Bluetooth (BT_RX) will receive from the Arduino (TxD)
#define BUTTON 8 

SoftwareSerial blueToothSerial(RxD, TxD);  
char sendchar=0;
int data;

void setup() { 
    pinMode(RxD, INPUT); // Setup the Arduino to receive INPUT from the bluetooth shield on Digital Pin 6
    pinMode(TxD, OUTPUT); // Setup the Arduino to send data (OUTPUT) to the bluetooth shield on Digital Pin 7 
    pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
    blueToothSerial.begin(9600);
} 


void loop() { 
  byte leggiBottone=digitalRead(BUTTON);
 
  if (leggiBottone == 1)
  {
    blueToothSerial.print(1);
  }
delay(100);
}

--- il codice si racchiude tra i tag CODE e non QUOTE. Mi raccomando. - gpb01

Leggendo il codice ne deduco che il tuo bottone chiuda verso il +Vcc ... hai quindi messo una resistenza di pull-down per tenere normalmente il pin a LOW ?

Che applicazione usi sullo smartphone per ricevere i dati da BT?

Guglielmo

P.S.: I pin usati dalla SoftwareSerial NON vanno dichiarati né in INPUT né in OUTPUT, togli quelle pinMode().

gpb01:
Leggendo il codice ne deduco che il tuo bottone chiuda verso il +Vcc ... hai quindi messo una resistenza di pull-down per tenere normalmente il pin a LOW ?

Che applicazione usi sullo smartphone per ricevere i dati da BT?

Guglielmo

P.S.: I pin usati dalla SoftwareSerial NON vanno dichiarati né in INPUT né in OUTPUT, togli quelle pinMode().

Si, è presente una resistenza, ho seguito la connessione sottostante (riguardante il bottone soltanto).
Come applicazione sto utilizzando ArduinoRC.

Ok, allora, intanto comincia a fare il debug ... nel setup() apri la porta seriale e nel loop() mandi dei messaggi in cui visualizzi dove stai passando (se entri o meno nel IF, ecc.) ...

Guglielmo

il button è dichiarato pin 8 ma nello schema è il 7...

Intanto come dico sempre, quando c'è un problema "andiamo per gradi". Significa per prima cosa che se il progetto è composto da più elementi (nel tuo caso Arduino, Bluetooth, e lo smartphone Android) va verificato il singolo elemento, altrimenti non si capisce dove possa essere il problema. Ad esempio il fatto che "non funziona": tu sai se è perché il dato non parte, o è chi deve riceverlo che non lo intercetta, o lo interpreta male?

Per cercare di capire cosa fa un programma, prima di tutto si deve verificare la sua logica di funzionamento. Al posto di bluetoothSerial inizia ad usare la normale Serial, e vedi su Monitor seriale cosa succede, ossia cosa dovrebbe ricevere il bluetooth:

//#include <SoftwareSerial.h>
#define RxD 6 // This is the pin that the Bluetooth (BT_TX) will transmit to the Arduino (RxD)
#define TxD 7 // This is the pin that the Bluetooth (BT_RX) will receive from the Arduino (TxD)
#define BUTTON 8 

//SoftwareSerial blueToothSerial(RxD, TxD);  
char sendchar=0;
int data;

void setup() { 
    pinMode(RxD, INPUT); // Setup the Arduino to receive INPUT from the bluetooth shield on Digital Pin 6
    pinMode(TxD, OUTPUT); // Setup the Arduino to send data (OUTPUT) to the bluetooth shield on Digital Pin 7 
    pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
//    blueToothSerial.begin(9600);
    Serial.begin(9600);
    Serial.println("Start");
} 

void loop() { 
  byte leggiBottone=digitalRead(BUTTON);
 
  if (leggiBottone == 1)
  {
    // blueToothSerial.print(1);
    Serial.print(1);
  }
delay(100);
}

Provalo e fallo partire. Cosa vedi nel monitor seriale (impostalo a 9600 baud mi raccomando)?

Se vedi degli "1" quando premi e tieni premuto il pulsante allora ti funziona, e questo sarà ciò che mandi via Bluetooth (se devi mandare il dato solo quando premi il pulsante e non continuare a mandarlo, come immagino, è una modifica che vedremo dopo, sempre per il concetto "andiamo per gradi").

Poi per il secondo elemento, il bluetooth: quando hai fatto la prova, sei sicuro di aver fatto il pair (collegamento) tra HC-05 e il tuo telefono, vero? :wink: Immagino di si, ma quindi se la prima verifica è ok, poiché tu stai mandando il valore "1" come carattere (quindi un byte con codice decimale 49) e non come byte, la prossima domanda è: ma tu COSA devi mandare? Ovvero, COSA la controparte si aspetta di ricevere? Sei sicuro che gli vada bene il CARATTERE "1" e non un BYTE a 1?

Per finire, quindi, lo smartphone: parli di mandare dati ad uno smartphone, ma sullo smartphone quale programma hai caricato? Cosa fa? Cosa si aspetta? Lo hai scritto tu?

Una volta chiarite queste cose, allora possiamo vedere il resto.

docdoc:
Intanto come dico sempre, quando c'è un problema "andiamo per gradi". Significa per prima cosa che se il progetto è composto da più elementi (nel tuo caso Arduino, Bluetooth, e lo smartphone Android) va verificato il singolo elemento, altrimenti non si capisce dove possa essere il problema. Ad esempio il fatto che "non funziona": tu sai se è perché il dato non parte, o è chi deve riceverlo che non lo intercetta, o lo interpreta male?

Per cercare di capire cosa fa un programma, prima di tutto si deve verificare la sua logica di funzionamento. Al posto di bluetoothSerial inizia ad usare la normale Serial, e vedi su Monitor seriale cosa succede, ossia cosa dovrebbe ricevere il bluetooth:

//#include <SoftwareSerial.h>

#define RxD 6 // This is the pin that the Bluetooth (BT_TX) will transmit to the Arduino (RxD)
#define TxD 7 // This is the pin that the Bluetooth (BT_RX) will receive from the Arduino (TxD)
#define BUTTON 8

//SoftwareSerial blueToothSerial(RxD, TxD); 
char sendchar=0;
int data;

void setup() {
    pinMode(RxD, INPUT); // Setup the Arduino to receive INPUT from the bluetooth shield on Digital Pin 6
    pinMode(TxD, OUTPUT); // Setup the Arduino to send data (OUTPUT) to the bluetooth shield on Digital Pin 7
    pinMode(BUTTON, INPUT);    // imposta il pin digitale come input
//    blueToothSerial.begin(9600);
    Serial.begin(9600);
    Serial.println("Start");
}

void loop() {
  byte leggiBottone=digitalRead(BUTTON);

if (leggiBottone == 1)
  {
    // blueToothSerial.print(1);
    Serial.print(1);
  }
delay(100);
}




Provalo e fallo partire. Cosa vedi nel monitor seriale (impostalo a 9600 baud mi raccomando)?

Se vedi degli "1" quando premi e tieni premuto il pulsante allora ti funziona, e questo sarà ciò che mandi via Bluetooth (se devi mandare il dato solo quando premi il pulsante e non continuare a mandarlo, come immagino, è una modifica che vedremo dopo, sempre per il concetto "andiamo per gradi").

Poi per il secondo elemento, il bluetooth: quando hai fatto la prova, sei sicuro di aver fatto il pair (collegamento) tra HC-05 e il tuo telefono, vero? ;) Immagino di si, ma quindi se la prima verifica è ok, poiché tu stai mandando il valore "1" come carattere (quindi un byte con codice decimale 49) e non come byte, la prossima domanda è: ma tu COSA devi mandare? Ovvero, COSA la controparte si aspetta di ricevere? Sei sicuro che gli vada bene il CARATTERE "1" e non un BYTE a 1?

Per finire, quindi, lo smartphone: parli di mandare dati ad uno smartphone, ma sullo smartphone quale programma hai caricato? Cosa fa? Cosa si aspetta? Lo hai scritto tu? 

Una volta chiarite queste cose, allora possiamo vedere il resto.

Allora, sto scomponendo il problema in sotto- problemi, e ora sto lavorando con il monitor seriale.
quando schiaccio il bottone, nel monitor seriale vengono visualizzati correttamente gli 1.

riguardo il collegamento mediante bluetooth, si, sono sicuro di averlo fatto correttamente perché il led del bluetooth cambia velocità quando collegato. Io devo mandare un numero, che successivamente verrà tradotto e trasformato da un'altra applicazione (ma come mi hai detto tu scompongo il problema in sotto problemi, e a quest'applicazione ci arriverò dopo). Mi consigli di inviare un byte o una stringa, o una variabile di qualche altro tipo? Inizialmente voglio soltanto vedere se i dati arrivano mediante bluetooth al telefono, e utilizzo AndroidRC per verificare se il dato esce da arduino.
Quali sono i tuoi consigli?

Patrick_M:
il button è dichiarato pin 8 ma nello schema è il 7...

Ho osservato solo lo schema della breadboard. Riguardo i PIN, ho modificato in base alle esigenze.

Grazie all'utilizzo del monitor seriale ho scoperto che i dati, quando viene premuto il bottone, vengono spediti.

lucamas:
Mi consigli di inviare un byte o una stringa, o una variabile di qualche altro tipo? Inizialmente voglio soltanto vedere se i dati arrivano mediante bluetooth al telefono, e utilizzo AndroidRC per verificare se il dato esce da arduino. Quali sono i tuoi consigli?

Ovviamente le due controparti (Arduino e l'app Android) devono "parlare la stessa lingua". Per semplificare le cose ti direi di mandare un singolo carattere (quindi '1').
Per verificare lato Android cosa ricevi, io non conosco AndroidRC quindi potrei sbagliare, ma da quanto vedo nella descrizione quell'app mi sembra non faccia al tuo scopo, è più per controllare il PC tramite Android.

Prova invece QUESTO è un semplice serial monitor Bluetooth, e con questo sketch:

#include <SoftwareSerial.h>
#define RxD 6 // This is the pin that the Bluetooth (BT_TX) will transmit to the Arduino (RxD)
#define TxD 7 // This is the pin that the Bluetooth (BT_RX) will receive from the Arduino (TxD)
#define BUTTON 8 

SoftwareSerial blueToothSerial(RxD, TxD);  
char sendchar=0;
int data;

void setup() { 
    pinMode(RxD, INPUT); // Setup the Arduino to receive INPUT from the bluetooth shield on Digital Pin 6
    pinMode(TxD, OUTPUT); // Setup the Arduino to send data (OUTPUT) to the bluetooth shield on Digital Pin 7 
    pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
    blueToothSerial.begin(9600);
    Serial.begin(9600);
    Serial.println("Start");
    delay(1000);
    Serial.println("Hello world");
    blueToothSerial.println("Hello world");
} 

void loop() { 
  if (digitalRead(BUTTON) == HIGH)
  {
    blueToothSerial.println(1);
    Serial.println(1);
    delay(100);
    while(digitalRead(BUTTON)==HIGH)
      delay(100);
  }
}

docdoc:
Ovviamente le due controparti (Arduino e l'app Android) devono "parlare la stessa lingua". Per semplificare le cose ti direi di mandare un singolo carattere (quindi '1').
Per verificare lato Android cosa ricevi, io non conosco AndroidRC quindi potrei sbagliare, ma da quanto vedo nella descrizione quell'app mi sembra non faccia al tuo scopo, è più per controllare il PC tramite Android.

Prova invece QUESTO è un semplice serial monitor Bluetooth, e con questo sketch:

#include <SoftwareSerial.h>

#define RxD 6 // This is the pin that the Bluetooth (BT_TX) will transmit to the Arduino (RxD)
#define TxD 7 // This is the pin that the Bluetooth (BT_RX) will receive from the Arduino (TxD)
#define BUTTON 8

SoftwareSerial blueToothSerial(RxD, TxD); 
char sendchar=0;
int data;

void setup() {
    pinMode(RxD, INPUT); // Setup the Arduino to receive INPUT from the bluetooth shield on Digital Pin 6
    pinMode(TxD, OUTPUT); // Setup the Arduino to send data (OUTPUT) to the bluetooth shield on Digital Pin 7
    pinMode(BUTTON, INPUT);    // imposta il pin digitale come input
    blueToothSerial.begin(9600);
    Serial.begin(9600);
    Serial.println("Start");
    delay(1000);
    Serial.println("Hello world");
    blueToothSerial.println("Hello world");
}

void loop() {
  if (digitalRead(BUTTON) == HIGH)
  {
    blueToothSerial.println(1);
    Serial.println(1);
    delay(100);
    while(digitalRead(BUTTON)==HIGH)
      delay(100);
  }
}

Ho scaricato l'applicazione che mi ha consigliato, però funziona soltanto la parte del monitor seriale. Nell'applicazione del telefono non mi arriva nessun dato. Sono sicuro che la connessione sia avvenuta con successo perché il led del bluetooth si illumina in modo diverso. Ho inoltre fatto l'associazione tra il telefono e l'HC-05.

Scarica QUESTO programma e fai le prove con esso. E' un ottimo simulatore di terminale dove puoi ricevere e trasmettere collegandoti al HC-05 (lo uso regolarmente e posso garantire sul funzionamento).

Guglielmo

gpb01:
Scarica QUESTO programma e fai le prove con esso. E' un ottimo simulatore di terminale dove puoi ricevere e trasmettere collegandoti al HC-05 (lo uso regolarmente e posso garantire sul funzionamento).

Guglielmo

Scaricato e fatto girare con lo sketch consigliato da docdoc. Grazie mille a tutti.