Stringa per accendere led con sms arduino uno

Salve che mi puo aiutare a far accendere un led con un sms ,ho da poco acquistato arduino ma non conosco bene le istruzioni. =(
Spero che qualcuno mi rispondi perche ho guardato sul forum e non ci ho capito molto.

il modulo che ho è questo http://www.ebay.it/itm/230911052682?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Questo e il codice che ho scaricato da internet

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
#include "sms.h"
#include "call.h"

InetGSM inet;
CallGSM call;
SMSGSM sms;

char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;

void setup() 
{
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nStato=Prnoto");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  delay(5000);
  Serial.println("Qualita del segnale");
  gsm.SimpleWriteln("AT+CSQ");
};

void loop() 
{ 
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
};

void serialhwread(){
  i=0;
  if (Serial.available() > 0){            
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;      
    }
    
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Test del segnale modem.
    if(!strcmp(inSerial,"TEST")){
      //sms.SendSMS("346042XXXXX", "Arduino SMS");
      Serial.println("Qualita del segnale");
      gsm.SimpleWriteln("AT+CSQ");
     }
      //Leggi tuttu gli sms.
    if(!strcmp(inSerial,"SMS TUTTI")){
      Serial.println("Leggo tutti gli SMS");
      //gsm.SimpleWriteln("AT+CMGR=1");
      gsm.SimpleWriteln("AT+CMGL=\"ALL\"");
     }
    //Leggo il credito residuo.
    if(!strcmp(inSerial,"CREDITO")){
      Serial.println("Il credito residuo e =");
      call.Call("+39404");
     }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }    
    inSerial[0]='\0';
  }
}

void serialswread(){
  gsm.SimpleRead();
}

Devi racchiudere il codice con gli appositi tag. Altrimenti, 1 l'admin ti cazzia, 2 come vedi le parentesi quadre spariscono e vengono interpretate come corsivo (dal punto in cui nel codice c'e' una quadra aperta e la i i=italic=corsivo).
Modifica il post e metti il codice racchiuso tra questi due tag: [ code] e [ /code] senza spazio (io l'ho messo per poterlo scrivere)
Oppure usi il pulsante con il simbolo #

Ma se carichi lo sketch su Arduino e vai nel "Monitor Seriale" dell'IDE, quali scritte appaiono?
Tutti quei Serial.println servono per stampare sul monitor seriale dei messaggi.

Per le parentesi quadre non so ,da che punto è interpretato in corsivo ?
Poi io ho aggiunto delle istruzioni che se digito sul terminale seriale mi restituisce il credito della sim ,ho gli sms ricevuti con dei comandi AT

questo è quello che mi compare sul terminale :

GSM Shield testing.

Stato=Prnoto
Qualita del segnale

OK

+CSQ: 15,0

OK

poi se telefono e mando un sms sul monitor seriale mi compare questo

RING

+CLIP: "+3934604xxxxx",145,"",,"",0

RING

+CLIP: "+3934604xxxxx",145,"",,"",0

NO CARRIER

+CMT: "+3934604xxxxx","","13/06/20,12:15:45+08"
Prova scrittura sms da cellulare

Non so che libreria stai usando, ma penso che sia questa: Google Code Archive - Long-term storage for Google Code Project Hosting.

Puoi provare a fare così:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

#define led 13

void setup() 
{
 
  pinMode(led, OUTPUT);  
 
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
};

void loop() 
{
  if(started){
    gsm.readSMS(smsbuffer, 160, n, 20));
    {
      if smsbuffer = accendiled; //testo sms
      digitalWrite(led, HIGH);
    }
    delay(1000);
  }
};

non so se funziona, l'ho scritto velocemente. cmq il trucco sta nel comparare la stringa smsbuffer con il testo dell'sms. Se coincidono fai questo, se non concedi fai questo.

Grazie intanto del consiglio ,la libreria è quella giusta !!
provando il codice ottengo errori nella compilazione nella riga

gsm.readSMS(smsbuffer, 160, n, 20));

sketch_jun21a.ino: In function 'void loop()':
sketch_jun21a:30: error: expected ;' before ')' token sketch_jun21a:32: error: expected (' before 'smsbuffer'

ma se puo essere utile ho trovato questo codice che non mi da errori

if(gsm.readSMS(smsbuffer, 160, n, 20))
    {
      Serial.println(n);
      Serial.println(smsbuffer);
    }

qui spiega il sistema , non l ho capito bene Comparazione di due stringhe... - Software - Arduino Forum
conosci la sintassi corretta ?

grazie

in quella riga c'é una parentesi di troppo o manca.
Ciao Uwe

Con questo codice

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

#define led 13

void setup() 
{
 
  pinMode(led, OUTPUT);  
 
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
};

void loop() 
{
  if(started){
    (gsm.readSMS(smsbuffer, 160, n, 20));
    {
      if smsbuffer = accendiled; //testo sms
      digitalWrite(led, HIGH);
    }
    delay(1000);
  }
};

ottengo questo

sketch_jun21a.ino: In function 'void loop()':
sketch_jun21a:32: error: expected `(' before 'smsbuffer'

suggerimenti ...

Alla linea 32 il compilatore si aspetta una parentesi tonda ( prima della parola smsbuffer.
Sono tutti errori di sintassi.
La linea deve essere così:
gsm.readSMS(smsbuffer, 160, n, 20);

Avevi corretto peggiorando :grin:
Logicamente l'errore che indicava il compilatore l'hai interpretato come "mi manca una parentesi tonda prima di smsbuffer".
In realtà era di troppo la chiusa finale prima del ;

=( ottengo sempre lo stesso errore

Probabilmente quando posti lo sketch le righe non sono esattamente lo stesso numero.
Quello è un altro errore di sintassi. Il confronto è == e non = da solo, uguale da solo è assegnazione
In quella riga devi correggere cosi:

  if( smsbuffer == "accendiled" ) 
  { digitalWrite(led,HIGH);
  }

Ma NON funzionerà perchè NON puoi confrontare due stringhe cosi, devi usare strcmp()
http://www.cplusplus.com/reference/cstring/strcmp/?kw=strcmp

  if( strcmp(smsbuffer,"accendiled")==0 ) 
  { digitalWrite(led,HIGH);
  }

cosi non ottengo nessun errore :slight_smile: , ma il led non mi si accende

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

#define led 13

void setup() 
{
 
  pinMode(led, OUTPUT);  
 
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
};

void loop() 
{
  if(started){
    gsm.readSMS(smsbuffer, 160, n, 20);
if( strcmp(smsbuffer,"accendiled")==0 ) 
  { digitalWrite(led,HIGH);
  }
    delay(1000);
  }
};

Modifica cosi (è molto importante mettere la sms.readSMS() dentro una if) :

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"

SMSGSM sms;
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
const byte ledPin=13;

void setup() 
{ delay(1000);
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  pinMode(ledPin, OUTPUT);  
  if( !gsm.begin(2400) )
  { Serial.println("status=IDLE");
    while(1);        // qui blocco l'arduino tanto non puoi fare altro
  }
  Serial.println("status=READY");
};

void loop() 
{ if(gsm.readSMS(smsbuffer, 160, n, 20)) 
  { Serial.println(n);                 // stampiamo n e smsbuffer
    Serial.println(smsbuffer);
    if( strcmp(smsbuffer,"accendiled")==0 ) 
    { Serial.println("led acceso");
      digitalWrite(ledPin,HIGH);
    }
  }
 delay(1000);
};

Ti ho messo la stampa su Monitor Seriale dell'IDE delle frasi che ricevi.
Poi 3 piccole modifiche:

  1. il pin del led dichiaralo usando const e non #define
  2. non serve a molto la variabile started. Nel setup() tanto vale bloccare Arduino con la while(1); se il modulo sms non si attiva.
  3. nella setup() come prima istruzione è sempre meglio iniziare con una delay(1000);

P.S. sono un programmatore, ma non ho quel modulo sms, perciò NON posso testare il codice ma solo compilarlo nell'IDE per verificare non ci siano errori sintattici.

Se invio la chiamata ,nel terminale mi scrive

GSM Shield testing.
status=READY
+393459380XXX (il telefono da cui chiamo)
accendiled (dovrebbe essre il messaggio che ha tenuto in memoria)

se invio il messaggio tramite sms ,non fa niente

GSM Shield testing.
status=READY

prova a vedere questa pagina che dovrebbe essere simile al mio problema ,ma io non ci capisco :slight_smile:

http://forum.arduino.cc/index.php?topic=140021.new

String messaggio = String(smsbuffer);

if(messaggio.indexOf("on") != -1) digitalWrite(13, 1);
if(messaggio.indexOf("off") != -1) digitalWrite(13, 0);

Lascia stare quel post, non c'entra nulla. Convertono il buffer smsbuffer in oggetto String per lavorare con una funzione di ricerca.
Tanto vale usare strcmp direttamente sul smsbuffer.
Fra l'altro dai primi post di quel thread sembra quasi che dicano che la readSMS() legge un carattere alla volta, cosa non vera.

Io non ho mai provato questo modulo.
Perciò non mi è chiaro quando fai la differenza tra "invio la chiamata" e "invio messaggio tramite sms". Cioè?
Nel primo caso vediamo che Arduino riceve sia il tuo numero che la frase "accendiled".
Nel secondo non riceve mai nulla. Cosa cambia nelle due modalità d'invio?

Nella prima modalita è una semplice chiamata vocale, mentre nel secondo caso è l' invio di un normale sms dal cellulare

grantitoi77:
Nella prima modalita è una semplice chiamata vocale, mentre nel secondo caso è l' invio di un normale sms dal cellulare

Con la chiamata vocale il led si accende? credo di si.
Il modulo non riceve sms. Come chiamata vocale si. Non saprei però perchè.
Sicuro di aver messo i vari ponticelli nella maniera corretta sulla scheda?
Quella scheda non deve essere configurata mandandogli dei comandi AT?
Hai messo la scheda SIM sulla shield?

http://arduino.cc/en/Guide/ArduinoGSMShield#toc9
Sul sito Arduino per una scheda simili si parla anche del codice pin della sim.

Con la chiamata il led non si accende. Del codice pin l 'ho visto anche io , ma il pin sulla sim è disabilitato e non lo chiede., poi le telefonate le riceve è anche gli sms.
Per i ponticelli io no li ho toccati li ho lasciati come erano (sono su SW -TX e SW RX ), ho inserito il modulo solo sopra all' arduino uno

Con questo codice sono riuscito a eseguire un comando con una chiamata

#include "SIM900.h"
#include <SoftwareSerial.h>
//We don't need the http functions. So we can disable the next line.
//#include "inetGSM.h"
#include "sms.h"
#include "call.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to check if an incoming call is from an authorized
//number and in this case, send to this number an SMS with the value
//of a digital input.

//We have to create the classes for SMSs and calls.
CallGSM call;
SMSGSM sms;

char number[20];
byte stat=0;
int value=0;
int pin=1;
char value_str[5];

void setup() 
{
  pinMode(pin,INPUT);
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400))
    Serial.println("\nstatus=READY");
  else Serial.println("\nstatus=IDLE");
};

void loop() 
{
  //Chekcs status of call
  stat=call.CallStatusWithAuth(number,0,0);
  //If the incoming call is from an authorized number
   if(stat==CALL_INCOM_VOICE_AUTH){
    Serial.println("CIAO MICHI");
    delay(5000);
    Serial.println("TERMINI LA CHIAMATA");
    //Hang up the call.
    call.HangUp();
    //Check the value of the input.
    //value=digitalRead(1);
    //Convert the int to a string.
    //itoa(value,value_str,10);
    //Send an SMS to the previous number with
    //the value read previously.
    //sms.SendSMS(number,value_str);
  }
  delay(1000);
};

La scheda è questa http://www.ebay.it/itm/230911052682?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

poi qui ho trovato dei comandi at che funzionano

http://www.futuraelettronica.net/pdf_ita/8190-GSMGPRSSHIELDv2.pdf
ftp://imall.iteadstudio.com/IM120417009_IComSat/DOC_SIM900_AT%20Command%20Manual_V1.03.pdf (qui sono 230 pagine)
http://imall.iteadstudio.com/im120417009.html


char SendSMS(char *number_str, char *message_str);
Send a SMS to the specified number with the specified string.

char SendSMS(byte sim_phonebook_position, char *message_str);
Send a SMS to the specified phonebook position with the specified string.

char IsSMSPresent(byte required_status);
Check if there is a message with the specified attribute like:
SMS_UNREAD
SMS_READ
SMS_ALL

char GetSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len);
Save the SMS content and sender of the SMS in specified SIM position.
Save the first max_SMS_len byte of the SMS string to the SMS_text string and
the sender to the phone_number string.

char GetAuthorizedSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len,
byte first_authorized_pos, byte last_authorized_pos);
Method reads SMS from specified SIM position and
makes authorization. It means SMS phone number is compared
with specified SIM phonebook position(s) and in case numbers
match GETSMS_AUTH_SMS is returned, otherwise GETSMS_NOT_AUTH_SMS
is returned.

char DeleteSMS(byte position);
Method deletes SMS from the specified SMS position


grantitoi77:
Con la chiamata il led non si accende.
Per i ponticelli io no li ho toccati li ho lasciati come erano (sono su SW -TX e SW RX ), ho inserito il modulo solo sopra all' arduino uno

Sei sicuro di aver scritto esattamente? Almeno con la chiamata vocale dovrebbe funzionare. Cambia il msg di attivazione ("ledon")

void loop() 
{ if(gsm.readSMS(smsbuffer, 160, n, 20)) 
  { Serial.print("Cell="); Serial.println(n);
    Serial.print("Sms="); Serial.print(smsbuffer); Serial.println("#");
    if( strcmp(smsbuffer,"ledon")==0 ) 
    { Serial.println("led acceso");
      digitalWrite(ledPin,HIGH);
    }
  }
 delay(1000);
};

Mi scrive questo sulla seriale con la chiamata

GSM Shield testing.
status=READY
Cell=+393459380xxx
Sms=accendiled

Cell=+393459380xxx
Sms=accendiled

è questo con l sms

GSM Shield testing.
status=READY

se richiamo mi da

GSM Shield testing.
status=READY
Cell=+393459380xxx
Sms=ledon#

Questo è il codice

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"

SMSGSM sms;
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
const byte ledPin=13;

void setup() 
{ delay(1000);
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  pinMode(ledPin, OUTPUT);  
  if( !gsm.begin(2400) )
  { Serial.println("status=IDLE");
    while(1);        // qui blocco l'arduino tanto non puoi fare altro
  }
  Serial.println("status=READY");
};

void loop() 
{ if(gsm.readSMS(smsbuffer, 160, n, 20)) 
  { Serial.print("Cell="); Serial.println(n);
    Serial.print("Sms="); Serial.print(smsbuffer); Serial.println("#");
    if( strcmp(smsbuffer,"ledon")==0 ) 
    { Serial.println("led acceso");
      digitalWrite(ledPin,HIGH);
    }
  }
 delay(1000);
};

Prova a sostituire la riga

if( strcmp(smsbuffer,"ledon")==0 )

con

if( strncmp(smsbuffer,"ledon",5)==0 )

lo forziamo a controllare tra le due stringhe solo 5 caratteri

P.S. ma qual'e' la libreria che usi? Quella del secondo post dentro non ha la readSMS() ma ha la getSMS() che non è la stessa cosa.