Ola, gostaria de tirar uma duvida, é possivel enviar dados coletados pelo sensor do arduino via SMS??

Pois tentei o seguinte codigo, e nao da certo..

mySerial.println("O Valor da umidade e : %d",numero);
mySerial.println("O Valor da temperatura e : %d",temp)

Lembrando que os dados foram coletados perfeitamente:

float h2 = dht . readHumidity () ; //RECEBE A UMIDADE DA CLASSE DHT11
int numero = h2;
float t2 = dht.readTemperature () ; //RECEBE A TEMPERATURA DA CLASSE DHT11
int temp = t2

Só que nao consigo enviar este valor coletado.. Alguem pode me ajudar?? Por favor,, ja tentei de tudo.. 

Obrigado

Exibições: 1626

Responder esta

Respostas a este tópico

Olá pessoal. Este assunto tambem me interessa. Mas não tenho como testa-lo, ainda.

Entao amigo, aqui esta tudo funcionando corretamente, só nao encontro uma forma de enviar o dado coletado via SMS, imaginei que alguem poderia me ajudar aqui, estou realmente precisando dessa mão ai. Depois posso compartilhar o codigo com voces sem problema. Obrigado e aguardo uma " luz"..

Olá Pedro,

Voce precisa comandar o módulo GPRS para enviar  SMS através de comandos AT.

Qual o módulo que voce está usando? No manual do módulo deve conter as intruções para isso.

 

Amigo, talvez voce nao entendeu a minha duvida, eu nao tenho problemas ao enviar a msg via comando AT. O problema era apenas em inserir um dado coletado dentro da string. Porque? Porque é possivel apenas enviar dentro de uma msg caracteres, não é possivel utilizar o comando para que o valor coletado vá para a string. O comando: 

mySerial.println("O Valor da umidade e : %d",numero);

Não é aceito pela funcao sendmsg do arduino, pois nele estaria um tipo int dentro da string..

Na verdade eu ja consegui fazer, so nao estou com o meu codigo aqui agora. Caso alguem precise eu posso compartilhar com todos a solucao.

 

Obrigado a todos e tenham um otimo FDS.

Pedro,

Da forma que voce está fazendo realmente não vai funcionar.

No seu código tente incluir a função abaixo, que transforma um float em string:

 

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
    mySerial.print('-');
    number = -number;
  }
  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  number += rounding;
  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  mySerial.print(int_part);
  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    mySerial.print(".");
  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    mySerial.print(toPrint);
    remainder -= toPrint;
  }
}

 

No seu código quando for enviar a mensagem use:

 

float h2 = dht . readHumidity () ; //RECEBE A UMIDADE DA CLASSE DHT11
float t2 = dht.readTemperature () ; //RECEBE A TEMPERATURA DA CLASSE DHT11

 

mySerial.println("AT+CMGF=1"); // set SMS mode to text
mySerial.print("AT+CMGS="); // now send message...
mySerial.print(34,BYTE); // ASCII equivalent of "
mySerial.print(phoneNumber);
mySerial.println(34,BYTE); // ASCII equivalent of "
delay(500);

mySerial.printl("O Valor da umidade e : ");

printFloat(h2, 2); // converte e envia h2 com duas casas depois da virgula pela mySerial
mySerial.printl("O Valor da temperatura e : ");

printFloat(t2, 2); // converte e envia t2 com duas casas depois da virgula pela mySerial
mySerial.println(26,BYTE); // ASCII equivalent of Ctrl-Z

 

Testa ai pra ver se dá certo.

Abraço.

Obrigado pela resposta, mais encontrei uma forma que acredito que seja melhor, pois economiza muita linha de codigo, vou mandar para todos aqui, pode ser que futuramente salve a pele de mais alguem.

mySerial.print("AT+CMGF=1\r"); //Because we want to send the SMS in text mode
delay(100);
mySerial.println("AT + CMGS = \"+55**********\"");//coloque o numero nos *
delay(100);


float h2 = dht.readHumidity () ; //RECEBE A UMIDADE DA CLASSE DHT11
int numero = h2;
float t2 = dht.readTemperature () ; //RECEBE A TEMPERATURA DA CLASSE DHT11
int temp = t2;


mySerial.print("O Valor da temperatura e : ");//o conteudo das mensagens...
String myString1 = String(temp);
mySerial.println(myString1);

mySerial.print("O Valor da umidade e : ");//o conteudo das mensagens...
String myString2 = String(numero);
mySerial.println(myString2);

Dessa forma ele consegue transformar o valor int em float e com isso consegue enviar via SMS..

Obrigado a todos, e tenham um otimo FDS.

Olá Pedro,

Obrigado pelo retorno, acredito que o tema pode ajudar a salvar a pele de muita gente, não apenas nos caso de envio de mensagens por GPRS, mas sempre que seja necessário transmitir dados por um canal serial. 

É verdade que a sua solução economiza um pouco de memória, mas também causa a perda da parte decimal das informações.

Nos casos onde se deseja transmitir apenas a parte inteira das variáveis o uso desta solução é mais recomendável com certeza.

Mas quando for necessário transmitir as variáveis com mais precisão, inclusive escolhendo com quantas casas decimais a informação seja transmitida, o uso da função printFloat será uma solução a ser considerada.

Fica então a observação para auxiliar os garagistas que estiverem lendo esta discussão.

Abraços.

Bem observado.. Mais acredito que o mais importante foi deixar registrado as solucoes para a comunidade. Caso encerrado e vamos para o proximo desafio..

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço