domingo, 24 de novembro de 2013

SIM900 + Labview, fazendo leitura de sinal

Fala pessoal!

Semana passada falamos sobre a implementação do GPS em conjunto com SIM900, podendo ser usado como um rastreador enviando links do Google Maps com latitude e longitude.
Hoje vamos falar de um assunto diferente, e que se encontra poucas informações na internet. Interligar o Arduino ao Labview, podendo tratar as informações de uma maneira diferente e de alto nível.

Vamos começar com um exemplo bem simples, mas primeiro se caso seja seu primeiro contato com SIM900, veja os posts anteriores para garantir que seu modulo esta funcionando perfeitamente:

No exemplo de hoje vamos utilizar o comando AT+CSQ (Signal Quality Report). Esse comando funciona da seguinte maneira, ao se enviar AT+CSQ, seu modem responde os parametros <rssi>, que correspondem da seguinte maneira:

  • 0          -115 dBm ou menos
  • 1          -111 dBm
  • 2...30   -110...-54 dBm
  • 31        -52 dBm ou maior
  • 99         não detectou sinal
Ou pode responder o parâmetro <ber> (em %):




Agora que entendemos como o comando funciona vamos passar para a programação no Arduino, oque fazemos é o seguinte, enviamos o comando AT+CSQ, e iniciamos a leitura da resposta do SIM900, os dados salvos são os compreendidos entre espaço vazio " " e carácter virgula ",". Dessa forma estamos parceando as informações certas para posteriormente enviar pela porta serial no computador. O código esta todo comentado e de fácil entendimento:



  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(23);
  3.  
  4. // AUX GSM Leitura de dados
  5. String  linhaAtual = "";              
  6. String  db = "";  
  7. boolean lendoDB = false;
  8.  
  9. void setup()
  10. {
  11.   mySerial.begin(19200); // inicia conexao SIM900
  12.   Serial.begin(9600); // inicia conexao PC
  13. }
  14. void loop()
  15. {  
  16.   delay(500); // delay de envio de dados
  17.   mySerial.println("AT+CSQ"); // envia comando ao SIM900
  18.   while(mySerial.available()>0) // se existem dados na porta serial
  19.   {
  20.     char dados = mySerial.read(); // variavel dados recebe informacoes
  21.     linhaAtual += dados; // variavel linha recebe dados
  22.     if (dados == '\n') // se tiver um ENTER em dados
  23.     {
  24.       linhaAtual = ""; // apaga dados da linha
  25.     }
  26.     if (linhaAtual.endsWith(" ")) // se a linha terminar com espaco em branco
  27.     {
  28.       lendoDB = true; // estamos lendo dados
  29.       db = ""; // limpo variavel que vai receber dados em DB
  30.     }
  31.     if (lendoDB) // se estamos lendo os dados
  32.     {
  33.       if (dados != ',') // faz leitura ate encontrar virgula
  34.       {
  35.         db += dados; // adiciona info a variavel db
  36.       }
  37.       else // se nao estamos lendo
  38.       {
  39.         lendoDB = false; // sem leitura
  40.         Serial.println(db); // enviamos os dados para o computador pela porta serial
  41.       }
  42.     }
  43.   }
  44. }


Está é a resposta no Serial Monitor do Arduino:




Ótimo! Já temos os dados no computador pela porta serial, agora vamos incrementar nosso pequeno projeto adicionando esses dados no LabView e processando essas informações de uma maneira visual.

Nosso diagrama em blocos fazendo conexão serial:



Bloco de processo das informações:



As informações processadas são mostradas em forma de gráfico do sinal da antena SIM900:




Programa em funcionamento:



Fica bem legal testar outras antenas e ver o ganho variando no gráfico.

Bom pessoal, é isso ai!
Espero que tenham gostado, deixem qualquer duvida nos comentários e sugestões para os próximos posts.

E mês que vem a loja MicroEmbarcado vai estar online para oferecer os melhores produtos para vocês :-)


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é!