Ciao a tutti, ho realizzato un programma (scopiazzando porzioni di vari sketch e aggiustandoli in base alle mie esigenze) per leggere i valori di 2 DHT22 ed una cella di carico e su successivi miei interrogativi tramite sms, la scheda SIM900 mi risponde inviandomi i dati richiesti, ma sono riuscito a farmi inviare solo un dato alla volta, esempio io invio "peso" e la SIM900 mi spedisce il peso e così via per tutti gli altri valori e fin quì tutto ok.
La soluzione che vorrei riuscire a raggiungere è di ricevere in un unico messsggio tutti i dati dei sensori, ma al momento non ho trovato nulla...c'è qualcuno che potrebbe darmi una mano per raggiungere l'obbiettivo? Grazie mille.
Devi spedire i dati mettendoli insieme in un unico messaggio testo, ma con dei separatori noti che poi dovrai sapere come "spezzare" in ricezione. Bisogna conoscere l'uso delle stringhe classiche del C (array di char terminati da null)
Per inviare ad esempio 2 valori senza virgola:
int x=100,y=34;
char buf[20];
...
snprintf(buf,20,"@%04d;%04d#",x,y);
//dentro a buf ho @0100;0034#
@ inizio messaggio
; separa le due cifre
fine messaggio
e i dati sono sempre di 4 cifre. Ho deciso io un mio "protocollo"
In ricezione devo sapere come dividere il msg ad esempio usando strchr()
http://www.cplusplus.com/reference/cstring/
con le virgole la snprintf() e la sprintf() su Arduino (avr) non accetta il %f per i numeri con virgola, bisogna usare dtostrf()
Intanto grazie per la celere risposta, io sono da pochi mesi approdato in questo interessante mondo di arduino ed anche la mia conoscenza è assai scarsa.
I dati che vorrei raggruppare sono temperatura e umidità rilevati dal dht22 e il peso di una cella di carico da inviare in una soluzione unica, al molmento utilizzo questo codice per inviare un determinato dato in base all'interrogativo che invio:
if (strcmp(smsbuffer,"Umid.int")==0) //Invio sms "Umid.int" per ricevere sms con valore umidita interna
{
dtostrf(h1,1,1,Umidita1);
sms.SendSMS(Mittente,Umidita1);}
else if (strcmp(smsbuffer,"Temp.int")==0) //Invio sms "Temp.int" per ricevere sms con valore temperatura interna
{
dtostrf(t1,1,1,Temperatura1);
sms.SendSMS(Mittente,Temperatura1);}
else if (strcmp(smsbuffer,"Peso")==0) //Invio sms "Peso" per ricevere sms con valore peso
{
units_sms = scale.get_units(5);
dtostrf(units_sms,0,0,peso);
sms.SendSMS(Mittente,peso);}
purtroppo però non ho ben capito come adattare il tuo esempio alla mia applicazione
Intanto se tu spedisci in base a 3 richieste diverse, dovrai inviare una sola richiesta.
Quindi la richiesta potrebbe essere "Misure" ?
if (strcmp(smsbuffer,"Misure")==0)
Queste due righe mettono dentro alla stringa Umidita1 il valore di h1
dtostrf(h1,1,1,Umidita1);
sms.SendSMS(Mittente,Umidita1);
Dovrai avere una stringa più grossa di Umidità dove mettere TUTTI i dati, esempio
char Misure[30];
if (strcmp(smsbuffer,"Misure")==0) //Invio sms "Misure" per ricevere sms con valori
{ dtostrf(h1,1,1,Umidita1);
dtostrf(t1,1,1,Temperatura1);
units_sms = scale.get_units(5);
dtostrf(units_sms,0,0,peso);
snprintf(Misure,30,"{%s#%s@%s}",Umidita1,Temperatura1,peso);
sms.SendSMS(Mittente,Misure);
}
Il "protocollo" spedisce qualcosa del tipo "{52.3#21.2@45.3}"
Il %s mette nel formato una stringa, %d un numero intero, %f un float MA questo ultimo NON SU AVR
Vedi il format del comando printf() del linguaggio C. No il %f purtroppo
Ora però quando ricevi i dati devi sapere come spezzarli
Una cosa, in alternativa alla snprintf() potresti usare la libreria PString
si infatti pensavo ad un "char" piu' capiente dove andare a racchiudere tutti i valori, però mi mancava la formula specifica
ultima richiesta poi non strsso più...si riesce anche a definire i valori nel messaggio di invio delle letture, cioè tipo un esermpio simile..."850gr 52.3% 21,5C" o cosa simile per dare l'ordine di musura dei dati inviati?
fatto, il messaggio mi viene spedito con il raggruppamento dei 3 valori, pero noin mi da le letture del dht22 ovvero umidità e temperatura il codice che invia è:
(NAN#NAN@8428) solo il peso legge e invia mentre le altre 2 letture invia un messaggio come se il dht non fosse collegato, peroò sul display i valori ci sono e anche se richiedo solo la temperatura il modulo invia sms con il valore corretto, quindi il dht funziona correttamente, però nel messaggio comulativo non rileva le letture di temperatura e umidita....boooo :o :o
Ora funziona tutto, forse avevo sbagliato a nominare una lettura del dht