[SOLUCIONADO] Problemas con Shield GPRS Icomsat 1.1

Hola comunidad tengo un problema con una Shield GPRS Icomsat, resulta que no puedo controlar el enc/apa de un led, ya la he probado para enviar sms y llamar y anda perfecto, pero para controlar, nose si le estoy errando en el programa o me falta algun jumper o algo para la recepcion de sms.
El siguiente codigo es el que envia el sms y anda bien:

 #include <SoftwareSerial.h> 
 SoftwareSerial   SIM900 (0 ,   1 ) ; 
 
 void   setup ( ) 
 { 
   SIM900 . begin ( 19200 ) ; 

   delay ( 20000 ) ;    
 } 
 

 void   sendSMS ( ) 
 { 
   SIM900 . print ( "AT+CMGF=1\r" ) ;                                                      
   delay ( 100 ) ; 
   SIM900 . println ( "AT + CMGS = \"+000000000000\"" ) ;            //Numero donde envia el sms
   delay ( 100 ) ; 
   SIM900 . println ( "Mensaje enviado desde arduino." ) ;         
   delay ( 100 ) ; 
   SIM900 . println ( ( char ) 26 ) ;                       
   delay ( 100 ) ;  
   SIM900 . println ( ) ; 
   delay ( 5000 ) ;                                    
   SIM900power ( ) ;                                     
 } 
 
 void   loop ( ) 
 { 
   sendSMS ( ) ; 
   do   { }   while   ( 1 ) ; 
 }

Y el siguiente codigo es el que controla el led el cual no funciona:

#include <SoftwareSerial.h>  
 char   inchar ;   
 SoftwareSerial   SIM900 (0 ,   1 ) ; 
 
 int   led1   =   13 ; 

 
 void   setup ( ) 
 { 
   Serial . begin ( 19200 ) ; 

   pinMode ( led1 ,   OUTPUT ) ; 

   digitalWrite ( led1 ,   LOW ) ; 

 
 

   SIM900 . begin ( 19200 ) ; 
   delay ( 20000 ) ;    
   SIM900 . print ( "AT+CMGF=1\r" ) ;    
   delay ( 100 ) ; 
   SIM900 . print ( "AT+CNMI=2,2,0,0,0\r" ) ;  
  
   delay ( 100 ) ; 
   Serial . println ( "Ready..." ) ; 
 } 
 

 
 void   loop ( )  
 { 
   if ( SIM900 . available ( )   > 0 ) 
   { 
     inchar = SIM900 . read ( ) ;  
     if   ( inchar == '#' ) 
     { 
       delay ( 10 ) ; 
 
       inchar = SIM900 . read ( ) ;  
       if   ( inchar == 'a' ) 
       { 
         delay ( 10 ) ; 
         inchar = SIM900 . read ( ) ; 
         if   ( inchar == '0' ) 
         { 
           digitalWrite ( led1 ,   LOW ) ; 
         }  
         else   if   ( inchar == '1' ) 
         { 
           digitalWrite ( led1 ,   HIGH ) ; 

           } 
           SIM900 . println ( "AT+CMGD=1,4" ) ;   
         } 
} 
   }
 }

Solo apararece en el monitor Ready… y cuando envio el sms #a1 o #a0 no hace nada tambien he pobrado con otros pines aparte del 13 y no ay caso, si me podrian dar una mano se los agradeceria, muchas gracias

Este es un código similar bastante bien hecho, modificalo

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1);

// EN: String buffer for the GPRS shield message
// FR: Mémoire tampon de type string pour les messages du shield GPRS 
String SmsStorePos = String("");
String msg = String("");
String snTmp = String("");
String snFull = String("");

// EN: Set to 1 when the next GPRS shield message will contains the SMS message
// FR: Est mis à 1 quand le prochain message du shield GPRS contiendra le contenu du SMS
int SmsContentFlag = 0;

// EN: Pin of the LED to turn ON and OFF depending on the received message
// FR: Pin de la LED a allumer/éteindre en fonction du message reçu
int ledPin = 13;

void setup()
{
  mySerial.begin(19200);               // the GPRS baud rate   
  mySerial.print("\r");
  delay(1000);
  Serial.begin(19200);                 // the GPRS baud rate
  Serial.println("Started!");

  pinMode( ledPin, OUTPUT ); 
  digitalWrite( ledPin, LOW ); 
}

void loop()
{
    char SerialInByte;

    if(Serial.available())
    {
       mySerial.print((unsigned char)Serial.read());
     }  
    else  if(mySerial.available())
    {
        char SerialInByte;
        SerialInByte = (unsigned char)mySerial.read();

        // EN: Relay to Arduino IDE Monitor
        // FR: Relayer l'information vers le moniteur Serie Arduino
        Serial.print( SerialInByte );

        // -------------------------------------------------------------------
        // EN: Program also listen to the GPRS shield message.
        // FR: Le programme écoute également les messages issus du GPRS Shield.
        // -------------------------------------------------------------------

        // EN: If the message ends with <CR> then process the message
        // FR: Si le message se termine par un <CR> alors traiter le message 
        if( SerialInByte == 13 ){
          // EN: Store the char into the message buffer
          // FR: Stocké le caractère dans le buffer de message
          ProcessGprsMsg();
         }
         if( SerialInByte == 10 ){
            // EN: Skip Line feed
            // FR: Ignorer les Line Feed 
         }
         else {
           // EN: store the current character in the message string buffer
           // FR: stocker le caractère dans la mémoire tampon réservé au message
           msg += String(SerialInByte);
         }
     }   
}

// EN: Make action based on the content of the SMS. 
//     Notice than SMS content is the result of the processing of several GPRS shield messages.
// FR: Execute une action sur base du contenu d'un SMS.
//     Notez que le contenu du SMS est le résultat du traitement de plusieurs messages du shield GPRS.
void ProcessSms( String sms ){
  sms.toLowerCase();
  Serial.print( "ProcessSms for [" );
  Serial.print( sms );
  Serial.println( "]" );

  if( sms.indexOf("on") >= 0 ){
    digitalWrite( ledPin, HIGH );
    Serial.println( "LED IS ON" );
    return;
  }
  if( sms.indexOf("off") >= 0 ){
    digitalWrite( ledPin, LOW );
    Serial.println( "LED IS OFF" );
    return;
  } else {
    mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
    delay(1000);
    mySerial.print("AT+CMGS=\"");
    mySerial.print(snFull);
    mySerial.print("\"\r");
    delay(1000);
    mySerial.print("Unknown Command: ");
    mySerial.print(sms);
    mySerial.print("\r");
    delay(1000);
    mySerial.write(0x1A);  //Equivalent to sending Ctrl+Z     
    return;
  }
}
// EN: Request Text Mode for SMS messaging
// FR: Demande d'utiliser le mode Text pour la gestion des messages
void GprsTextModeSMS(){
  mySerial.println( "AT+CMGF=1" );
}

void GprsReadSmsStore( String SmsStorePos ){
  // Serial.print( "GprsReadSmsStore for storePos " );
  // Serial.println( SmsStorePos ); 
  mySerial.print( "AT+CMGR=" );
  mySerial.println( SmsStorePos );
}

// EN: Clear the GPRS shield message buffer
// FR: efface le contenu de la mémoire tampon des messages du GPRS shield.
void ClearGprsMsg(){
  msg = "";
}

// EN: interpret the GPRS shield message and act appropiately
// FR: interprete le message du GPRS shield et agit en conséquence
void ProcessGprsMsg() {
  Serial.println("");
  Serial.print( "GPRS Message: [" );
  Serial.print( msg );
  Serial.println( "]" );

  if( msg.indexOf( "Call Ready" ) >= 0 ){
     Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
     GprsTextModeSMS();
  }

  // EN: unsolicited message received when getting a SMS message
  // FR: Message non sollicité quand un SMS arrive
  if( msg.indexOf( "+CMTI" ) >= 0 ){
     Serial.println( "*** SMS Received ***" );
     // EN: Look for the coma in the full message (+CMTI: "SM",6)
     //     In the sample, the SMS is stored at position 6
     // FR: Rechercher la position de la virgule dans le message complet (+CMTI: "SM",6) 
     //     Dans l'exemple, le SMS est stocké à la position 6
     int iPos = msg.indexOf( "," );
     SmsStorePos = msg.substring( iPos+1 );
     Serial.print( "SMS stored at " );
     Serial.println( SmsStorePos );

     // EN: Ask to read the SMS store
     // FR: Demande de lecture du stockage SMS
     GprsReadSmsStore( SmsStorePos );
  }

  // EN: SMS store readed through UART (result of GprsReadSmsStore request)  
  // FR: Lecture du stockage SMS via l'UART (résultat de la requete GprsReadSmsStore)
  if( msg.indexOf( "+CMGR:" ) >= 0 ){
    // get number of sender
    int snPos = msg.indexOf("+1");
    Serial.print("SMS From: ");
    snTmp = msg.substring(snPos+1);
    snFull = "";
    for (int i = 0; i < 11; i++){
      snFull += snTmp[i];    
    }
    Serial.println(snFull);

    // EN: Next message will contains the BODY of SMS
    // FR: Le prochain message contiendra le contenu du SMS
    SmsContentFlag = 1;
    // EN: Following lines are essentiel to not clear the flag!
    // FR: Les ligne suivantes sont essentielle pour ne pas effacer le flag!
    ClearGprsMsg();
    return;
  }

  // EN: +CMGR message just before indicate that the following GRPS Shield message 
  //     (this message) will contains the SMS body
  // FR: le message +CMGR précédent indiquait que le message suivant du Shield GPRS 
  //     (ce message) contient le corps du SMS 
  if( SmsContentFlag == 1 ){
    Serial.println( "*** SMS MESSAGE CONTENT ***" );
    Serial.println( msg );
    Serial.println( "*** END OF SMS MESSAGE ***" );
    ProcessSms( msg );
    delSMS();
  }

  ClearGprsMsg();
  // EN: Always clear the flag
  // FR: Toujours mettre le flag à 0
  SmsContentFlag = 0; 
}
void delSMS() {
  mySerial.print("AT+CMGD=");
  mySerial.println(SmsStorePos);
}

Hola Surbyte gracias por la pronta respuesta, resulta que probe el codigo y tampoco ay caso :disappointed_relieved: , solo el monitor aparece Started, y cuando realizo una llamada me aparece en el monitor ÿÿÿÿÿ (cada letra pertenece a un tono de llamada) y cuando envio el mensaje aparece ÿ,creu que ay en la comunicacion entre el arduino y la shield, pero los jumper de TX y RX los tengo en 0 y 1, la verdad que esto me esta superando...

Como alimentas todo? con el USB? Fijate de alimentarlo con una fuente externa entre 7 y 9 volts DC

Asi es tengo el arduino alimentado con una fuente de 9v 4A ya que la shield no tiene alimentacion externa sino del mismo arduino, y 4A tiene corriente de sobra

Vamos para atras. INtenta correr sketch demos y que funcionen bien. Con eso nos aseguramos el correcto funcionamiento del shield.

Y luego veremos como seguir.

A los skecht demos te referis con los de enviar sms y llamar con escribi al principio? o algun ejemplo de la libreria SoftwareSerial.h?

Si te referis a los de arriba con el envio de sms, andan perfecto.

Creo haberte leido que funcionaban bien, no? Repite a ver. Hay que lograr que funcione alguno que recibe mensajes. COmienza haciendo que reciba un mensaje cualquiera, no necesariamente el que controle el pin de salida. El codigo que te mandé supongo que funciona, luce bien, pero si te arroja eso yyyy no se que decirte. Por eso, cuando pasan esas cosas hay que retroceder y asegurarse que todo funciona bien y luego mirar con otros ojos lo escrito.

O verlo paso a paso, me refiero a debugueandolo. Agrega lineas que te muestren por monitor serie todo lo que hace el shield en cada paso a ver si detectas el error de ese modo. Cada respuesta del shield. luego las quitas o las marcas con //

Bueno surbyte despues de tanto buscar y correjir, logre hacer funcionar un codigo, pero solo en el arduino uno, en el mega falla.

el codigo es el siguiente

#include "SIM900.h"
#include "SoftwareSerial.h"
#include "sms.h"
SMSGSM sms;

boolean started=false;
char smsbuffer[160];
char n[20];
int inc=10;
int  porta = 13;

char number[]="+1234567890";

void setup() 
{
  pinMode(porta,OUTPUT);
  
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  
  if (gsm.begin(19200)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  if(started){
    delsms();
  }

};

void loop() 
{
  int pos=0;
 
  if(started){
    pos=sms.IsSMSPresent(SMS_ALL);
    if(pos){
      Serial.println("IsSMSPresent at pos ");
      Serial.println(pos); 
      sms.GetSMS(pos,n,smsbuffer,100);
      Serial.println(n);
      Serial.println(smsbuffer);
      if(!strcmp(smsbuffer,"B")){
        Serial.println("BLOQUEO");
        digitalWrite(porta,LOW);
        delay(100);
        if (sms.SendSMS(number, "LED APAGADO"))
        Serial.println("\nSMS sent OK");
      }      
      if(!strcmp(smsbuffer,"D")){
        Serial.println("DESBLOQUEO");
        digitalWrite(porta,HIGH);
		delay(100);
		if (sms.SendSMS(number, "LED ENCENDIDO"))
        Serial.println("\nSMS sent OK");
      }    
      delsms();
    }
  }
}

void delsms(){
  Serial.println("delsms");
  for (int i=0; i<10; i++){  //do it max 10 times
    int pos=sms.IsSMSPresent(SMS_ALL);
    if (pos!=0){
      Serial.print("\nFind SMS at the pos ");
      Serial.println(pos); 
      if (sms.DeleteSMS(pos)==1){    
        Serial.print("\nDeleted SMS at the pos ");
        Serial.println(pos);      
      }
      else
      {
        Serial.print("\nCant del SMS at the pos ");
        Serial.println(pos);         
      }
    }
  }

}

Adjunto la biblioteca que uso, y segun el creador ay que modificar lo siguiente:

*Abrir GSM.h y descomentar el mega y comentar el uno, asi:
//#define UNO
#define MEGA

*Abrir HWSerial.h, en el caso que use Arduino Mega descomentar el mega, asi:
#define MEGA

*Abrir GSM.cpp comentar o descomentar segun sea la shield, en este caso la sim900 van los pines 2 y 3

//#define GSM_TXPIN 4
//#define GSM_RXPIN 5
#define GSM_TXPIN 2
#define GSM_RXPIN 3

Luego que hago todo esto cargo de nuevo la libreria y el skecht no se deja carga y tira este error:

In file included from C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:17:
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\/GSM.h:192: error: 'HWSerial' does not name a type
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In constructor 'GSM::GSM()':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:37: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In member function 'virtual int GSM::begin(long int)':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:48: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In member function 'char GSM::SendATCmdWaitResp(const char*, uint16_t, uint16_t, const char*, byte)':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:355: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In member function 'char GSM::SendATCmdWaitResp(const __FlashStringHelper*, uint16_t, uint16_t, const char*, byte)':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:400: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In member function 'byte GSM::IsRxFinished()':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:444: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:481: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In member function 'void GSM::RxInit(uint16_t, uint16_t)':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:609: error: '_cell' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp: In member function 'void GSM::Echo(byte)':
C:\Program Files (x86)\Arduino\libraries\GSMSHIELD\GSM.cpp:618: error: '_cell' was not declared in this scope

Luego de leer ese error fui a GSM.H y descomente la linea //#include “HWSerial.h” quedando asi:
#include “HWSerial.h”
Echo eso me carga el skecht sin problemas pero al iniciarlo queda el monitor serial en GSM Shield testing. sin arrojar ningun otro dato y mandando el mensaje tampoco produce algun cambio.

Espero que me puedas dar una mano… Desde ya muchas gracias…

PD: La libreria que subo esta original sin ninguna modificacion que dice el autor, con esa libreria si anda en el arduino uno.

GSMSHIELD.zip (48.2 KB)

Que versión IDE estas usando?

Algo mas respecto de los yyyyy que recibes, no será que tienes mal alguna velocidad del serial? verifica. Recién leía el topico de ROV submarino y no se si a noter le ocurrió eso, recibía caracteres raros y era el puerto serial mal configurado. Por lo que vi todos los ejemplos son en 19200 pero prueba a ver si algo pasa por ahi.

Hola surbyte un la 1.0.5 r2 y la velocidad ya la toque pero como los ejemplos anteriores me tiraba esos caracter y ahora con el skechet nuevo anda perfecto en el arduino uno y falla en el mega

Bueno surbyte, logre hacerlo funcionar en el arduino MEGA, buscando info encontre que NO todos los pines en la Mega y Mega 2560 pueden tener un cambio de soporte, por lo que solamente los siguientes pines puede ser utilizado para RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67 , 68, 69.

Asi que realize el siguiente cambio en GSM.cpp

define GSM_TXPIN 50

define GSM_RXPIN 18

Para que funcione ay que sacar los jumper y hacer un puente de la linea TXD de la shield al pin 50 del MEGA y otro puente entre de la linea RXD de la shield al pin 18 del MEGA...

Muchas gracias... :grin:

Saludos. Con el mega te hubiese ahorrado problemas y usado uno de los puertos adicinales que trae, ya que el mega tiene 4 puertos seriales

Hola. Acaba de comprar un ICOMSAT 1.1. Mi duda tiene que ver con el pin de seguridad que el operador declara. Por ejemplo, yo tengo una línea móvil prepago con el ICE y dicha línea tiene un pin de seguridad de 4 digitos. En pocas palabras, cada vez que reinicio un celular dejo ingresar este valor. Existe dentro de los sketches que ustedes bajaron una línea donde se declara este parámetro??

Ola amigos tengo el mismo problema mi shield es la GPRS v1.1(B) y ya le cargue al arduino el primer codigo que publicaron y no me funciona sabran como por q mi chip es movistar y por ejemplo movistar cuando le marcas y no tienes señal te manda a buzon ovio pero cuando te llega la señal movistar te manda un mensaje que el numero que marcaste ya esta disponible y asi me pasa aki apago la shield y me manda a buzon y la enciendo y ya me manda el mensaje de que esta el chip disponible pero no me llega el msn que esta predeterminado con el arduino que puede ser amigos!!

Hola como estan,

Les comento lo que hice a ver si me estoy equivocando en algo y no me doy cuenta porque no me funcion:

En el GSM.h comente la línea de Arduino UNO y deje la de MEGA

//#define UNO
#define MEGA

En el archivo HWSerial.h descomente el #define MEGA

Y en GSM.cpp realicé los siguientes cambios:

//#define _GSM_TXPIN_ 2
//#define _GSM_RXPIN_ 3

#define _GSM_TXPIN_ 50
#define _GSM_RXPIN_ 18

Alimente el arduino mega con una fuente de 9v y 1 amp

Finalmente realicé un puente de la linea TXD de la shield al pin 50 del MEGA y otro puente entre de la linea RXD de la shield al pin 18 del MEGA

Sin embargo no me funciona, probe con dos shield, uno de la marca TinySine y otro un mini SIM900a pero el resultado es el mismo, lo logro hacer que funcione el ejemplo de la libreria para enviar una petición Get, les dejo el código:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to start a connection as client.


InetGSM inet;
//CallGSM call;
//SMSGSM sms;

char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;

void setup()
{
    //Serial connection.
    Serial.begin(9600);
    
};

void loop()
{

    gsmStarted(); 
     
    //Read for new byte on serial hardware,
    //and write them on NewSoftSerial.
    serialhwread();
    //Read for new byte on NewSoftSerial.
    serialswread();

  
};



void gsmStarted(){
 
   Serial.println("GSM Shield testing.");
    //Start configuration of shield with baudrate.
    //For http uses is raccomanded to use 4800 or slower.
    if (gsm.begin(2400)) {
         Serial.println("\nstatus=READY");
         started=true;
    } else Serial.println("\nstatus=IDLE");

    if(started) {
         //GPRS attach, put in order APN, username and password.
         //If no needed auth let them blank.
         if (inet.attachGPRS("internet.wind", "", ""))
              Serial.println("status=ATTACHED");
         else Serial.println("status=ERROR");
         delay(1000);

         //Read IP address.
         gsm.SimpleWriteln("AT+CIFSR");
         delay(5000);
         //Read until serial buffer is empty.
         gsm.WhileSimpleRead();

         //TCP Client GET, send a GET request to the server and
         //save the reply.
         numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);
         //Print the results.
         Serial.println("\nNumber of data received:");
         Serial.println(numdata);
         Serial.println("\nData received:");
         Serial.println(msg);
    }
 
 }







void serialhwread()
{
    i=0;
    if (Serial.available() > 0) {
         while (Serial.available() > 0) {
              inSerial[i]=(Serial.read());
              delay(10);
              i++;
         }

         inSerial[i]='\0';
         if(!strcmp(inSerial,"/END")) {
              Serial.println("_");
              inSerial[0]=0x1a;
              inSerial[1]='\0';
              gsm.SimpleWriteln(inSerial);
         }
         //Send a saved AT command using serial port.
         if(!strcmp(inSerial,"TEST")) {
              Serial.println("SIGNAL QUALITY");
              gsm.SimpleWriteln("AT+CSQ");
         }
         //Read last message saved.
         if(!strcmp(inSerial,"MSG")) {
              Serial.println(msg);
         } else {
              Serial.println(inSerial);
              gsm.SimpleWriteln(inSerial);
         }
         inSerial[0]='\0';
    }
}

void serialswread()
{
    gsm.SimpleRead();
}