quinta-feira, 21 de novembro de 2013

Rastreador Arduino SIM900 + GPS II

Fala pessoal!

Como vimos no post Rastreador Arduino SIM900 + GPS I, aprendemos a fazer a leitura dos dados de latitude e longitude, concatenar tudo em uma String so, e enviar os dados pelo serial monitor do Arduino.

Hoje vamos mostrar como criar um rastreador, que envia esses dados via SMS para um aparelho celular, assim podendo rastrear qualquer objeto.

As modificações são as seguintes, antes a leitura dos dados e processamento era feito, e logo depois mostrado no serial monitor, dessa vez vamos enviar esses dados por SMS, para isso temos antes que configurar nosso modem GSM de acordo com suas características baud rate e pinos de configuração TX/RX que podem variar de modulo para modulo.

O código funciona da seguinte maneira, ao receber a SMS >Local< o programa faz a leitura da latitude e longitude, concatena com o link do google maps, e logo depois envia por SMS para o numero de celular cadastrado.

A SMS chega da seguinte forma no seu celular:
(suprimi alguns dados por segurança)







Então revisando o código, recebe SMS >Local<, dispara leitura do GPS, processa dados e envia por SMS para numero de celular cadastrado.

Código:

  1. #include <TinyGPS++.h> // Biblioteca do GPS
  2. #include <SoftwareSerial.h> // inclui biblioteca
  3. TinyGPSPlus gps; // Inicia GPS
  4. SoftwareSerial GpS(2,3); // inicia portas soft serial GPS
  5. SoftwareSerial GsM(4,5); // inicia portas soft serial GPS
  6. char server[] = "http://maps.google.com.br/maps?q=";
  7. String data;
  8. float dado_lat;
  9. char lat_aux[10];
  10. String latParaString;
  11. float dado_lng;
  12. char lng_aux[10];
  13. String lngParaString;
  14. // AUX GSM
  15. String  linhaAtual = "";              
  16. String  sms = "";  
  17. String  smsAnterior = "";  
  18. boolean lendoSMS = false;
  19. void setup()
  20. {
  21.   // Serial PC <-> Arduino
  22.   Serial.begin(9600);
  23.   // GsM Arduino <-> GSM
  24.   GsM.begin(4800);
  25.   // GpS Arduino <-> GPS
  26.   GpS.begin(9600);
  27.   // Chama função que faz start up do modulo GSM
  28.   configGSM();
  29. }
  30. void loop()
  31. {
  32.   // Verifica SMS de controle
  33.   leituraSMS();
  34. }// end loop
  35. // Funções Gerais
  36. // Envia SMS com link google maps de localização e avisa a tentativa de furto
  37. void envia_sms_gps()
  38. {
  39.   // Faz leitura do GPS
  40.   while (GpS.available() > 0)
  41.     if (gps.encode(GpS.read()))
  42.       displayGPSInfo();
  43.   // Envia SMS https://maps.google.com.br/maps?q=(LAT),(LON)
  44.   delay(300);
  45.   GsM.print("AT+CMGF=1\r"); //mandando SMS em modo texto
  46.   delay(1000);
  47.   GsM.print("AT+CMGS=\"+NUMERO CELULAR\"\r"); // numero que vamos mandar o SMS
  48.   delay(1000);
  49.   GsM.println(data);
  50.   Serial.println(data);
  51.   delay(1000);
  52.   GsM.write(0x1A);
  53.   data="";
  54.   delay(300);
  55. }
  56. // Faz leitura do GPS e pega as coordenadas lat e long, converte os valores float para string e concatena com link do google maps
  57. void displayGPSInfo()
  58. {
  59.   if(gps.location.isValid())
  60.   {
  61.     dado_lat=gps.location.lat();
  62.     dado_lng=gps.location.lng();
  63.     dtostrf(dado_lat,4,4,lat_aux);
  64.     latParaString = String(lat_aux);
  65.     dtostrf(dado_lng,4,4,lng_aux);
  66.     lngParaString = String(lng_aux);
  67.     data+=(server);
  68.     data+=(latParaString);
  69.     data+=",";
  70.     data+=(lngParaString);
  71.   }
  72.   delay(300);
  73. }
  74. // Faz leitura do 1 campo de SMS, os comandos tem que ser enviados assim >COMANDO<
  75. void leituraSMS()
  76. {
  77.   GsM.print("AT+CMGR=1");
  78.   delay(1000);
  79.   while(GsM.available()>0)
  80.   {
  81.     char inChar = GsM.read();
  82.     linhaAtual += inChar;
  83.     if (inChar == '\n')
  84.     {
  85.       linhaAtual = "";
  86.     }
  87.     if (linhaAtual.endsWith(">"))
  88.     {
  89.       lendoSMS = true;
  90.       sms = "";
  91.     }
  92.     if (lendoSMS)
  93.     {
  94.       if (inChar != '<')
  95.       {
  96.         sms += inChar;
  97.       }
  98.       else
  99.       {
  100.         lendoSMS = false;
  101.        
  102.         if(sms==">Local" && smsAnterior!=sms)
  103.         {
  104.           Serial.println("Enviando localizacao atual");
  105.           envia_sms_gps();
  106.         }
  107.         if(sms == smsAnterior)
  108.         {
  109.           Serial.println(sms);
  110.           GsM.print("AT+CMGD=1,4");
  111.           delay(300);
  112.           sms="";
  113.         }    
  114.         smsAnterior=sms;
  115.       }
  116.     }
  117.   }
  118. }
  119. void configGSM()
  120. {
  121.   // Configura modem GSM modo texto, e apaga todas SMS
  122.   delay(3000);
  123.   Serial.println("Configurando SMS modo texto");
  124.   GsM.print("AT+CMGF=1");
  125.   delay(800);
  126.   Serial.println("Apagando todas SMS posteriores");
  127.   GsM.print("AT+CMGD=1,4");
  128.   delay(800);
  129.   Serial.println("");
  130. }

Espero que tenha ficado de fácil compreensão, no próximo post vamos fazer modificações de forma enviar SMS regularmente de 2 em 2 minutos.

Até!


Nenhum comentário:

Postar um comentário