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.
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);
}
}
}