Arduino 3G/GPS (SMS)

Hi everybody.

I need some help with my project. I'm using Arduino UNO with 3G/GPS shield. I'm trying to receive SMS with character. It's arduino shield's events or functions.

The code works just like that:

First, I send a SMS from my mobile device to Arduino 3G/GPS shield. Then Arduino receives and reads it. If the SMS's body is a "1", arduino does the function associated to "1". The SMS with "2"....activate the function "2". And so on.

In short, I need a code that is waiting for an SMS ("1", "2" ...) and likewise perform a particular function, whether I get the GPS location, or capture pictures with the camera shield 3G / GPS.

Thanks a lot. I hope you understand me.

Here I insert the main code and its functions.

Main code:

int8_t answer, counter;
char salir;
int x;
int onModulePin= 2;  // Pin para activar o desactivar el módulo 3G
char aux_string[30];
char response[255];
char SMS[200];
int a=0;
int y=0;
int z=0;
char phone_number[]="3214435420";
//int b= 0; 
char name[20];
char picture_name[20];
//GPS 
char gps_data[100];
int contador;
char data[255];
char latitude[12],longitude[13];
char date[7],UTC_time[9];
char speed_OG[7],altitude[7];

void(*Reset)(void)=0;

void setup(){
  
    pinMode(13, OUTPUT);

    pinMode(onModulePin, OUTPUT);  // Pin para activar modulo como salida
    Serial.begin(115200);     //Configuramos puerto UART

    Serial.println("Starting..."); //Activamos el módulo 3G
    power_on();
    
    delay(3000);
    
    //Configuramos SD como espacio de almacenamiento principal.
    sendATcommand("AT+FSLOCA=1","OK",2000);
    Serial.println("Setting SD storage...");
    Serial.println("AT+CNSM=1"); // Enables noise supression 
    while(Serial.read()!='K');    
    
    Serial.println("Setting SMS mode...");
    sendATcommand("AT+CMGF=1", "OK", 1000);    // Configuramos el SMS a modo texto 
   //  Serial.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt 
    sendATcommand("AT+CPMS=\"SM\",\"SM\",\"SM\"", "OK", 1000);    // selects the memory
   //delay(5000);
   //answer = sendATcommand("AT+CMGD=1,4", "+CMGD:", 2000);
   //Serial.println("AT+CMGD=1,4"); // delete all SMS 

Serial.println("Send your SMS, 20 sec remaining...");
    
    delay(20000);
   //answer = sendATcommand("AT+CMGRD=1", "+CMGRD:", 2000);
   answer = sendATcommand("AT+CMGR=1", "+CMGR:", 2000);    // Se lee el primer SMS en la sim card
    if (answer == 1)
    {
        answer = 0;
        while(Serial.available() == 0);
        // Este buble lee los datos del SMS, lo q llega del SMS
        do{
            // Si hay datos en el buffer de entrada UART, lo lee y comprueba la answer(respuesta)
            if(Serial.available() > 0){    
                SMS[x] = Serial.read();
                   
                    if (SMS[x] == '5')
                    {
                      
                      Serial.println("Voice");
                      rec_voz();
                      delay(2000);
                      Reset();
                    }
                   
                    else if (SMS[x] == '4')
                    {
                      Serial.println("Alarm");
                      Alarma();
                      delay(2000);
                      Reset();
                    }
                    else if (SMS[x] == '2')
                    {
                      Serial.println("Taking pic!");
                      tomaFoto();
                      delay(2000);
                      Reset();
                    }
                    else if (SMS[x] == '1')
                    {
                      Serial.println("Getting GPS position...");
                    get_GPS();
                    delay(2000);
                    Reset();
                    }
                     
               
                x++;
                              
                // Se comprueba si la respuesta deseada (OK) es en la respuesta del módulo 
                if (strstr(SMS, "OK") != NULL)    
                {
                    answer = 1;
                }
            }
            
            
        }
        

        while(answer == 0);    // Espera por la respuesta (answer) con el tiempo de espera
        
        SMS[x] = '\0';
        
      //  Serial.print(SMS);    // Se imprime el valor de SMS     -->Serial.print(val) 
       
                   
    }
    
    
    
    else
    {
        Serial.print("error "); // se imprime error
        //imprime como codificado ASCII decimal
        Serial.println(answer, DEC); //Serial.print(val, format) -> format: especifica el número de la base (para números enteros) o el número de posiciones decimales (para números de coma flotante o tipo "float")
    // Serial.println("AT+CFUN=1,1"); //reset shield
  }
//sendATcommand("AT+CMGD=1,4", "+CMGD:", 2000);
//delay(2000);
sendATcommand("AT+CFUN=1,1","+CFUN:",2000);
Reset();
}

void loop(){
}


void power_on(){

    uint8_t answer=0;
    
    // / / Comprueba si el módulo es iniciado
    answer = sendATcommand("AT", "OK", 2000);
    if (answer == 0)
    {
        // power on pulse
        digitalWrite(onModulePin,HIGH);
        delay(3000);
        digitalWrite(onModulePin,LOW);
        // Espera por una respuesta(answer) del módulo
        while(answer == 0){     // Enviar AT cada dos segundos y esperar la  (answer)
        answer = sendATcommand("AT", "OK", 2000); 
         
            
        }
    }
    
}

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    // Inicializa la cadena (string)

    delay(100);

    while( Serial.available() > 0) Serial.read();    // Limpiar el buffer de entrada

    Serial.println(ATcommand);    // Enviar el comando AT


        x = 0;
    previous = millis();

    // Este bucle espera por la respuesta (answer)
    do{
        // Si hay datos en el buffer de entrada UART, lo lee y comprueba la asnwer
        if(Serial.available() != 0){    
            response[x] = Serial.read();
            x++;
            // comprobar si la respuesta deseada es en la respuesta del módulo
            if (strstr(response, expected_answer) != NULL)    
            {
                answer = 1;
            }
        }
        // Waits for the asnwer with time out
    }while((answer == 0) && ((millis() - previous) < timeout));    

    return answer;
}

int8_t sendATcommand2(char* ATcommand, char* expected_answer1, char* expected_answer2,
    unsigned int timeout){

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    // Initialize the string

    delay(100);

    while( Serial.available() > 0) Serial.read();    // Clean the input buffer

    Serial.println(ATcommand);    // Send the AT command 

    x = 0;
    previous = millis();

    // this loop waits for the answer
    do{
        // if there are data in the UART input buffer, reads it and checks for the asnwer
        if(Serial.available() != 0){    
            response[x] = Serial.read();
            x++;
            // check if the desired answer 1 is in the response of the module
            if (strstr(response, expected_answer1) != NULL)    
            {
                answer = 1;
            }
            // check if the desired answer 2 is in the response of the module
            if (strstr(response, expected_answer2) != NULL)    
            {
                answer = 2;
            }
        }
        // Waits for the asnwer with time out
    }while((answer == 0) && ((millis() - previous) < timeout));    

    return answer;
}

Alarm function:

void Alarma(){
  
     if(SMS[x] == '4')
     {
     Serial.println("AT+FSCD=D:/Audio");                //Indicamos en que carpeta esta nuestro mp3
     while(Serial.read()!='K');
     Serial.println("carpeta configurada");  
     Serial.println("AT+CSDVC=3");                      //Le decimos por donde queremos que lo reproduzca, el 3 para el speaker, el 2 para conectar los audífonos.
     while(Serial.read()!='K');
     Serial.println("altavoz seleccionado");
     delay(1000);
     Serial.println("AT+CCMXPLAY=\"alarma.MP3\",0");    //Le damos al play
     while(Serial.read()!='K');
     Serial.println("reproduciendo");
     //retorna a rutina main.
     }
    
  }

Cam function:

/*
 Secuencias para la toma de fotografias
 desde el modulo 3G
*/

//Configuramos parámetros cámara
void tomaFoto(){
  if (SMS[x] == '2')
  {
  Serial.println("Haciendo fotografia...");
  Serial.println("AT+CCAMS");                    //Iniciamos la camara
  while(Serial.read()!='K');
  Serial.println("AT+CCAMSETD=640,480");         //Indicamos la resolucion
  while(Serial.read()!='K');
  Serial.println("AT+CCAMTP");                   //Tomamos la fotografia
  while(Serial.read()!='K');
  delay(2000);                                   
  Serial.println("AT+CCAMEP");                   //Guardamos la foto
  Serial.flush();     
  while(Serial.read()!='/');                     //Seleccionamos a partir de donde vamos a empezar a guardar el nombre de la foto
  while(Serial.read()!='/');
  
  //Guardamos el nombre de la foto para luego enviarla
  int z=0;
  //Mientras z sea menor que 19...
  do
    {
     while(Serial.available()==0);               //Mientras no haya nada en el puerto serie..funciona en standby..
     name[z]=Serial.read();                      //A partir de que reciba algo, lo empieza a almacenar
     z++;
    }
  
  while(z < 19);
     
    while(Serial.read()!='K');
    delay(500);
    Serial.print("El nombre de la foto es "); 
    Serial.println(name); 
    Serial.println("AT+CCAME");                  //Se detiene la cam
    while(Serial.read()!='K');
    Serial.println("Foto almacenada correctamente...");
}
}

GPS function:

void get_GPS(){
  
   answer = sendATcommand("AT+CGPS=1,1","OK",1000);    
    if (answer == 0)
    {
        Serial.println("Error starting the GPS");
        Serial.println("The code stucks here!!");
        while(1);
    }
  
  
  if (SMS[x] == '1')
  {
    answer = sendATcommand("AT+CGPSINFO","+CGPSINFO:",1000);
 delay(60000);   // request info from GPS
    if (answer == 1)
    {

        contador = 0;
        do{
            while(Serial.available() == 0);
            gps_data[contador] = Serial.read();
            contador++;
        }
        while(gps_data[contador - 1] != '\r');
        gps_data[contador] = '\0';
        if(gps_data[0] == ',')
        {
             Serial.println("No GPS data available");  
        }
        else
        {
            Serial.print("GPS data:");
            Serial.println(gps_data);  
            Serial.println("");
        }       

    }
    else
    {
        Serial.println("Error"); 
    }

    delay(2000);  //en caso de if
    
}
}

Recording voice function:

void rec_voz()
{
  if (SMS[x] == '5')
{

  
  //RECORDING A SOUND CLIP 
  int8_t answer, counter;
int onModulePin = 2;
char clip_name[20];
char aux_str[50];



    // Takes a picture, but not saved it
    answer = sendATcommand2("AT+CQCPREC=0,amr", "D:/Audio/", "ERROR", 5000);
    if (answer == 1)
    {
        counter = 0;
        while(Serial.available()==0);
        do{
            clip_name[counter] = Serial.read();
            counter++;
            while(Serial.available()==0);
        }
        while (clip_name[counter-1] != 0x0D);

        clip_name[counter-1] = '\0';

        Serial.print("Clip name: ");                
        Serial.println(clip_name);
        delay(10000);
        /*
        sendATcommand2("AT+CQCPPAUSE", "OK", "ERROR", 2000);
        delay(5000);            
        sendATcommand2("AT+CQCPRESUME", "OK", "ERROR", 2000);
        delay(5000);            
        */
        sendATcommand2("AT+CQCPSTOP", "OK", "ERROR", 2000);

        sendATcommand2("AT+FSCD=D:/Audio", "OK", "ERROR", 2000);
        sprintf(aux_str, "AT+CCMXPLAY=\"%s\",0", clip_name);
        answer = sendATcommand2(aux_str, "OK", "ERROR", 2000);
        if (answer == 1)
        {        
      /*    
            delay(5000);
            sendATcommand2("AT+CCMXPAUSE", "OK", "ERROR", 2000);
            delay(5000);            
            sendATcommand2("AT+CCMXRESUME", "OK", "ERROR", 2000);
            */
            delay(10000);            
            sendATcommand2("AT+CCMXSTOP", "OK", "ERROR", 2000);
        }
        else
        {
            Serial.println("Error playing");    
        }
    }
    else
    {
        Serial.println("Error recording");    
    }
}
}