enviar SMS para vários números com SIM900/Aduino Mega

Olá a todos!

Estou desenvolvendo um projeto que utiliza comunicação por envio mensagens SMS. Criei um protocolo de mensagens, no qual faço uma solicitação e o arduino responde por SMS. Porém, tem uma mensagem que não consigo enviar, é quando eu preciso concatenar quatro variais String e envia-la para uma lista de contatos, percorrendo um loop do tipo ‘for’. Preciso de ajuda para poder enviar essa mensagem para a lista de contatos, pois esta a parte principal do projeto. Obrigado. Código abaixo.

Funcionamento: captura a velocidade, latitude e longitude do GPS e concatena essas informações com uma string fixa no código. A mensagem é enviada quando a leitura do acelerômetro indicar inclinação e a velocidade estiver acima de 10km. A mensagem é enviada para os cantatos que estiverem armazenados na memoria EEPROM do arduino, cada numero, ocupa 5 posições de memoria. Ex: 47 99 88 77 66.

//variaveis que armazenam latitude e longitude do GPS
String  strVelocidade = String(gps.speed.kmph());
String  latlong       = String(gps.location.lat(),7) + "," + String(gps.location.lng(),7);

//retorna a string que será enviada por SMS
String getMsnAci(String vel, String latlon){
   char * ms_1 = "Acidente com a motocicleta MHT-7786 Veloc: ";
   char * ms_2 = " km/h.\n Local: http://maps.google.com.br/maps?q=";
   String ms_3 = ms_1 + vel + ms_2 + latlon;
   
   return ms_3;
}

bool enviaSMS(){

  int enviar = 0;
  int index = EEPROM.read(0);
  int Qtd = EEPROM.read(60);
  String contatos;
  String valMemoria;
  char numero[12];
  contatos = "0";
  
  //chama a função getMsnAci, declarada acima
  String mensagem = getMsnAci(strVelocidade, latlong);
  
  //aqui eu transformo a string em array de char
  int tamanho = mensagem.length()+1;
  char ArrMsg[tamanho];
  mensagem.toCharArray(ArrMsg, tamanho);
  
  //esse loop pega os numeros de telefones da memoria EEPROM, que serão os destinatarios da mensagem SMS
  for (int i = 1 ; i <= Qtd * 5 ; i++) {
  
    //le o numero da memoria  
    valMemoria = String(EEPROM.read(i));    
    if ((valMemoria.length() == 1) && (valMemoria != "0")) {
     //para colocar zero a esquerda, ja que não armazena valor como: 09
      valMemoria = "0" + valMemoria;
    }
    
   //cada numero de destinatario ocupada 5 posições de momoria, então a cada 5 posições um novo numero é gerado.
    contatos += valMemoria;
    if ((i % 5) == 0) {
      enviar = 1;
      contatos.toCharArray(numero,12);
      contatos = "0"; 
     
     //realiza o envio para o numero gerado
     sms.SendSMS(numero, ArrMsg);
      delay(5000); 
    }
  }
}

//retorna a string que será enviada por SMS
String getMsnAci(String vel, String latlon){
char * ms_1 = "Acidente com a motocicleta MHT-7786 Veloc: ";
char * ms_2 = " km/h.\n Local: Google Maps";
String ms_3 = ms_1 + vel + ms_2 + latlon;

return ms_3;
}

Retornar uma variável/objecto dentro de uma função vai ter a sua ram destruída/remarcada para reutilização já que ela vive na stack e não na heap!
Se queres que essa função te devolva uma String deves passar como parâmetro para essa funçao o seu endereço, fazes o que tens a fazer la dentro (concatenar ...) e tens a tua String alterada (ela nao mora la dentro, passaste o valor por referencia lembras-te ...)

Eu alterei a função passando as variáveis por parâmetro, porém, quando recebo o mensagem, apenas o valor das variáveis que passei por parâmetro são exibidas, no caso *vel e *latlon.

//variable global
String msg="";

//chamada da função
msg = getMsnAci(&strVelocidade, &latlong);

//função
String getMsnAci(String *vel, String *latlon){
   char * ms_1 = "Acidente com a motocicleta MHT-7786 Veloc: ";
   char * ms_2 = " km/h.\n Local: http://maps.google.com.br/maps?q=";
   String ms_3 = *ms_1 + *vel + *ms_2 + *latlon;
   
   return ms_3;
}

String getMsnAci(String *vel, String *latlon){
char * ms_1 = "Acidente com a motocicleta MHT-7786 Veloc: ";
char * ms_2 = " km/h.\n Local: Google Maps";
String ms_3 = *ms_1 + *vel + *ms_2 + *latlon;

return ms_3;
}

Tu até alteraste sim os parametros mas nao resolves-te nada, ja que continuas a devolver dessa funçao a ms_3 que tem scope apenas dentro da funçao.Fazeres lhe o return vais bater a minha primeira resposta que te dei!
Devias ter antes algo assim:

String getMsnAci(String vel, String latlon, String *mensagemFinal){
  *mensagemFinal = "Acidente com a motocicleta MHT-7786 Veloc: " + vel + " km/h.\n Local: http://maps.google.com.br/maps?q=" + latlon; 
   return *mensagemFinal;
}

Olá! Quero agradecer por estar me ajudando nesta dificuldade! Obrigado mesmo!
Eu alterei a função que monta a mensagem, porém, eu consigo envia-la apenas uma vez para cada contato.
Caso eu solicite o envio pela segunda vez, a mensagem não chega ao destinatário. Eu tentei usar a string de retorno da função e também a string mensagemFinal, que passo por parâmetro, mas mesmo assim, consigo enviar apenas uma sequencia de mensagens. Já tentei montar a string dentro do scope local, através de string.concat(), string+string, string.replace(). Mas nada deu certo, não sei mais o que tentar. Abaixo o Código onde chamado a função que retorna a mensagem.

bool enviaSMS(){

  int enviar = 0;
  int index = EEPROM.read(0);
  int Qtd = EEPROM.read(60);
  String contatos;
  String valMemoria;
  char numero[12];
  contatos = "0";
  
  //chama a função que monta a mensagem
  String mensagemFinal = getMsnAci(strVelocidade, latlong, &mensagemFinal);
  
  //aqui eu transformo a string em array de char
  int tamanho = mensagem.length()+1;
  char ArrMsg[tamanho];
  mensagem.toCharArray(ArrMsg, tamanho);
  
  //esse loop pega os numeros de telefones da memoria EEPROM, que serão os destinatarios da mensagem SMS
  for (int i = 1 ; i <= Qtd * 5 ; i++) {
  
    //le o numero da memoria  
    valMemoria = String(EEPROM.read(i));    
    if ((valMemoria.length() == 1) && (valMemoria != "0")) {
     //para colocar zero a esquerda, ja que não armazena valor como: 09
      valMemoria = "0" + valMemoria;
    }
    
   //cada numero de destinatario ocupada 5 posições de momoria, então a cada 5 posições um novo numero é gerado.
    contatos += valMemoria;
    if ((i % 5) == 0) {
      enviar = 1;
      contatos.toCharArray(numero,12);
      contatos = "0"; 
     
     //realiza o envio para o numero gerado
     sms.SendSMS(numero, ArrMsg);
      delay(5000); 
    }
  }
}