invio sms con arduino mega e sim900 problema con una variabile

Ciao a tutti ho un piccolo problema con una variabile quando al cambio di stato invio un sms se aggiorno la variabile precedentemente dichiarata TRUE , all'invio la metto a FALSE non mi invia nessun messaggio

#include <call.h>
#include <gps.h>
#include <GSM.h>
#include <HWSerial.h>
#include <inetGSM.h>
#include <LOG.h>
#include <SIM900.h>
#include <sms.h>
#include <Streaming.h>
#include <WideTextFinder.h>

#include <SoftwareSerial.h>//(10 , 11);// rx, tx
SMSGSM sms;
//GSM gsm;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char mittenteregistrato [13] = "+393xxxxxx58" ; // numero del mittente registrato (conosciuto)
char nomemittente [16] = "Impianto ULIVETO";
char sedicicrt [16]; // zona di memorizzazione dei primi sedici caratteri del messaggio ricevuto
int i = 0; // indice utilizzato nei cicli di for
int semaforo = 0; // semaforo riconoscimento numero telefono: o = numero riconosciuto;
// 1 = numero sconosciuto
const byte pompa = 4 ;// Il Pin 4 è quello connesso al relè1 della pompa del pozzo
const byte vasca = 5 ;// Il Pin 5 è quello connesso al relè 2 della pompa della vasca di rilancio
const byte gallmax = 7; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 6 ;// Il Pin 12 è quello connesso al galleggiante che segna la vasca vuota
const byte superpieno = 8 ;// Il Pin 8 è quello connesso al galleggiante che segna la vasca troppo piena ANOMALIA
const byte pinOnOff = 52; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 48;// il pin 11 si accende quando l'impianto e on o off
const byte pinOnOffsim = 9;// Il Pin 9 è quello connesso al TASTO CHE GESTISCE SOLO LA POMPA
//GALLEGGIANTI
byte MAX = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MASSIMO CAPACITA'
byte MIN = 0; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MINIMA CAPACITA'
byte SUPERPIENO = 0;//VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO SUPERPIENO
//-----------------------------------------------------------------------------------------------
//stato pulsante on off
byte OnOff = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL PULSANTE SUL PIN 10
byte statoOnOff = 0 ;//Se sistema acceso o spento (HIGH = Acceso)
byte lastOnOff = 0 ;
//-----------------------------------------------------------------------------------------------
bool inviosms = true ;
bool inviosmsSuperpieno = true ;
void setup()
{
  pinMode(pinOnOff, INPUT_PULLUP);   // imposta il pin 10 come pin di INPUT.
  pinMode(pompa, OUTPUT);   // imposta il pin 4 come pin di OUTPUT.
  digitalWrite(pompa, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(vasca, OUTPUT);   // imposta il pin 5 come pin di OUTPUT.
  digitalWrite(vasca, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(gallmax, INPUT_PULLUP);   // imposta il pin 6 come pin di OUTPUT.
  pinMode(gallmin, INPUT_PULLUP);   // imposta il pin 12 come pin di OUTPUT.
  pinMode(superpieno, INPUT_PULLUP);// imposta il pin 8 come pin di OUTPUT.
  pinMode(pinstatoimpianto, OUTPUT);   // indicatore impianto spento o acceso
  pinMode(pinOnOffsim, OUTPUT);
  digitalWrite(pinstatoimpianto, statoOnOff);// indicatore acceso alto

  //Serial connection.
  Serial.begin(19200);
  // GSM setup
  digitalWrite(pinOnOffsim, LOW);
  delay(1000);
  digitalWrite(pinOnOffsim, HIGH);
  delay(1500);  // > 1 secondo
  digitalWrite(pinOnOffsim, LOW);
  delay(2500); // > 2.2 secondi
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
    Serial.println("SIM900 Pronta");
    started = true;
  }
  else
    Serial.println(" SIM900 ko");
}

void loop()
{

  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, 20, smsbuffer, 160); // Leggo il messaggio ed il mittente
      // Serial.print("sms in arrivo da");
      // Serial.println("Tel.:" + String( Mittente));
      // Serial.println("Content: " + String(smsbuffer));
      semaforo = 0;
      for (i = 0; i <= 12; i++)
      {
        if (!(Mittente[i] == mittenteregistrato [i]))
          semaforo = 1;
      }
      if (semaforo == 0)
        Serial.print (nomemittente);
      else
        Serial.print (Mittente);
      // attende tre secondi per consentire la lettura su lcd del mittente
      Serial.print ("testo sms:");
      for (i = 0; i <= 15; i++)
        sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
      Serial.print("\n--- SMS Deleted ---\n\n");
      delay (1000);
    }

  }



  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }
    //  inviosms = true;
    else if (MAX == LOW  && MIN == LOW)
    {
      if (SUPERPIENO == LOW )
      {
        Serial.println ("anomalia  -  ");
        if (inviosmsSuperpieno == true) {
          sms.SendSMS (Mittente, "STATUS:  ANOMALIA  ");
          inviosmsSuperpieno = false;
        }
        digitalWrite(pompa, LOW);
        Serial.print("Pompa pozzo spenta ANOMALIA -  ");
        digitalWrite(vasca, LOW);
        Serial.println("Pompa vasca SPENTA ANOMALIA ");
      }

      else {
        if (inviosms == true ) {
          sms.SendSMS(Mittente, "STATUS:Vasca piena PompaON,VascaON");
          inviosms = false;
        }
        digitalWrite(pompa, HIGH);
        Serial.print ("Pompa pozzo accesa  -  ");
        digitalWrite(vasca, HIGH);
        Serial.println ("Pompa vasca accesa");
      }

    }
    else  if  (MAX == LOW  && MIN == HIGH) {
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa 4  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa 4");
    }

  }

  else {
    if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:IMPIANTO SPENTO");
      inviosms = false;
    }
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca ");
    //inviosmsSuperpieno = true;
  }
  //inviosms = true;
}

E tu dopo 33 post e 6 mesi di frequentazione non hai scoperto che ... nella sezione in lingua Inglese si può scrivere SOLO in Inglese? ? ? :o

Per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ... :slight_smile:

Guglielmo

P.S.: Il tuo post è già stato spostato nell'opportuna sezione del forum "Italiano”dove puoi proseguire.

gpb01 grazie ! :slight_smile:
Scusate distrattamente non mi ero accorto dell'errore

Salvatore, qual'è la variabile che quando dichiari FALSE non ti fa inviare l'SMS??? inviosms???
Da quello che vedo tu verifichi se detta variabile è TRUE e al primo ciclo lo è, invii l'sms che riceverai dopodiche la dichiari FALSE e la vedo più tornare TRUE, quindi ogni ciclo successivo alla verifica inviosms è TRUE??? Lui la trova FALSE e glisserà l'if. Le dichiarazioni a TRUE per la variabile le hai commentate tutte.
Ma forse ho capito male io il problema. Nel caso se puoi spiegarlo meglio. Ciao!!!

Ciao Lollo si la variabile è inviosms l'ho inserita perché quando cambio stato mi deve inviare un solo SMS

Si ma se poi resta eternamente a FALSE non te ne manderà mai più per tutto il ciclo di vita del programma.
Da quello che ho capito l’sms viene inviato solo quando tu fai una richiesta con un sms, o al verificarsi di un evento. Caduto l’evento dovresti resettare la variabile.

Ciao Lollo in pratica quando entro in un if al verificarsi di un evento lui manda un solo messaggio e poi aspetta il prossimo if

salvatore_paterna:
Ciao Lollo in pratica quando entro in un if al verificarsi di un evento lui manda un solo messaggio e poi aspetta il prossimo if

Salvatore questo lo ho capito. Ma aspetta un if in cui non entrerà mai più dato che la variabile dopo il primo sms inviato non verrà mai più settata a TRUE.
Quello che farei io è prevedere una variabile in cui memorizzi lo stato dell'impianto, chessò:
0: funzionamento regolare
1: anomalia superpieno
2: ecc...
Quindi nel loop prima verifichi lo stato dei vari sensori e assegni lo stato dell'impianto dopodiche con uno switch, se lo stato è 1, invio l'sms, setto la variabile sms inviato a FALSE e la mantengo sino a che la verifica sui sensori non mi dice che l'anomalia è venuta meno, la variabile stato se tutto è regolare tornerà a 0, li verificherai se la variabile sms inviato è FALSE la riporti a TRUE pronta nel caso dovesse riaccadere qualcosa.
Spero di averti fatto capire ciò che intendo.
Buona giornata!!!

Ciao lollo scusa ma in teoria adesso quando cambia lo stato dei galleggianti cambia anche l'istruzione if perché l'istruzione if sms non si resetta ? Dovrei usare un ciclo while ?
Grazie 1000

salvatore_paterna:
Ciao lollo scusa ma in teoria adesso quando cambia lo stato dei galleggianti cambia anche l'istruzione if perché l'istruzione if sms non si resetta ? Dovrei usare un ciclo while ?
Grazie 1000

semplice non si resetta perchè tu non lo hai scritto,

seguimi
quando entra qui

  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
   if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }

supponiamo che la vasca è vuota
per cui accendi la pompa del pozzo e spegni pompa vasca
se è la primavolta che passa da qui mandi anche l'sms e metti a falso la var inviosms
ok?
poi esegui altri 2 controlli
il primo

else if (MAX == LOW  && MIN == LOW) {
   if (SUPERPIENO == LOW ) {
      // queste istruzioni ora non interessano
     }
      else {
        if (inviosms == true ) {
          sms.SendSMS(Mittente, "STATUS:Vasca piena PompaON,VascaON");
          inviosms = false;
        }
        digitalWrite(pompa, HIGH);
        Serial.print ("Pompa pozzo accesa  -  ");
        digitalWrite(vasca, HIGH);
        Serial.println ("Pompa vasca accesa");
      }
}

se entri qui dentro e superpieno non è LOW
se inviosms è vero fai l'invio (ma era gia stato messo a false prima....)

poi c'è il terzo controllo

    else  if  (MAX == LOW  && MIN == HIGH) {
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa 4  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa 4");
    }
  }

e qui di sms non se ne parla
per cui inviosms è sempre falso...

nel quarto blocco
cioè quello dove considera se statoOnOff è falso

  else {
    if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:IMPIANTO SPENTO");
      inviosms = false;
    }
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca ");
    //inviosmsSuperpieno = true;
  }

anche qui se inviosms è vero fa l'invio.... ma è sempre falso

devi trovare il modo di resettare questta condizione, da qualche parte ci deve essere l'istruzione

inviosms=true;

altrimenti dopo il primo sms non ne riceverai mai più

   if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");

    }
Inviosms =  true // se io la resetto fuori dall'if ?cioè qui 
} 
/code]

Ciao Lello e se io la resetto fuori dall'if ?

al prossimo giro ti rimanda l'sms... :smiley:

devi resettarlo quando non c'è più la vasca vuota ....perchè nel frattempo si è riempita :wink:
...relativamente a questo invio. Poi devi controllare anche le altre condizioni di invio che hai inserito ovviamente

Per quello che ti dicevo di creare degli stati che verificherai. Al ritorno della condizione normale di lavoro risetterai la tua variabile TRUE in attesa del prossimo evento. Altrimenti facendo così, come ti ha già detto Patrick ad ogni giro reinvierai l'sms.

Ciao Patrick_M grazie per il consiglio ho modificato il codice e ho risolto adesso funziona .
Grazie anche a Lollo82
alla prossima ciaooo
:smiley: :smiley: :smiley:

devi resettarlo quando non c'è più la vasca vuota ....perchè nel frattempo si è riempita ;)
...relativamente a questo invio. Poi devi controllare anche le altre condizioni di invio che hai inserito ovviamente
#include <gps.h>
#include <GSM.h> 
#include <SIM900.h>
#include <sms.h> 
#include <SoftwareSerial.h>//(10 , 11);// rx, tx
SMSGSM sms;
//GSM gsm;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char nomemittente [16] = "Impianto ULIVETO";
char sedicicrt [16]; // zona di memorizzazione dei primi sedici caratteri del messaggio ricevuto
int i = 0; // indice utilizzato nei cicli di for
int semaforo = 0; // semaforo riconoscimento numero telefono: o = numero riconosciuto;
// 1 = numero sconosciuto
const byte pompa = 4 ;// Il Pin 4 è quello connesso al relè1 della pompa del pozzo
const byte vasca = 5 ;// Il Pin 5 è quello connesso al relè 2 della pompa della vasca di rilancio
const byte gallmax = 7; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 6 ;// Il Pin 12 è quello connesso al galleggiante che segna la vasca vuota
const byte superpieno = 8 ;// Il Pin 8 è quello connesso al galleggiante che segna la vasca troppo piena ANOMALIA
const byte pinOnOff = 52; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 48;// il pin 11 si accende quando l'impianto e on o off
const byte pinOnOffsim = 9;// Il Pin 9 è quello connesso al TASTO CHE GESTISCE SOLO LA POMPA
//GALLEGGIANTI
byte MAX = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MASSIMO CAPACITA'
byte MIN = 0; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MINIMA CAPACITA'
byte SUPERPIENO = 0;//VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO SUPERPIENO
//-----------------------------------------------------------------------------------------------
//stato pulsante on off
byte OnOff = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL PULSANTE SUL PIN 10
byte statoOnOff = 0 ;//Se sistema acceso o spento (HIGH = Acceso)
byte lastOnOff = 0 ;
//-----------------------------------------------------------------------------------------------
//Variabili che memorizzano lo stato dell'invio SmS
bool inviosmsvuoto = true ;
bool inviosmspieno = true ;
bool inviosmsspento = true ;
bool inviosmsSuperpieno = true ;
void setup()
{
  pinMode(pinOnOff, INPUT_PULLUP);   // imposta il pin 10 come pin di INPUT.
  pinMode(pompa, OUTPUT);   // imposta il pin 4 come pin di OUTPUT.
  digitalWrite(pompa, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(vasca, OUTPUT);   // imposta il pin 5 come pin di OUTPUT.
  digitalWrite(vasca, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(gallmax, INPUT_PULLUP);   // imposta il pin 6 come pin di OUTPUT.
  pinMode(gallmin, INPUT_PULLUP);   // imposta il pin 12 come pin di OUTPUT.
  pinMode(superpieno, INPUT_PULLUP);// imposta il pin 8 come pin di OUTPUT.
  pinMode(pinstatoimpianto, OUTPUT);   // indicatore impianto spento o acceso
  pinMode(pinOnOffsim, OUTPUT);
  digitalWrite(pinstatoimpianto, statoOnOff);// indicatore acceso alto

  //Serial connection.
  Serial.begin(19200);
  // GSM setup
  digitalWrite(pinOnOffsim, LOW);
  delay(1000);
  digitalWrite(pinOnOffsim, HIGH);
  delay(1500);  // > 1 secondo
  digitalWrite(pinOnOffsim, LOW);
  delay(2500); // > 2.2 secondi
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
    Serial.println("SIM900 Pronta");
    started = true;
  }
  else
    Serial.println(" SIM900 ko");
}

void loop()
{

  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, 20, smsbuffer, 160); // Leggo il messaggio ed il mittente
      sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
      Serial.print("\n--- SMS Deleted ---\n\n");
      delay (1000);
    }
  }
  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);
  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    inviosmsspento = true ;
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
    while (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      inviosmspieno = true ;
      if (inviosmsvuoto == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosmsvuoto = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
      break;
    }
    while (MAX == LOW  && MIN == LOW)
    {
      inviosmsvuoto = true;
      if (SUPERPIENO == LOW )
      {
        Serial.println ("anomalia  -  ");
        if (inviosmsSuperpieno == true) {
          sms.SendSMS (Mittente, "STATUS:  ANOMALIA  ");
          inviosmsSuperpieno = false;
        }
        digitalWrite(pompa, LOW);
        Serial.print("Pompa pozzo spenta ANOMALIA -  ");
        digitalWrite(vasca, LOW);
        Serial.println("Pompa vasca SPENTA ANOMALIA ");
        break;
      }
      else {
        if (inviosmspieno == true ) {
          sms.SendSMS(Mittente, "STATUS:Vasca piena PompaON,VascaON");
          inviosmspieno = false;
        }
        digitalWrite(pompa, HIGH);
        Serial.print ("Pompa pozzo accesa  -  ");
        digitalWrite(vasca, HIGH);
        Serial.println ("Pompa vasca accesa");
        break;
      }
    }
  }
  else {
    if (inviosmsspento == true ) {
      sms.SendSMS(Mittente, "STATUS:IMPIANTO SPENTO");
      inviosmsspento = false;
    }
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca spenta ");
  }
}