invio sms shield gsm

salve a tutti il mio problema è il seguente:
Vorrei inviare un sms ogni qualvolta un sensore mi restituisca come valore 1.
questo è lo sketch modificato mettendo semplicemente una variabile c dove quando è uguale a 1 invierà il messaggio invece arduino invia tanti messaggi fino a quando non lo scollego dalla corrente.

#include <GSM.h>
#define PINNUMBER "" 
GSM gsmAccess; 
GSM_SMS sms; 
char remoteNumber[20]= "+39347.....79"; 
char txtMsg[200]="invio riuscito;)";
int c=1;
void setup()
{ 
  Serial.begin(9600);
  
Serial.println("SMS Messages Sender"); 
  boolean notConnected = true; 
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  Serial.println("GSM initialized");
 Serial.println("Waiting for messages");
 // sendSMS();
}
void loop()
{ 
  
 if(c==1){
  sendSMS();
  c=c+1;
  } 
  
  
 } 
void sendSMS(){
 Serial.println(remoteNumber); 
 Serial.println(txtMsg); 
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
sms.flush();
}

Dovrebbe inviare soltanto un messaggio...

Aiuto ... :slight_smile:

ciao che shield stai utilizzando??Io avrei un problema simile.
Io volevo inviare un sms ogni qualvolta che mi scatta un interrupt.
Come arduino utilizzo un mega 2560 e come shield ICOMSAT 1.1 ,ma non riesco a farli comunicare.
Grazie in anticipo!

La mia è la shield originale di arduino io riesco a farli comunicare però vorrei poter decidere io quando inviare un mess invece ne invia tanti (utilizzo arduino uno) come posso fare?

Aiutoo

Se lo sketch è quello che hai indicato, la variabile c, dopo aver inviato lo SMS, si incrementa, quindi il successivo controllo if dovrebbe ritornare FALSE (c è maggiore di 1) e non inviare nulla.

Sei sicuro che sia quello lo sketch effettivamente utilizzato?

Questo è uno di prova per riuscire ad inviare un solo mess invece me ne manda in continuazione fino a quando non lo scollego dalla corrente non è che l invio del mes riguarda un altro pezzo di codice

Forse è la subroutine sendSMS() che non va a buon fine.

Prova a controllare il valore di ritorno dal sms.endSMS() usando invece Serial.print(sms.endSMS()).

Utilizzando lo sketch che ho postato arduino non funziona e non invia niente si blocca su SMS Messages Sender
(aprendo il monitor seriale).
funziona solamente con lo sketch normale senza quindi utilizzare la variabile c e senza fare il suo controllo.
ho usato Serial.print(sms.endSMS()); in quest'ultimo skech e mi stampa 0(zero) .
perche non funziona il controllo non capisco non ha senso.?????? :~ :~ :~ =( =( =( =( :0 :0

Posta lo sketch che funziona, anche se invia più SMS.

ECCOLO

#include <GSM.h>
#define PINNUMBER "" 
GSM gsmAccess; 
GSM_SMS sms; 
char remoteNumber[20]= "+39347.....79"; 
char txtMsg[200]="invio riuscito;)";

void setup()
{ 
  Serial.begin(9600);
  
Serial.println("SMS Messages Sender"); 
  boolean notConnected = true; 
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  Serial.println("GSM initialized");
 Serial.println("Waiting for messages");
 // sendSMS();
}
void loop()
{ 
  
 
  sendSMS();
   
  
  
 } 
void sendSMS(){
 Serial.println(remoteNumber); 
 Serial.println(txtMsg); 
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
sms.flush();
}

Bastava aggiungere un ciclo infinito alla fine del loop.
Comunque ho riscritto il tutto con qualche commento e con l'utilizzo della funzione F() per risparmiare memoria.

#include <GSM.h>

#define PINNUMBER "" 

char remoteNumber[20] = "+39347.....79"; 
char txtMsg[200] = "messaggio SMS";

GSM gsm;          // definizione oggetto gsm
GSM_SMS sms;      // definizione oggetto sms

void setup() { 

  Serial.begin(9600);

  Serial.println(F("SMS Messages Sender")); 

  while(gsm.begin(PINNUMBER) != GSM_READY) {  // ciclo attesa connessione alla cella
    Serial.println(F("Not connected"));
    delay(1000);
  }
  Serial.println(F("GSM initialized"));
}

void loop() {
  sendSMS();
  while(true) {};    // qui il processore entra in loop infinito perché ha terminato
} 

void sendSMS() {
  Serial.println(F("SMS sending...")); 
  Serial.println(remoteNumber); 
  Serial.println(txtMsg); 
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  sms.flush();
  Serial.println(F("SMS sendeed")); 
}

Grazie mille per la collaborazione ti spiego meglio cosa volevo fare.
Devo fare un sistema di allarme e avevo comprato dei semplici sensori pir che quando rilevano un movimento restituiscono 1 altrimenti 0 e io volevo inviare un messaggio ( visto che lo sketch della chiamata non funziona proprio :0) quando restituisce 1 quindi movimento rilevato

Possibile che mai nessun abbia utilizzato lo shield gsm ??

Questo è lo sketch completo dell'allarme dove utilizzo un lettore rfid gia testato e funzionante per attivare o disattivare l'allarme e alla presenza di movimento (sensore pir) arduino fa accendere una luce naturalmente collegata a un rele che si eccità a 5v( pin 7)
e invia un messaggio dove dice che l'allarme è scattato.Non capisco perche si blocca a SMS Messages Sender ovvero al controllo del pin . premetto che prima che aggiungessi la possibilità di inviare il messaggio tutto funzionava e testando da solo lo sketch del messaggio ero riuscito con ciclo for ad inviare il messaggio solo quando ne avevo bisogno.
aiuto come posso fare? se ci sono errori? oppure potete dirmi qualche migolioramento da apportare.

#include <SPI.h>
#include <RFID.h>
#include <GSM.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay
#define ledVerde 3
#define ledRosso 4
#define delayLed 2000
#define PINNUMBER ""
String codiceAutorizzato = "8593BBE548";
int allarme=0;
int inserito=0;
GSM gsmAccess; 
GSM_SMS sms; 
char remoteNumber[20]= "+39347......579"; //numero telefonico a cui inviare il messaggio
char txtMsg[200]="invio riuscito;)";

 
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
 
void setup()
{  Serial.begin(9600);
  
Serial.println("SMS Messages Sender"); 
  boolean notConnected = true; 
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  Serial.println("pin corretto");
 Serial.println("abilitazione messaggio attivo");
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
   pinMode(7, OUTPUT);// luce allarme scattato
   pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
  pinMode(2, INPUT);//sensore pir
  pinMode(6, INPUT);// sensore pir
}
 
void loop()
{
  
  /* Temporary loop counter */
  byte i;
 
  if(inserito==0)
  {
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      Serial.println("allarme attivato");
      accendiLed(ledVerde);
      allarme=1;
      inserito=1;
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
     
    }
    
    delay(900);
    Serial.println();
    Serial.println();
    
  }
  }
   if(inserito==1)
  {
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      Serial.println("allarme disattivato");
      accendiLed(ledVerde);
      allarme=0;
      inserito=0;
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
    
    delay(900);
    Serial.println();
    Serial.println();
    
  }
  }
  if(allarme==1)
  {
    Serial.println("controllo pir");
  if (digitalRead(2) == HIGH ||digitalRead(6) == HIGH) {
          digitalWrite(7, HIGH);
          Serial.println("allerta invio messaggio ....");
          for(int i=0;i<2;i++) sendSMS();
          delay(9000);
     }
  }
        if(allarme==0)
              {
          digitalWrite(7,LOW);
          
              }

}
void sendSMS(){
 Serial.println(remoteNumber); 
 Serial.println(txtMsg); 
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
sms.flush();
}
boolean verificaCodice(String codiceLetto){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}

Up

Non ho capito dove si blocca il codice che hai postato. Puoi essere più preciso?

ma non e' che stai usando i Pin Rx (2) e TX (3) della shield GSM per altri usi ?

Se non erro vedo sul Pin2 l' IR e sul 3 un led

Io dopo avercaricato il programma apro il monitor seriale e compare la scritta SMS Messages Sender dopo di che si blocca come se non andasse più avanti . Comunque i pin 2 3 gli uso per dei led . Devo cambiargli?