creare funzione invio sms

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 :wink:

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 :wink:

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.