Problema con Libreria SIM900.h con modulo gsm SIM900

Buongiorno, volevo chiedevi un piccolo aiuto non riesco a capire perché la libreria SIM900.h mi da problema con le stringhe

C:\Users\Salvatore\Documents\Arduino\prova4\prova4.ino: In function 'void loop()':

C:\Users\Salvatore\Documents\Arduino\prova4\prova4.ino:107:58: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

           sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS

                                                          ^

C:\Users\Salvatore\Documents\Arduino\prova4\prova4.ino:111:58: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

           sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS


C:\Users\Salvatore\Documents\Arduino\libraries\GSMSHIELD-master\SIM900.cpp:329:38: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Lo sketch usa 12006 byte (37%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 1579 byte (77%) di memoria dinamica, lasciando altri 469 byte liberi per le variabili locali. Il massimo è 2048 byte.
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità

sotto ho inserito il codice del mio progetto fatto grazie all'aiuto di Brunello22 ,

#include "SIM900.h"
#include <SoftwareSerial.h>
SoftwareSerial  Sim900Serial(2, 3);// rx, tx
#include "sms.h"

SMSGSM sms;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char mittenteregistrato [14] = "+393891335767" ; // numero del mittente registrato (conosciuto)
char nomemittente [16] = "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 = 6; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 12 ;// 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 = 10; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 11;// 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(9600);
  // GSM setup
  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, 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
    }

  }



  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 ");
    }

    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,VascaOFF");
          inviosms = false;
        }
        digitalWrite(pompa, HIGH);
        Serial.print ("Pompa pozzo accesa  -  ");
        digitalWrite(vasca, HIGH);
        Serial.println ("Pompa vasca accesa");
      }
    }
  }

  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 spenta ");
   // inviosmsSuperpieno = false; 
  }
 
}

In realtà ti da solo un warning che puoi trascurare.

Guglielmo

Ciao gbp01 mi crea il problema che non mi invia i messaggi al cambio dell'if

salvatore_paterna:
Ciao gbp01 mi crea il problema che non mi invia i messaggi al cambio dell'if

Non è li il problema, è altrove ...

Guglielmo

Può essere che sbaglio quando resetto la variabile che controlla se il messaggio è stato inviato ?!

NON so, non ho esaminato il codice ...
... fai un po' di "debug" inserendo delle Serial.print() nei punti dove ritienti che il codice debba passare e stampa le variabili coinvolte.

Guglielmo

Il codice funziona l'unico problema che non invia il messaggio

avevo cominciato a leggerlo ma qui mi sono arreso

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

con tutti sti onoff mi sono perso :slight_smile:

Ciao Patrick e un pulsante che accende e spegne l'impianto

buongiorno Guglielmo ho fatto delle prove ma adesso mi stampa questi errori

ATT: OK
RIC: 
OK

ATT: +CMGL:
RIC: 
OK

Pompa pozzo accesa  -  Pompa vasca accesa
ATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK

Non riesco a capire quale il problema i galleggianti funzionano e anche i vari "if" attivando e disattivando i relé che gestiscono le pompe ma la funzione GSM no

buongiorno a tutti non riesco a trovare una soluzione al mio problema !!

Pompa pozzo spenta  -  Pompa vasca spenta 
ATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: NO STRING RCVDATT: OK
RIC: 
O
ATT: OK
RIC: 
OK

mi stampa i risultati del cambio di stato e poi mi da questi errori .

Purtroppo non ti posso aiutare ... MAI usato librerie con i SIM, voglio sapere quello che faccio e quello che ricevo, senza "interpretazioni" da parte di qualcuno che ha scritto la libreria, per cui ... li uso direttamente con i comandi AT via seriale e ... mai avuto problemi a ricevere/trasmettere SMS.

Guglielmo

Buongiorno Guglielmo quindi mi conviene modificare e non usare la libreria !
adesso provo grazie

salvatore_paterna:
Buongiorno Guglielmo quindi mi conviene modificare e non usare la libreria !

SE sai gestire bene la seriale e le stringhe classiche del 'C' (char array) e non hai problemi ... mi dici perché ti porti dietro un'intera libreria quando, alla fine, ti servono solo poche cose?

Diverso è se non si sa gestire la seriale e non si sanno manipolare le stringhe classiche ...

Guglielmo

secondo me hai un problema di risorse... 77% di memoria dinamica occupata non è un buon auspicio...
poi sotto lo specifica. potrebbero presentarsi problemi di stabilità.
A me è capitato che con il 79% dopo qualche minuto tutto andava in palla.... e ho dovuto ripiegare in altro modo...

grazie a questo punto proverò come consigliato da Guglielmo