Problema GSM SHIELD

Salve a tutti,
tramite Arduino Ethernet e la GSM Shield vorrei monitorare degli ingressi analogici, ed eventualmente inviare un messaggio ad un numero specificato nel caso in cui il valore di un pin scenda al di sotto di una certa soglia.

E’ la prima volta che uso una GSM Shield e per questo ho fatto delle prove con gli esempi che sono forniti insieme all’ambiente, vi allego il codice:

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];  

void setup() 
{
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  } 

  Serial.println("SMS Messages Receiver");
    
  // connection state
  boolean notConnected = true;
  
  // Start GSM connection
  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");
}

void loop() 
{
  char c;
  
  // If there are any SMSs available()  
  if (sms.available())
  {
    Serial.println("Message received from:");
    
    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);

    // An example of message disposal    
    // Any messages starting with # should be discarded
    if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }
    
    // Read message bytes and print them
    while(c=sms.read())
      Serial.print(c);
      
    Serial.println("\nEND OF MESSAGE");
    
    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
  }

  delay(1000);

}

Ho provato il codice sia inserendo una scheda Noverca, sia una scheda Tiscali: non funziona in entrambi i casi e più precisamente non stampa nulla nemmeno sulla Serial, per questo mi chiedevo se esistono delle limitazioni sui gestori di telefonia mobile che è possibile utilizzare con la GSM shield, qualcuno ne sa qualcosa?

Grazie in anticipo!

Ciao, anche io sono alle prime armi con GSM shield, la prima cosa che ho letto a riguardo è sull'alimentazione: necessitano di tanta corrente per funzionare bene ( io parlo della Icomsat v1.1 che è quella che ho, ma penso che anche per la tua sia un discorso simile) come stai alimentando il tutto? Hai atto due conti sui mA che ti servono? Conta che un modulo GSM può assorbire 2000mA di picco

Ho montato la shield direttamente su Arduino e ho alimentato il tutto con un alimentatore a tensione variabile da 12VA impostando una tensione in uscita di 9V ma comunque non va, sembra bloccarsi alla fase di setup... Tu come hai alimentato? Hai riscontrato dei problemi simili al mio?

Io sto usando uno shield GSM di produzione cinese, i consumi di 2A forse si hanno durante le connessioni GPRS o durante le chiamate, non saprei. Io inviando semplicemente SMS raggiungo picchi di max 300mA, alimentando con la USB del pc non ho alcun problema.

Che shield avete voi?

Vi posto un codice che ho realizzato io per fare alcuni test, alcune precisazioni:

-PIN disabilitato
-Scheda gsm della geeetech (Arduino GPRS Shield - Geeetech Wiki)
-Comunicazione con SoftwareSerial

//-----------------------------------------------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;
unsigned long Time=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() {
  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

  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");
  
  //mySerial.print("ATZ1\r"); //resetta tutto
  Serial.println("INIZIO");
  mySerial.print("AT\r");
  delay(200);
  mySerial.print("AT+IPR=19200\r");
  delay(200);
  mySerial.print("AT+CMGR=1\r"); //Because we want to recieve the SMS in text mode
  delay(200);
  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(200);
  mySerial.print("AT+CLTS=1\r"); // è possibile aggiornare l'orario dalla rete
  delay(200);
  mySerial.print("AT+CSCLK=1\r"); //Enable Sleep mode, slowclock
  delay(200);
  mySerial.print("AT+CMTE=0\r"); //Abilita lettura temperatura interna
  delay(200);
  mySerial.println();
  delay(200);
}

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 = \"+39xXxXxXxXxX\"");//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 Campo_Rete() {
  mySerial.print("AT+CSQ");
  delay(100);
  mySerial.println();
}

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

void setup() {
  delay(1000);
  mySerial.begin(19200);               // the GPRS baud rate   
  Serial.begin(19200);    // the GPRS baud rate 

  pinMode(3, OUTPUT); //D3 pin of Atmega used to drive DTR pin of SIM900
  
  delay(1000);
  //powerDown();
  UnSleep();
  powerUp();
  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
  //f_wdt=1; 
  Time = 4;
}


void loop(){
  if ( (Time++ <3) && (f_wdt==1) ) {
    //f_wdt=0;       // reset flag
    //delay(10);
    system_sleep(); //Spegne Arduino 
  }
  
  if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    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");
          f_wdt=0;       // reset flag
          Time = 0;
          delay(10);
          system_sleep(); //Spegne Arduino
          break;  
        case 'h':
          Serial.println("Comando: h");
          Campo_Rete(); //Resttuisce campo
          break; 
        case 'i':
          Serial.println("Comando: i");
          Get_Temperature(); //Resttuisce temperatur intern
          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);
      }
      if(Testo.indexOf("+CCLK: ") >=0) {
        Serial.print("ORARIO:");
        byte commaPosition = Testo.indexOf("+CCLK: ");
        Testo = Testo.substring(commaPosition+7,commaPosition+20+8);
        Serial.println(Testo);
      }
      if (Testo.indexOf("SETTIME") >=0) {
        byte StartPosition = Testo.indexOf("SETTIME");
        byte commaPosition = Testo.indexOf("*");
        String Aggiornamento = Testo.substring(StartPosition+7,commaPosition);
        Serial.print("CAMBIO AGGIORNAMENTO: ");
        Serial.println(Aggiornamento);
      }
      TestoFlag = 0;
      Testo = "";
    }
  }
}

La SIM di quale operatore è?

Io sto usando la GSM shield di Arduino, quella originale!

Uso una SIM della TIM.

In ogni caso i chip del mio shield e quello dello shield ufficiale Arduino sono differenti :cold_sweat:

sisi senza dubbio, però mi sembra strano che riscontro questi problemi proprio con la scheda "ufficiale" e eseguendo semplicemente lo sketch di esempio

Sicuro di aver disabilitato la richiesta del pin?

sisi la scheda ce l'avevo in un cellulare e la richiesta del pin l'avevo già disabilitata

Questo è quello che mi succede (vedi foto), non esce proprio dalla fase di Setup()

Hai modificato il codice rispetto a quello che hai riportato sopra?

Buon giorno a tutti, sono nuovo del forum e da 2 settimane possessore di una scheda Arduino Uno con abbinata una GSM shield. Sono un elettricista e Arduino mi ha aperto un mondo di soluzioni e progetti, che con pazienza cerco di studiare. Dunque: non riesco ad utilizzare la scheda gsm in quanto ogni progetto che carico mi da' come errore: ...72:error:conversion from 'int' to 'String' is ambiguous....premetto che non conosco l' inglese, ma con il Vostro aiuto spero di poter capire dove sbaglio e rimediare così da poter utilizzare i molti progetti già presenti in rete. Grazie

Facendo delle prove con Arduino Uno e GSM Shield ho capito che la scheda Gsm non era compatibile con l’Arduino Ethernet, montandola sull’Arduino Uno va perfettamente.
Stavo pensando quindi di usare Arduino Uno+Gsm shield solo per la ricezione e l’invio dei messaggi, e di comunicare queste informazioni all’Arduino Ethernet che è la mente pensante di questo progetto.
Per far comunicare i due Arduino ho utilizzato la comunicazione I2C e la relativa libreria Wire, settando Arduino Ethernet come Master e ArduinoUno (con Gsm Shield) come Slave.
Il problema sorge nel momento in cui vado a generare sullo Slave un evento OnReceive(), la funzione che dovrebbe gestire l’evento funziona soltanto se non è troppo complessa :astonished: come un paio di print, tuttavia io vorrei prevedere in quella funzione l’invio di un messaggio, qualcuno può vedere se ho sbagliato qualcosa?
Graziee

Master:

#include <Wire.h>

byte pinAvviso=17;
void setup(){
  Serial.begin(9600);
  Wire.begin();
}

void loop(){
  char msg[20];
  if(digitalRead(pinAvviso)==HIGH){
    Wire.requestFrom(2,20);
    int i=0;
    while(Wire.available()){ 
      msg[i]=Wire.read();
      i++;
    }
   Serial.print("Messaggio Ricevuto: ");
   Serial.println(msg);
  }
  else
    Serial.println("nessun messaggio");
    
    delay(500);
  if(Serial.read()=='x'){
   Serial.println("Provo a trasmettere"); 
   Wire.beginTransmission(2);
   Wire.write("ciao");
   Wire.endTransmission();
  }
  
  delay(1000);
}

Slave:

#include <Wire.h>
#include <GSM.h>

//SLAVE Arduino Uno rev.3 with GSM Shield
GSM gsmAccess;
GSM_SMS sms;
byte pinAvviso = 4;
// Array to hold the number a SMS is retreived from
char number[20]="";  
String messaggio;
void setup() 
{
  Serial.begin(9600);
  
  Serial.println("SMS Messages Receiver");
    
  // connection state
  boolean notConnected = true;
  
  // Start GSM connection
  while(notConnected)
  {
    if(gsmAccess.begin()==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  
  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
  
  Wire.begin(2);
  Wire.onReceive(inviaSms);
  Wire.onRequest(smsToMaster);
  pinMode(pinAvviso,OUTPUT);
  digitalWrite(pinAvviso,LOW);
}

void loop() 
{
  char c;
  char senderNumber[20];
  // If there are any SMSs available()  
  if (sms.available())
  {
    messaggio="";
    Serial.println("Message received from:");
    
    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);

    // An example of message disposal    
    // Any messages starting with # should be discarded
    if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }
    
    // Read message bytes and print them
    while(c=sms.read())
      messaggio+=c;
    
    Serial.print(messaggio);
    Serial.println("\nEND OF MESSAGE");
    
    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
    digitalWrite(pinAvviso,HIGH);
  }
  
  else
    Serial.println("nessun messaggio");

  delay(1000);

}

void inviaSms(int data){
  Serial.print("CI sono");
  String msg="";
  char c;
  char txtMsg[20];
  int i=0;
  while(Wire.available()){
    c=Wire.read();
    msg+=c;
  }
  Serial.println(msg);
  msg.toCharArray(txtMsg,msg.length());
  
  Serial.print("Messaggio da inviare: ");
  Serial.println(txtMsg);
  Serial.println("INVIO MESSAGGIO");
  // send the message
  sms.beginSMS(number);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.println("\nCOMPLETE!\n");

  delay(300);
}

void smsToMaster(){
  Serial.println("Invio al master");
  char txtMsg[20];
  messaggio.toCharArray(txtMsg,20);
  Wire.write(txtMsg);
  messaggio="";
  digitalWrite(pinAvviso,LOW);
  delay(300);
}

roberto77: Buon giorno a tutti, sono nuovo del forum e da 2 settimane possessore di una scheda Arduino Uno con abbinata una GSM shield. Sono un elettricista e Arduino mi ha aperto un mondo di soluzioni e progetti, che con pazienza cerco di studiare. Dunque: non riesco ad utilizzare la scheda gsm in quanto ogni progetto che carico mi da' come errore: ...72:error:conversion from 'int' to 'String' is ambiguous....premetto che non conosco l' inglese, ma con il Vostro aiuto spero di poter capire dove sbaglio e rimediare così da poter utilizzare i molti progetti già presenti in rete. Grazie

Ciao Roberto, l'errore che riporti è dovuto non alla connessione elettronica del dispositivo ma al codice sorgente. Il compilatore ti sta dicendo che non riesce a convertire un tipo intero in un tipo stringa, c'è da vedere come hai scritto l'istruzione. Comunque arduino è un buon inizio ma devi imparare a programmare. Ti consiglio di cominciare con un buon libro di C, tipo "La guida completa C" di Herbert Schildt. "Buon viaggio"....