Inviare lettura sensore da Master a Slave

Ciao a tutti,
su una breadboard ho montato un HC 05 settato come Master , una foto resistenza e un Arduino uno, su un’altra breadboard ho montato un HC 05 settato come Slave , un display 20x4 I2C e un Arduino uno. Vorrei inviare il dato della foto resistenza allo Slave e leggerlo sul display ma purtroppo non riesco leggere nulla. Premetto che la trasmissione tra Master /Slave funziona ,perché prima di questo progetto ne ho realizzato un’altro ,con successo, dove premendo un pulsante da Master accendo led sullo Slave. Ho fatto anche questa prova, leggere il valore della foto resistenza sul Monitor Seriale del Master , la leggo correttamente,ora non so più cosa fare. Grazie 1000 in anticipo.
Guido .

Sketch Master :

// Invio i dati luce + temp. allo Slave

#include <SoftwareSerial.h>
#define sensore_luce A0
int luceM       = 0;
const int rxpin = 10;                    // Assegno al pin 10 l’indirizzo di ricezione dati (lo collego al pin TXD del modulo)
const int txpin = 11;                    // Assegno al pin 11 l’indirizzo di trasmissione dati (lo collego al pin RXD del modulo)
SoftwareSerial bluetooth(rxpin, txpin);  // Assegno il nome (bluetooth) e i suoi pin di ricezione e trasmissione

void setup() {
  pinMode (sensore_luce, INPUT);
  bluetooth.begin(9600);                 //Inizializzo l’interfaccia del modulo bluetooth
}

void loop() {

  luceM = analogRead (sensore_luce);
  bluetooth.write (luceM);               //Invio tramite modulo bluetooth la variabile luceM allo Slave
  delay (2000);
}

Sketch Slave :

// Ricevo i dati luce + temp. dal Master e li stampo sul display
// SDA PIN A4
// SCL PIN A5

#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int luceS       = 0;
const int rxpin = 10;                    // Assegno al pin 10 l’indirizzo di ricezione dati (e lo colleghiamo al pin TXD del modulo)
const int txpin = 11;                    // Assegno al pin 11 l’indirizzo di trasmissione dati (collegandolo al pin RXD del nostro componente)
SoftwareSerial bluetooth(rxpin, txpin);  // Assegno il nome (bluetooth) e i suoi pin di ricezione e trasmissione
LiquidCrystal_I2C lcd(0x3F, 20, 4);
void setup() {
  lcd.init();
  bluetooth.begin(9600);                 // Inizializzo l’interfaccia del modulo bluetooth
  lcd.backlight();                       // Display acceso
  lcd.setCursor(0, 0);                   // Imposto il cursore
  lcd.print("**PROVA  BLUETOOTH**");     // Scrivo sulla prima riga < PROVA BLUETOOTH >
  lcd.setCursor(0, 1);                   // Imposto il cursore
  lcd.print("LUCE");                     // Scrivo sulla seconda riga < LUCE >
  lcd.setCursor(0, 2);                   // Imposto il cursore
  lcd.print("TEMP.");                    // Scrivo sulla terza riga < TEMP. >
  lcd.setCursor(0, 3);                   // Imposto il cursore
  lcd.print("********************");     // Scrivo sulla quarta riga < ******************** >
}

void loop() {
  if (bluetooth.available() > 0) {          //Se il bluetooth riscontra dati in entrata
    luceS = bluetooth.read();           //Inserisco in una variabile il dato ricevuto dal modulo
    lcd.setCursor(6, 1);                 // Imposto il cursore sulla colonna 6 , linea 1
    lcd.print(luceS);                    // Stampo il valore del sensore luce sul display LCD
    delay (1000);
  }
}

Prova a vedere tra i post di circa 6 settimane fa

forse qualcosa trovi

suggerimento: cerca tra le mie risposte...............

Ciao Docsavage,

Ho ricercato i tuoi messaggi di risposta ai post che affrontavano questo mio problema (o simile) ma purtroppo non sono riuscito a trovare il bandolo della matassa; purtroppo sono alle prime armi e, essendo un autodidatta non so destreggiarmi bene con i moduli bluetooth di Arduino. :confused:

Mi scuso per la mia insistenza e il disturbo che ti posso arrecare, ma a parer tuo sono molto lontano dal riuscire a completare il mio sketch? Se si riusciresti a darmi qualche ulteriore consiglio e dritta per poter essere in grado di portare a termine il mio progetto?

Grazie ancora,

Guido

Nella trasmissione non usare una write

usa una print

preceduta da una print di un carattere riconoscibile (cancelletto)

e seguita da un'altra print di un altro carattere riconoscibile (asterisco)

in questa maniera hai la trasmissione in chiaro, facile da comprendere, anche in debug

invece di luceS = bluetootread..........

guarda dove ricompongo i numeri ricevuti mano a mano

stacco che devo uscire...

Ciao docsavage,
scusa per il ritardo, ho cercato di mettere in pratica i tuoi suggerimenti ma non funziona,questi sono gli sketch .
Grazie ancora
Guido

Invio i dati :

// Invio i dati luce + temp. allo Slave

#include <SoftwareSerial.h>
#define sensore_luce A0
int datiLuce    = 0;
const int rxpin = 10;                    // Assegno al pin 10 l’indirizzo di ricezione dati (lo collego al pin TXD del modulo)
const int txpin = 11;                    // Assegno al pin 11 l’indirizzo di trasmissione dati (lo collego al pin RXD del modulo)
SoftwareSerial mySerial(rxpin, txpin);   // Assegno il nome mySerial e i suoi pin di ricezione e trasmissione

void setup() {
  pinMode (sensore_luce, INPUT);
  mySerial.begin(9600);                        //Inizializzo l’interfaccia del modulo bluetooth
}

void loop() {

  datiLuce = analogRead (sensore_luce);
  mySerial.print('#');                // un marcatore di inizio trasmissione
  mySerial.print(datiLuce);           //Invio tramite modulo bluetooth la variabile datiLuce allo Slave
  mySerial.print('*');                // un marcatore esplicito di fine trasmissione

  delay (2000);
}

Ricevo i dati

// Ricevo i dati luce dal Master e li stampo sul display
// SDA PIN A4
// SCL PIN A5

#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int datiluce    = 0;
const int rxpin = 10;                    // Assegno al pin 10 l’indirizzo di ricezione dati (e lo colleghiamo al pin TXD del modulo)
const int txpin = 11;                    // Assegno al pin 11 l’indirizzo di trasmissione dati (collegandolo al pin RXD del nostro componente)
SoftwareSerial mySerial(rxpin, txpin);   // Assegno il nome BT e i suoi pin di ricezione e trasmissione
LiquidCrystal_I2C lcd(0x3F, 20, 4);
void setup() {
  lcd.init();
  mySerial.begin(9600);                  // Inizializzo l’interfaccia del modulo bluetooth
  lcd.backlight();                       // Display acceso
  lcd.setCursor(0, 0);                   // Imposto il cursore
  lcd.print("**PROVA  BLUETOOTH**");     // Scrivo sulla prima riga < PROVA BLUETOOTH >
  lcd.setCursor(0, 1);                   // Imposto il cursore
  lcd.print("LUCE");                     // Scrivo sulla seconda riga < LUCE >
  lcd.setCursor(0, 2);                   // Imposto il cursore
  lcd.print("TEMP.");                    // Scrivo sulla terza riga < TEMP. >
  lcd.setCursor(0, 3);                   // Imposto il cursore
  lcd.print("********************");     // Scrivo sulla quarta riga < ******************** >
}

void loop() {
  if (mySerial.available() > 0) {         //Se il bluetooth riscontra dati in entrata
    datiluce = mySerial.read();           //Inserisco in una variabile il dato ricevuto dal modulo
    lcd.setCursor(6, 1);                  // Imposto il cursore sulla colonna 6 , linea 1
    lcd.print(datiluce);                  // Stampo il valore del sensore luce sul display LCD
    delay (1000);
  }
}

... ti rendi conto che da un lato stai facendo una mySerial.print() di un valore INTERO (... ovvero 16 bit, due bytes che va -32768 a +32767) che, il metodo print(), trasmette come una serie di caratteri ASCII (es. il numero intero 870 viene trasmesso come TRE caratteri ASCII: 0x38 0x37 0x30) e ... dall'altro lato speri di leggerli con una banale mySerial.read() in cui il metodo read() legge ... UN carattere alla volta ! :o :o :o

Come pensi che la cosa possa funzionare ? ? ?

Dovrai fare un ciclo di lettura in cui (... guardando cosa invii) ...

  1. aspetti che arrivi il carattere '#'
  2. inizi un ciclo di lettura in cui leggi un carattere ...
    2.1 se il carattere è '' il ciclo è finito ed esci al punto 3.
    2.2 se il carattere è diverso da '
    ' lo metti in un array di caratteri, incrementi l'indice dell'array e ti prepari a ricevere il prossimo carattere
  3. metti in fondo all'array di caratteri il carattere terminatore 0x00 per indicare che la stringa che rappresenta il tuo intero è terminata
  4. usi la funzioni atoi() della AVR libc per convertire la stringa di caratteri ricevuta in un INTERO.

Guglielmo

Guido_Laferrari:
Ciao docsavage,
scusa per il ritardo, ho cercato di mettere in pratica i tuoi suggerimenti ma non funziona,questi sono gli sketch .
Grazie ancora
Guido

ma hai letto almeno uno dei topic nei quali spiegavo cosa fare?

Io adesso, dal telefonino, non te li vado a cercare...

Prova a seguire Guglielmo, che è più bravo di me
......
Oppure leggi i miei topic vecchi

Ciao a tutti,
scusate tanto per la mia ignoranza
grazie ancora
Guido

Guido_Laferrari:
scusate tanto per la mia ignoranza ...

Ma ci mancherebbe, non devi scusarti ... :wink:

... quello che devi fare invece è seguire attentamente le indicazioni che ti ha dato docsavage e quelle che ti ho dato io, studiare bene il tutto e ... riprovare, riprovare e riprovare, sino a quando non hai capito come funziona e come fare.

Guglielmo