Problema con GSM/GPRS Shield V2.0

Salve , ho acquistato questo shield già assemblato da Robot italy (http://www.robot-italy.com/it/gsm-gprs-shield-v2-0.html)
Sto cercando ora di utilizzarlo per accendere il riscaldamento da remoto , ma trovo un grosso problema :
Delle volte accendo arduino , accendo il modem posizionato sullo shield e l’algoritmo funziona perfettamente , in altre occasioni purtroppo qualsiasi sms io invio ad arduino ottengo sulla seriale una risposta fissa cioè “ÿ”(255) .
Se mando degli ATcomand sulla seriale per far inviare sms o per fare una chiamata non succede nulla , ne ottengo qualcosa sulla seriale ne succede qualcosa .
Sono giorni che ci lavoro ma non capisco il problema , la mattina mi alzo e tutto funziona , puntualmente dopo pranzo smette di funzionare…
Spero che qualcuno di voi trovi nel mio codice un errore o abbia già e incontrato e risolto questo problema .
Grazie dell’attenzione

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <String.h>

//VARIABILI
float temperatura=0;
unsigned long temporilevazione=0;
float temprif=8;
boolean statoriscaldamento=false;
boolean abilitazione=true;







SoftwareSerial mySerial(7,8);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
  Serial.begin(19200);
  mySerial.begin(19200);
  mySerial.flush();
  Serial.flush();
  lcd.begin(16,2);
  Serial.println("MESSAGGIO");
  pinMode(6,OUTPUT);
}
void loop()
{
  
  // CONTROLLI ASINCRONI 
  if(millis()-temporilevazione>10000)
  {
    temperatura=(5*analogRead(0)*100)/1024;
    lcd.setCursor(0,0);
    lcd.print("reale:");
    lcd.setCursor(8,0);
    lcd.print(temperatura);
    temporilevazione=millis();  
    if((temprif>temperatura))
    {
      digitalWrite(6,HIGH);
      statoriscaldamento=true;
      lcd.setCursor(10,1);
      lcd.print("ACCESO");
    }
    else
    {
      digitalWrite(6,LOW);
      statoriscaldamento=false;  
      lcd.setCursor(10,1);
      lcd.print("spento");
    }
    lcd.setCursor(0,1);
    lcd.print("imp:");
    lcd.setCursor(5,1);
    lcd.print(temprif);
    
    
  }
  
  
  
  
  
  String testo=ShowSerialData();
  if(testo!="")
  {
    int pos=testo.indexOf("#");
    testo=testo.substring(pos+1,pos+3);
    Serial.println(testo);
    lcd.setCursor(0,1);
    // CONTROLLI SU STRINGA
    temprif=stringToInt(testo);
    Serial.println(temprif);
    
    
  }
}
void SendTextMessage(int temperatura)
{
  Serial.println("TRA POCO INVIERò IL MESSAGGIO");
  mySerial.print("AT+CMGF=1\r");  
  delay(100);
  mySerial.println("AT + CMGS = \"+393338090970\"");
  delay(100);
  mySerial.println(temperatura);
  delay(100);
  mySerial.println((char)26);
  delay(100);
  mySerial.println();
}
void DialVoiceCall()
{
  mySerial.println("ATD + +393338090970;");
  delay(100);
  mySerial.println();
}
 
String ShowSerialData()
{
  String s="";
  while(mySerial.available()!=0)
  {
    s=s+(char)mySerial.read();
  }
  return s;
}
int stringToInt(String s){
  byte sLen = s.length();
  int retNum = 0;
  
  for(byte k=0; k < sLen; k++){
    retNum += ((byte)s.charAt(k)-48) * pow(10, sLen-k-1);
  }
  return retNum;
}

tieni d'occhio la RAM, sul playground trovi il codice per farlo.

Mi puoi dire qualcosa in più su cosa dovrei cercare ?
Comunque non penso sia un problema di ram in quanto compilando questo codice :

#include <SoftwareSerial.h>
#include <String.h>

SoftwareSerial mySerial(7,8);
void setup()
{
  Serial.begin(19200);
  mySerial.begin(19200);
}
void loop()
{
  if(mySerial.available())
    Serial.print(mySerial.read());
  if(Serial.available())
    mySerial.print(Serial.read());
}

e utilizzando un programma come Cooltem per leggere i dati sulla seriale ottengo comunque sempre 255 sulla seriale dopo ogni sms inviato ad arduno

ma scusa, dopo aver inviato un SMS ricevi UN carattere 255, o ne ricevi un tot, o li ricevi all’infinito?

Un solo carattere dopo ogni sms che invio ad Arduino

e allora leggi bene il manuale, sarà un valore che ti dice "ok mesaggio inviato" o qualcosa del genere

Purtroppo quando succede quella cosa non funziona più la seriale , e dopo ore torna a funzionare senza nessun procedimento ! È non ho nessun manuale dove controllare quel codice a cosa corrisponde

il chip usato è il SIM900, quindi devi vedere cosa ti dice il manuale tecnico di quel chip

In allegato il manuale dei comandi accettati dal SIM900.

Come indicato a pagina 12, il modulo ad ogni comando AT terminato da risponde con stringa di tipo
.

E’ evidente che si deve gestire la risposta, quanto meno ripulendo il buffer di ricezione se non interessa la risposta.

Attenzione: non usare flush() che, con i nuovi IDE, si limita a svuotare il buffer di trasmissione).

Ti faccio notare, inoltre, che tu usi mySerial.println("AT + CMGS = “+393338090970"”);

e questo invia oltre la anche un che viene interpretato come un secondo comando!

SIM900_AT_commands V103.pdf (1.98 MB)

Ti ringrazio per aver letto tutto il mio codice e per l’aiuto . Nonostante tu sia stato molto chiaro date le mie scarse conoscenze ho capito ben poco , quindi ti lascio alcune domande :

  • Se è carriage return , a cosa corrisponde ?
  • Se flush non ripulisce il buffer come posso fare ?
  • Hai magari un idea di quella risposta 255 cosa possa significare ? ( nel manuale ho trovato decine di errori che posso ridare un parametro 255)
    Ti ringrazio di avermi allegato il manuale che ora andrò a leggermi sperando di capire qualcosa .

= Carriage Return = 0x0D = 13 = ’ \r ’
= Line Feed = 0x0A = 10 = ’ \l ’

Il buffer di ricezione si pulisce scaricando tutti caratteri:

while (mySerial.available()) 
{
  char R = mySerial.read();
  Serial.print(R);           // verifica in caratteri stampabili
  Serial.println(R, HEX); // verifica in valore esadecimale
}

Prova anche ad abbassare la velocità a 9600 per entrambe le seriali.

non giocare col baudrate, è standard così com'è

Esatto , 19200 è quello di default dello shield quindi non penso sia necessario cambiarlo !
Lesto tu hai magari del codice su come ricevere messaggi con questo shield ? Ti chiedo perchè ti vedo molto Ferrato :slight_smile: Vorrei cercare delle differenze con il mio , non copiartelo spudoratamente ..

mai avuto questa scheda, ma essendo il SIM900 un chip utilizzatissimo (per esempio lo usa anche FuturaElettronica, e il loro sviluppatore bazzica sul forum) trovi un sacco di esempi/librerie.

Risposte sempre e solo 255 , penso che mi arrenderò a comprare lo shield originale di arduino per utilizzare la libreria già fatta ...

guarda che la libreria "già fatta" funziona anche su quelli non originali, se il chip è lo stesso. Al massimo sono da cambiare i pin della SoftSerial