Aiuto con modulo bluetooth

Ciao ragazzi, vi volevo chiedere dei consigli. Molti giorni fa ho comprato un modulo bluetooth hc-05, che si collega con un’applicazione sviluppata con appInventor. Ho imparato ad usare il mio modulo bluetooth per ricevere dei dati ma non so come mandarli dal modulo alla mia app. Nel mio caso il mio listato, che vi lascio in allegato, deve muovere due motori di un cingolato avanti, dietro, destra e sinistra sulla base dei dati inviati dall’applicazione. Ma come detto in precedenza vorrei che il modulo inviasse del testo come “avanti” alla mia applicazione.

Aiuti?? >:( >:(

Ps. non utilizzo la libreria software serial

macchina_con_blutooth.ino (1.68 KB)

Così come li ricevi puoi anche trasmetterli ... hai una porta seriale aperta, quello che l'App invia viene inviato al BT e tu lo ricevi sulla seriale, quello che tu scrivi sulla seriale passa attraverso il modulo BT ed arriva all'App collegata.

Guglielmo

Ah ... perché non usi la SoftwareSerial? Avresti la vera seriale libera per fare "debug" ed avresti una seconda seriale interamente dedicata al modulo BT. Non solo, il modulo BT collegato direttamente alla porta seriale di Arduino, nel 90% dei casi crea dei problemi (causa i livellidi tensione ... la vera Seriale spesso è ... più "permalosa" delle porte digitali).

Guglielmo

Quindi ogni volta che stampo del testo sulla seriale di Arduino arriva anche all'applicazione tramite il modulo bluetooth?

Scusate per l'ignoranza

Il modulo BT è solo un "canale" di trasferimento dei dati ... come dei fili che, virtualmente (via radio) collegano la tua porta seriale (sia TX che RX) alla tua applicazione che può trasmettere ed anche ricevere i dati :slight_smile:

Guglielmo

Beh, intanto no, usala la SoftwareSerial perché senza questa non hai modo di fare debug usando la seriale USB.

Passiamo anche a qualche piccolo consiglio generale.

pinMode(MDXR, OUTPUT);
pinMode(MDXN, OUTPUT);

Perché nella setup() hi messo due volte questa impostazione?

Serial.begin(96000); // for serial monitor output

96.000 baud? Hai uno zero di troppo, la velocità standard è 9600…

Poi hai i comandi indentati “a caso”, in alcuni punti anche a “scaletta”… :wink:
Devi cercare di indentare decentemente il codice, perché altrimenti diventa difficile comprenderlo (sia per te che sviluppi e fai debug, sia per noi). Nell’IDE premi Ctrl-T e te lo fa lui, poi cerca di mantenerlo in quel modo.

if (comando == 'A'){
  avanti();
  
}

  if (comando == 'B'){
  dietro();
  
  
 }
if (comando == 'C'){
  stop1();
  
}
if (comando == 'D'){
  sinistra();
  
}
if (comando == 'E'){
  destra();
  
}

Sempre per migliorare la leggibilità, togli tutte le linee vuote inutili (lasciane solo UNA quando ci sono singoli blocchi di codice che vuoi “vedere” separati). Inoltre tutte queste if() puoi sostituirle da uno switch(), vedi come è più leggibile ed immediato;

switch (comando) {
  case 'A':
    avanti();
    break;
  case 'B':
    dietro();
    break;
  case 'C':
    stop1();
    break;
  case 'D':
    sinistra();
    break;
  case 'E':
    destra();
    break;
}

Inizia con tutte queste cose a rivedere il tuo codice, poi posta nuovamente quello che avrai fatto, e vediamo se riesci a trovare come risolvere.

Avete ragione, premendo Ctrl-t ha tutto un altro aspetto ed è meglio cambiare tutti quegli if. Ci vediamo dopo quando ho aggiustato il codice.
:wink: :wink:

Ho aggiustato il codice, va bene così? Se va bene come faccio ad inviare dei dati alla mia applicazione?

macchina_con_blutooth.ino (1.84 KB)

Per inviare dati ti basta usare la print() o write() sulla softwareserial.

Diciamo una cosa di questo tipo (guarda cosa altro ti ho modificato, chiedimi se vuoi info):

// Configurazione dei pin
#define P_BT_RX 6
#define P_BT_RX 10
#define P_SENSORE 13
// Motori
#define MDXR 3 //motore destro collegati a input 3
#define MDXN 5 //collegato input 4 
#define MSXR 7 //motore sinistro collegato a input 2
#define MSXN 8 // collegatoa  a input 1

#include <SoftwareSerial.h>
SoftwareSerial bt(P_BT_RX, P_BT_TX);

void setup() {
  pinMode(MDXR, OUTPUT);
  pinMode(MDXN, OUTPUT);
  Serial.begin(9600); // for serial monitor output
  bt.begin(9600);
  pinMode(sensore, INPUT);
  pinMode(MSXR, OUTPUT);
  pinMode(MSXN, OUTPUT);

}
void avanti () {
  digitalWrite(MDXR, HIGH);
  digitalWrite(MDXN, LOW);
  digitalWrite(MSXR, HIGH);
  digitalWrite(MSXN, LOW);
}
void dietro () {
  digitalWrite(MDXR, LOW);
  digitalWrite(MDXN, HIGH);
  digitalWrite(MSXR, LOW);
  digitalWrite(MSXN, HIGH);
}
void stop1 () {
  digitalWrite(MDXR, LOW);
  digitalWrite(MDXN, LOW);
  digitalWrite(MSXR, LOW);
  digitalWrite(MSXN, LOW);
}
void destra () {
  digitalWrite(MDXR, HIGH);
  digitalWrite(MDXN, LOW);
  digitalWrite(MSXR, LOW);
  digitalWrite(MSXN, HIGH);
}
void sinistra () {
  digitalWrite(MDXR, LOW);
  digitalWrite(MDXN, HIGH);
  digitalWrite(MSXR, HIGH);
  digitalWrite(MSXN, LOW);
}

void loop() {
  if (bt.available() > 0) { //se è stato immesso un valore deve:
    char comando = bt.read(); //legge il valore e lo salva
    Serial.println(comando);
    switch (comando) {
      case 'A':
        avanti();
        bt.println("avanti");
        break;
      case 'B':
        dietro();
        bt.println("dietro");
        break;
      case 'C':
        stop1();
        bt.println("stop");
        break;
      case 'D':
        sinistra();
        bt.println("sinistra");
        break;
      case 'E':
        destra();
        bt.println("destra");
        break;
    }
  }

  int sens = digitalRead(P_SENSORE);
  if (sens > 0) {
    bt.println("OSTACOLO!");
    dietro();
    delay(5000);
    destra();
    delay(3000);
    stop1();
  }
  delay(10);
}

Grazie tante, mi sei stato molto d'aiuto!!!!! :grinning: :grinning: :wink: :smiley: