ayuda para guardar datos desde SIM 900 a Tarjeta de memoria SD

hola a todos

quisiera saber si alguien me pudiera dar una idea de como guardar los datos desde un modulo SIM 900 a una tarjeta SD ( o una variable array para empezar)

leo los datos (leo los sms) que me llegan y separo el numero telefonico, el mensaje y la posicion de ese mensaje en la tarjeta SIM y los imprimo en el monitor serial PERO no he podido guardarlos ni en un array menos en una tarjeta SD, si alguien puede dar un breve ejemplo con algo de codigo , lo agradeceria mucho para asi poder buscar la solucion

mi sim 900 es de geeetech por lo cual no me sirven unas librerias que andan por ahi y que facilitarian el trabajo.

a continuación va el codigo funcionando que recibe los datos y los imprime . Saludos

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7,8); // conexion con el sim 900

String msg = String("");
int SmsContentFlag = 0;
int i;

void setup()
{
mySerial.begin(9600);
Serial.begin(9600);

}
void loop()
{
char SerialInByte;

if(Serial.available())
{
mySerial.print((unsigned char)Serial.read());
}
else if(mySerial.available())
{
char SerialInByte;
SerialInByte = (unsigned char)mySerial.read();
Serial.print( SerialInByte );
if( SerialInByte == 13 ){
ProcessGprsMsg(); // esta es la unica funcion que se ejecuta en el loop
}
if( SerialInByte == 10 ){
}
else {
msg += String(SerialInByte);
}
}
}

void ProcessSms( String sms ){
Serial.print( "ProcessSms for [" );
Serial.print( sms );
Serial.println( "]" );

}

void GprsTextModeSMS(){
mySerial.println( "AT+CMGF=1" );
}

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

void ClearGprsMsg(){
msg = "";
}

void ProcessGprsMsg() { // aca empieza la unica funcion del loop

if( msg.indexOf( "Call Ready" ) >= 0 ){
Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
GprsTextModeSMS(); // llama a esta funcion que esta antes para que escoja modo texto
}

if( msg.indexOf( "+CMTI" ) >= 0 ){
int iPos = msg.indexOf( "," );
String SmsStorePos = msg.substring( iPos+1 ); // aca esta el storepos ubicacion del sms en la SIM del telefono
Serial.print( "SMS stored at " );
Serial.println( SmsStorePos );
GprsReadSmsStore( SmsStorePos );
}

if( msg.indexOf( "+CMGR:" ) >= 0 ){
int tPos = msg.indexOf( "," );
String Telefono = msg.substring( tPos+6,tPos+14 ); // aca esta el telefono
Serial.print( "telefono que llama " );
Serial.println( Telefono );
SmsContentFlag = 1;
ClearGprsMsg();
return;
}

if( SmsContentFlag == 1 ){
String mensaje_sms= msg; // aca esta el mensaje sms
Serial.println( "*** SMS " );
Serial.println(mensaje_sms );
Serial.println( "
END OF SMS MESSAGE ***" );
ProcessSms( msg );
}
ClearGprsMsg();
SmsContentFlag = 0;
}

codigo_sim_900_prueba.ino (2.3 KB)

Debería ser algo así:

agregas la referencia a la librería SD

#include <SD.h>

Inicializas la SD

Serial.print("Inicializando tarjeta SD.");

  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);

  if (!SD.begin(4)) {
    Serial.println("Inicialización fallida!");
  }
  Serial.println("Inicialización completada.");

en la función ProcessSms() guardas la información en la SD

//guarda en la SD
File myFile = SD.open("sms.txt", FILE_WRITE);

if(myFile){
  myFile.println(sms);
  myFile.close();    
}

además he eliminado esto de tu código

String mensaje_sms= msg;  // aca esta el mensaje sms

no entiendo porque copias el mensaje a una nueva variables si ya está en msg

if( SmsContentFlag == 1 ){
    Serial.println( "*** SMS ***" );
    Serial.println(msg );
    Serial.println( "*** END OF SMS MESSAGE ***" );
    ProcessSms( msg );     
  }

el código completo quedaría así

#include <SoftwareSerial.h>
#include <SD.h>  
 
SoftwareSerial mySerial(7,8); // conexion con el sim 900
 
String msg = "";
int SmsContentFlag = 0; 

void setup()
{
  mySerial.begin(9600);               
  Serial.begin(9600); 

  Serial.print("Inicializando tarjeta SD.");

  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);

  if (!SD.begin(4)) {
    Serial.println("Inicialización fallida!");
  }
  Serial.println("Inicialización completada.");                
 
}
void loop()
{
    char SerialInByte;

    if(Serial.available())
    {
       mySerial.print((unsigned char)Serial.read());
     }  
    else  if(mySerial.available())
    {
        char SerialInByte;
        SerialInByte = (unsigned char)mySerial.read();
        Serial.print( SerialInByte );
        if( SerialInByte == 13 ){ 
          ProcessGprsMsg();                   // esta es la unica funcion que se ejecuta en el loop
         }
         if( SerialInByte == 10 ){
         }
         else {
           msg += String(SerialInByte);
         }
     }   
}    

void ProcessSms( String sms ){                     
  Serial.print( "ProcessSms for [" );
  Serial.print( sms );
  Serial.println( "]" );

  //guarda en la SD
  File myFile = SD.open("sms.txt", FILE_WRITE);

  if(myFile){
    myFile.println(sms);
    myFile.close();    
  }
 
}
 
void GprsTextModeSMS(){
  mySerial.println( "AT+CMGF=1" );
}
 
void GprsReadSmsStore( String SmsStorePos ){  
  mySerial.print( "AT+CMGR=" );
  mySerial.println( SmsStorePos );
}
 
void ClearGprsMsg(){
  msg = "";
}
 
void ProcessGprsMsg() {   // aca empieza la unica funcion del loop
 
     if( msg.indexOf( "Call Ready" ) >= 0 ){
     Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
     GprsTextModeSMS(); // llama a esta funcion que esta antes para que escoja modo texto
  }
 
  if( msg.indexOf( "+CMTI" ) >= 0 ){
     int iPos = msg.indexOf( "," );
     String SmsStorePos = msg.substring( iPos+1 );  // aca esta el storepos ubicacion del sms en la SIM del telefono      
     Serial.print( "SMS stored at " );
     Serial.println( SmsStorePos );
     GprsReadSmsStore( SmsStorePos ); 
  }
 
  
  if( msg.indexOf( "+CMGR:" ) >= 0 ){
     int tPos = msg.indexOf( "," );
     String Telefono = msg.substring( tPos+6,tPos+14 ); // aca esta el telefono
     Serial.print( "telefono que llama " );
     Serial.println( Telefono );
    SmsContentFlag = 1;
    ClearGprsMsg();
    return;
  }
 
  if( SmsContentFlag == 1 ){
    Serial.println( "*** SMS ***" );
    Serial.println(msg );
    Serial.println( "*** END OF SMS MESSAGE ***" );
    ProcessSms( msg );     
  }
  ClearGprsMsg();
  SmsContentFlag = 0; 
}

gracias por responder , empezare a leer el codigo para entenderlo.