Softwareserial..Come si usa!

Ciao a tutti, sto impazzendo non riesco a risolvere questo problema…In pratica sto usando due arduino(UNO e Lilypad) e due moduli bluetooth HC-05, uno master ed uno slave settati da me con la funzione AT+BIND in modo che si connettano automaticamente, il problema è che io dall’arduino lilypad devo mandare dei valori acquisiti da dei sensori all’arduino UNO tramite bluetooth, solo che non ho assolutamente capito come usare la libreria “softwareserial” perchè non voglio utilizzare i due pin classici RX/pin0 e TX/1 siccome ad ogni upload del codice dovrei dissaldarli e risaldarli sul Lilypad

Il codice sul lilypad è questo:

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(5, 6); // RX, TX

int pos1,pos2,posm;
void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
}

void loop() {
pos1=analogRead(A5);
delay(50);
pos2=analogRead(A5);
delay(50);
posm=((pos1+pos2)/2);
Serial.println(posm);
BTSerial.println(posm);
delay(100);
}

Il codice su UNO è questo:

String c;
void setup() {
  Serial.begin(9600);
}

void loop() {
 c=Serial.readString();
 Serial.println(c);
 delay(100);
}

Solo che col serial monitor arduino UNO non riceve nulla! grazie

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Primo, ma sulla Uno come e a quali pin ai collegato il modulo BT ?

Secondo, nella spedizione verificare se su Serial c'e' qualcosa di available non ha senso. Chi spedisce, quando ha i dati, li manda, senza altri controlli.

if (Serial.available())  // non serve

Grazie ho appena editato

Allora sulla Uno i pin che ho usato sono i classici RX e TX e li ho opportunatamente incrociati per far funzionare il modulo BT, RX(BT) con TX(UNO) ed TX(BT) con RX(UNO)

Quindi devo eliminare il serial.available su lilypad giusto?

Edit: cancellato, sulla serial monitor di arduino UNO ricevo solo valori senza senso come "ù" o "ý",appena tolgo l'alimentazione al lilypad arduino UNO non riceve più nulla quindi vuol dire che comunicano effettivamente ma c'è ancora qualcosa che non va siccome riceve valori senza senso

Stai spedendo con la write() un numero intero, ovvero trasmissione binaria e non a caratteri.
Se hai un numero di 16 bit (int) riceverai dall’altra 2 byte (2 char) che stampati a video facilmente non hanno senso.
Per essere sicuro della trasmissione per ora spedisci usando la print e non la write o ancora meglio per ora spedisci solo un msg fisso esempio “OK” BTSerial.print(“OK”);

Ok ho spedito usando la print e ricevo sull’UNO il messaggio “OK”, però ricevo prima la “O” e poi la “K” e non “OK” insieme,cambiando il codice riesco a ricevere dei numeri, il problema rimane che non riesco ad unirli,esattamente come l’“OK” che si scompone…presumo sia un problema di definizioni di variabili, INT o CHAR oppure il Serial.read() non va bene

No la trasmissione funziona così. :) tu puoi trasmettere una cosa completa, come una frase "CIAO" oppure un numero lungo (long) tipo 2 miliardi, ma poi la trasmissione "di sotto" al cofano avviene byte per byte (CIAO=4 byte, il long altri 4 byte)

Chi riceve deve ricomporre i dati, oppure usi un "protocollo" ovvero stabilisci una tua regola di come spedisci e quindi come ricevi i dati. Esempio spedisci sempre 2 byte ma inizi con un altro byte '@' per far sapere che inizi la comunicazione e poi un byte finale esempio '#' per far sapere che hai finito. In mezzo metti i dati. Oppure spedisci sempre valori ma in numero fisso, esempio invii SEMPRE 2 byte. Metodo scomodo e molto "insicuro".

Puoi anche tagliare la testa al toro e usare la Serial.parseInt() oppure Serial.parseFloat().

Grazie della spiegazione, sono riuscito a far comunicare i numeri corretti e non scomposti (quindi ad esempio dal lilypad invio "430" e sull'UNO ricevo "430" e non "4" poi "3" e poi "0") con la funzione Serial.readString() e modificando la variabile C da char a String.Il problema è che il tutto funziona solo quando premo il tastino reset sul lilypad e la comunicazione termina dopo 1 secondo..sembra come se avesse nel buffer i valori e quando premo reset li scambia con arduino UNO

Up

Up

Ok, per l ' Up, pero' se non ci metti lo sketch che usi, come possiamo aiutarti

Forse sarebbe stato meglio in questo caso usare il parseint.

Ma il monitor seriale usa le stesse porte 0/1, forse sarebbe meglio usare una softwareserial su altre due porte e poi trasferire al Serial quanto hai ricevuto.

if myserial.available() dove myserial è la softwareserial ... leggi col parseinteint e poi Serial.println quello che hai ricevuto col parseint dalla myserial.

Ok ho aggiornato il codice con quello più nuovo, però ho sempre il problema che la trasmissione avviene solo quando premo il tasto reset

@paulus1969 non ho capito bene quello che mi hai detto

Mostraci i programmi ed uno schema dei collegamenti. Sospetto che tu stia usando sulla UNO le porte I/O 0,1 sia per il collegamento con il lilypad che per il collegamento con il PC.

problema risolto grazie paulus ;) il problema era il parseint e non i pin TX e RX

Resta il fatto che sarebbe meglio usare 0/1 solo per il collegamento al PC, in questo caso.

Puoi fare una softwareserial tanto ormai sai come si fa, così ne hai due e ne usi una per ogni compito.