Gsm shield non funziona più!

Salve a tutti,

come da oggetto durante una serie di prove sulle varie combinazioni di sleep mode è successo che ad un certo punto non posso più conunicare con la scheda gsm.

Qualcuno di voi sa darmi una mano? grazie!

ciao schemi e sketch

Ho cercato di capire un pò meglio la situazione. Il problema sembra essere nella comunicazione seriale (ho letto molto in rete ma non ho risolto i miei problemi). Stamattina, dopo aver lasciato tutto scollegato per l’intera notte, ho fatto girare lo sketch che riporto a presso; ha funzionato una volta ricevendo correttamente i comandi AT, poi lo shield GSM non ha più risposto a dovere. Ecco il codice:

//-----------------------------------------------WATCHDOG
#include <avr/sleep.h>
#include <avr/power.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
//-----------------------------------------------WATCHDOG_fine

#include <SoftwareSerial.h>
#include <String.h>
SoftwareSerial mySerial(5, 6);
String Testo = "";
byte TestoFlag = 0;

//-----------------------------------------------WATCHDOG
volatile boolean f_wdt=1;
//-----------------------------------------------WATCHDOG_fine

//---------------------------------------------------------------------------------------------------------------------WATCHDOG
//****************************************************************  
// set system into the sleep state 
// system wakes up when wtchdog is timed out
void system_sleep() {
  
  Serial.println("Avvio modalità sleep Arduino");

  cbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter OFF

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
  sleep_enable();

  sleep_mode();                        // System sleeps here
  
  Serial.println("Disabilito modalità sleep Arduino");
  sleep_disable();                     // System continues execution here when watchdog timed out 
  sbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter ON

}

//****************************************************************
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {

  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;
  //Serial.println(ww);


  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCSR = bb;
  WDTCSR |= _BV(WDIE);


}
//****************************************************************  
// Watchdog Interrupt Service / is executed when  watchdog timed out
ISR(WDT_vect) {
  f_wdt=1;  // set global flag
}
//---------------------------------------------------------------------------------------------------------------------WATCHDOG_fine


void powerUp() {
  Serial.println("Accensione GSM");
  pinMode(9, OUTPUT); 
  digitalWrite(9,LOW);
  delay(1000);
  digitalWrite(9,HIGH);
  delay(2000);
  digitalWrite(9,LOW);
  delay(3000);
  Serial.println("GSM Acceso");
}

void powerDown() {
  
  Serial.println("Spegnimento GSM");
  pinMode(9, OUTPUT); 
  digitalWrite(9,LOW);
  delay(1000);
  digitalWrite(9,HIGH);
  delay(2000);
  digitalWrite(9,LOW);
  delay(3000);
  Serial.println("GSM Spento");
  /*
  mySerial.print("AT+CPOWD=1\r");
  delay(100); */
}

 void SendTextMessage() {
  mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
  delay(100);
  mySerial.println("AT + CMGS = \"+39380.......\"");//send sms message, be careful need to add a country code before the cellphone number
  delay(100);
  mySerial.println("A test message!");//the content of the message
  delay(100);
  mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  mySerial.println();
}

void GetTimeStamp() {
  mySerial.print("AT+CCLK?");
  delay(100);
  mySerial.println();
}

void SetTime(String time) {
  //  AT+CCLK ="12/12/26,15:04:50+08"
  String command ="\"AT+CCLK =\"";
  command.concat(time);
  command.concat("\"");
  mySerial.print(command);
  delay(100);
  mySerial.println();
}

void Sleep() {
  Serial.println("Avvio modalità sleep GSM");
  digitalWrite(3, HIGH);
  delay(100);
  Serial.println("Modalità sleep GSM avviata");
}

void UnSleep() {
  Serial.println("Disabilito modalità sleep GSM");
  digitalWrite(3, LOW); //wake up SIM900
  delay(100);// a minimim of 50msec is req
  Serial.println("Modalità sleep GSM disabilitata");
}

void setup() {
  delay(1000);
  ////-----------------------------------------------WATCHDOG
  //  /*** Configure the timer.***/
    
  //cbi( SMCR,SE );      // sleep enable, power down mode
  //cbi( SMCR,SM0 );     // power down mode
  //sbi( SMCR,SM1 );     // power down mode
  //cbi( SMCR,SM2 );     // power down mode

  //setup_watchdog(9);
  //-----------------------------------------------WATCHDOG_fine
  mySerial.begin(19200);               // the GPRS baud rate   
  Serial.begin(19200);    // the GPRS baud rate 
  delay(1000);
  powerDown();
  powerUp();
  UnSleep();
  delay(6000);
  //mySerial.print("ATZ1\r"); //resetta tutto
  Serial.println("INIZIO");
  mySerial.print("AT\r");
  delay(100);
  mySerial.print("AT+ITR=19200\r");
  delay(100);
  mySerial.print("AT+CMGR=1\r"); //Because we want to recieve the SMS in text mode
  delay(100);
  mySerial.print("AT+CNMI=2,2,0,0,0\r"); // blurt out contents of new SMS upon receipt to the GSM shield's serial out
  delay(100);
  mySerial.print("AT+CLTS=1\r"); // è possibile aggiornare l'orario dalla rete
  delay(100);
  mySerial.print("AT+CSCLK=1\r"); //Enable Sleep mode, slowclock
  delay(100);
  mySerial.println();
  delay(100);
  
  pinMode(3, OUTPUT); //D3 pin of Atmega used to drive DTR pin of SIM900
  
 f_wdt=1; 
}


void loop()
{
//if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
//  f_wdt=0;       // reset flag
  if (Serial.available()) {
    mySerial.write(Serial.read());
    switch(Serial.read())
    {
      case 't': //Invia messaggio
        Serial.println("Comando: t");
        SendTextMessage();
        break;
      case 'a':
        Serial.println("Comando: a");
        GetTimeStamp(); //Stampa orario
        break;
      case 'b':
        Serial.println("Comando: b");
        Sleep(); //Sleep GSM
        break;
      case 'c':
        Serial.println("Comando: c");
        UnSleep(); //UnSleep GSM
        break;
      case 'd':
        Serial.println("Comando: d");
        powerDown(); //Spegni
        break;
      case 'e':
        Serial.println("Comando: e");
        powerUp(); //Accendi
        break;
      case 'f':
        Serial.println("Comando: f");
        mySerial.print("AT+CSCLK?\r"); //Enable Sleep mode, slowclock
        delay(100);
        break;
      case 'g':
        Serial.println("Comando: g");
        system_sleep(); //Spegne Arduino
        break;  
        
    }
  }
  
  
  if (mySerial.available()) {
    TestoFlag = 1;
    char temp = mySerial.read();
    Testo.concat(temp);
    Serial.write(temp);
  } else if (TestoFlag == 1) {
    //Serial.println(Testo);
    if(Testo.indexOf("+CMT: ") >=0) {
      Serial.println("MESSAGGIO: ");
      byte commaPosition = Testo.indexOf("+CMT: ");
      Testo = Testo.substring(commaPosition+6,Testo.length());
      commaPosition = Testo.indexOf(",");
      String Mittente = Testo.substring(1,commaPosition-1);
      Serial.print("Mittente:");
      Serial.println(Mittente);
      commaPosition = Testo.indexOf(",");
      Testo = Testo.substring(commaPosition+1);
      commaPosition = Testo.indexOf(",");
      String Data = Testo.substring(commaPosition+2,commaPosition+2+20);
      Serial.print("Data:");
      Serial.println(Data);
      Serial.println("AGGIORNO ORARIO");
      SetTime(Data);
    }
    TestoFlag = 0;
    Testo = "";
  }
//}
}

Ho commentato momentaneamente la modalità sleep di Arduino in quanto sembrava creare problemi su problemi. Ecco l’output che ricevo facendo girare lo sketch:

Spegnimento GSM
GSM Spento
Accensione GSM
GSM Acceso
Disabilito modalità  sleep GSM
Modalità  sleep GSM disabilitata
INIZIO
ÿ ÿÿÿÿÿÿÿÿ

Ho fatto altre prove ovvero ho tolto all'inizio la funzione spegnimento/accensione lasciando solo l'accensione ed ho commentato la linea mySerial.write(Serial.read()); nella funzione loop(). Adesso sembra andare...

Secondo voi sto facendo troppo "casino" oppure i problemi sono motivati?