Ciao cari!
Qualche giorno fa in un topic abbiamo visto come due codici che fanno la stessa cosa, possono arrivare ad utilizzare quantità di risorse molto diverse.
Mi sono quindi chiesta se qualcuno di voi cervelloni (non sono sarcastica) ha in mente un modo più ottimizzato per fare quello che sto facendo ora.
Premessa ed obiettivi.
Ho alcune varabili: delle float ed un unsigned long.
Invio queste variabili a pachube, singolarmente, tramite dei client.print.
Pachube però mi richiede anche di comunicare il content-length.
Per calcolare quindi la lunghezza in caratteri di tutte le variabili inviate faccio così:
converto le float con dtostrf e l'unsigned long con ltoa.
Unisco tutte le variabili così convertite in un unica stringa.
Calcolo la lunghezza della stringa con strlen.
Questo è il mio content-length.
Il codice funziona, però... probabilmente è uno spreco di risorse.
Creo una stringa e dei buffer che utilizzo in pratica solo per contare i caratteri, considerato che le variabili le invio (e preferisco fare così per questioni di formattazione della PUT) singolarmente con dei client.print.
La mia domanda è, vi viene in mente un modo diverso e migliore per ricavare la somma totale dei caratteri che compongono le mie variabili?
Al momento ho 2k liberi e 200 di FREERAM, tutto funziona alla perfezione ma se trovo il modo di liberare un po' di ram posso mettere altre cose nello sketch.
Qui sotto trovate il codice che uso ora, tutte le variabili sono locali.
/*----- Pachube -----*/
// buffer per la conversione delle variabili
char charbuffertout[6]; // t_out
char charbufferhout[6]; // h_out
char charbuffertin[6]; // t_in
char charbufferhin[6]; // h_in
char charbufferT1[6]; // T1 h20
char charbufferT2[6]; // T2 Heat
char charbufferluce[10]; //luce
// conversione delle variabili in ASCII
// conversione float dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);
dtostrf(mydata.toutES,4,1,charbuffertout);
dtostrf(mydata.houtES,4,1,charbufferhout);
dtostrf(mydata.tinES,4,1,charbuffertin);
dtostrf(mydata.hinES,4,1,charbufferhin);
dtostrf(mydata.T2ES,4,1,charbufferT2);
dtostrf(mydata.T1ES,4,1,charbufferT1);
ltoa(mydata.mediaHzES,charbufferluce,10); // conversione long
//composizione della stringa per il calcolo del Content-Length:
char stringaTs[60] = "";
strcat(stringaTs, charbuffertout); // Field 1 t_out
strcat(stringaTs, charbufferhout); // Field 2 h_out
strcat(stringaTs, charbuffertin); // Field 3 t_in
strcat(stringaTs, charbufferhin); // Field 4 h_in
strcat(stringaTs, charbufferT1); // Field 5 T1 H20
strcat(stringaTs, charbufferT2); // Field 6 T2 Heat
strcat(stringaTs, charbufferluce); // Field 7 MediaLuce
PgmPrint("Stringa: ");
Serial.println(stringaTs);
PgmPrint("StringaTs lunghezza: ");
Serial.println( strlen(stringaTs) ); // Lunghezza della stringa originale