Allo scopo di ottimizzare il codice, e imparare, avrei bisogno di un piccolo aiuto
Si tratta semplicemente di trasformare questo pezzo di codice, che serve per inviare un messaggio di allarme, in una funzione passando i valori di telefono e testo sms.
if (AL_FLO and smsL == 0) {
SIM900.println("AT+CMGS=\"+39331nnnnnnn\"");
delay(500);
SIM900.print("Allarme: superamento livello");
delay(1000);
SIM900.write(0x1A); // ctrl+z
SIM900.write(0x0D); // cr
SIM900.write(0x0A); // line feed
delay(500);
smsL = 1;
}
i tre dubbi credo semplici:
-per la funzione che tipo di variabile predisporre (string, float, ecc)?
-come si sostituisce una stringa dentro i comandi AT?
-nel return che ci inserisco?
siccome non sono un pigrone, io avevo pensato a quanto segue:
float sendSMS (string numero, string testo) {
SIM900.println("AT+CMGS=\"+numero+\"");
delay(500);
SIM900.print("\"+testo+\"");
delay(1000);
SIM900.write(0x1A); // ctrl+z
SIM900.write(0x0D); // cr
SIM900.write(0x0A); // line feed
delay(500);
smsL = 1;
return (cosa?)
}
grazie
ciao, non è che devi per forza ritornare qualcosa. se la funzione è quella non capisco cosa vorresti ritornare con float...
al massimo, potresti controllare se il messaggio è stato inviato correttamente e ritornare un boolean, altrimenti la dichiari void.
tnx... sai com'è a volte ci si incarta sulle scemenze... sul void hai ragione non ci avevo pensato.
quanto al passaggio delle variabili dentro i comandi AT, va bene la sintassi come l'ho scritta?
ciao
SIM900.print(""+testo+"");
in questo caso stai facendo una concatenazione di stringhe, ma in realtà non devi concatenare nulla perchè hai solo la variabile.
puoi scrivere semplicemente:
SIM900.print( testo );
non è proprio un errore (il compilatore non lo rileva), ma è antiestetico 
Ciao,
- per il tipo di funzione, visto che non hai nessun controllo di errore, basta usare un void (e questo risponde anche all'ultima domanda: non metti nessun return)
non sono sicuro che le stringhe in arduino ammettano la concatenazione col "+". Io userei le librerie standard di formattazione stringhe stile sprintf tipo cosi:
void sendSMS (string numero, string testo) {
char temp[50]
sprintf(temp, "AT+CMGS=\"%s\"",numero);
SIM900.println(temp);
delay(500);
sprintf(temp, "\"%s\"",testo);
SIM900.print(temp);
delay(1000);
SIM900.write(0x1A); // ctrl+z
SIM900.write(0x0D); // cr
SIM900.write(0x0A); // line feed
delay(500);
smsL = 1;
}
ricorda di mettere questo include in cima allo sketch (per poter usare la funzione sprintf):
#include <stdio.h>
ricdata:
SIM900.print(""+testo+"");
in questo caso stai facendo una concatenazione di stringhe, ma in realtà non devi concatenare nulla perchè hai solo la variabile.
puoi scrivere semplicemente:
SIM900.print( testo );
non è proprio un errore (il compilatore non lo rileva), ma è antiestetico 
Invece è un errore eccome, ma perché mancano delle virgolette! La stringa sopra verrebbe inviata esattamente com'è scritta, mentre per sostituire il valore della variabile occorre metterla fuori dalla parentesi:
SIM900.print("\""+testo+"\"");
In questo modo la variabile viene sostituita dal suo valore, e questo racchiuso tra virgolette.
Credo inoltre che la classe String vada scritta con la S maiuscola, ma non l'ho mai usata, quindi non saprei. Io farei tutto con le stringhe "canoniche", e non serve nemmeno sprintf():
void sendSMS (char *numero, char *testo) {
SIM900.print ("AT+CMGS=\"");
SIM900.print (numero);
SIM900.println("\"");
delay (500);
SIM900.print ("\"");
SIM900.print (testo);
SIM900.println (""");
delay (1000);
SIM900.write (0x1A); // ctrl+z
SIM900.write (0x0D); // cr
SIM900.write (0x0A); // line feed
delay (500);
smsL = 1;
}
L'ultimo smsL = 1 a cosa serve? Non è molto elegante usare variabili globali in questo modo...
Ulixxes:
Ciao,
- per il tipo di funzione, visto che non hai nessun controllo di errore, basta usare un void (e questo risponde anche all'ultima domanda: non metti nessun return)
non sono sicuro che le stringhe in arduino ammettano la concatenazione col "+". Io userei le librerie standard di formattazione stringhe stile sprintf tipo cosi:
void sendSMS (string numero, string testo) {
char temp[50]
sprintf(temp, "AT+CMGS="%s"",numero);
SIM900.println(temp);
delay(500);
sprintf(temp, ""%s"",testo);
SIM900.print(temp);
delay(1000);
SIM900.write(0x1A); // ctrl+z
SIM900.write(0x0D); // cr
SIM900.write(0x0A); // line feed
delay(500);
smsL = 1;
}
ricorda di mettere questo include in cima allo sketch (per poter usare la funzione sprintf):
#include <stdio.h>
Ho detto sciocchezze.. non ho fatto caso che usa il tipo string: va bene usare la concatenzaione col +.
Com Sukko ha ragione: le virgolette servono!
SukkoPera:
L'ultimo smsL = 1 a cosa serve? Non è molto elegante usare variabili globali in questo modo...
no, non va nella funzione. va nel richiamo, serve ad effettuare l'invio sms una sola volta, a fronte di un cambio di stato permanente nel loop.
per il resto grazie, il codice era piu o meno quello che avevo in mente.