sexta-feira, 30 de agosto de 2013

Arduino GPRS - SIM900, projeto aplicado lendo SMS

Olá pessoal, vejo que muita gente teve curiosidade sobre a comunicação de módulos GSM (celular) com microcontroladores. Esse post será dedicado a esclarecer algumas outras informações e mostrar um projeto bem legal.

É o seguinte, todos esses módulos possuem um controlador, esse controlador responde aos comandos AT, esses comandos traduzem alguma tarefa que o modem tem que executar, alguns modems possuem comandos do fabricante, ou seja, funcionam apenas neles.
Os comandos AT são enviados via dados seriais, assim fica fácil de interfacear 



Esse é um ótimo exemplo de programa, faz a leitura de um SMS que segue o padrão @ SUA SMS <
Pode ser modificado pra receber uma SMS e executar uma ação.



  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(2, 3);
  3. String  linhaAtual = "";              
  4. String  sms = "";  
  5. String  smsAnterior = "";  
  6. boolean lendoSMS = false;
  7. void setup()
  8. {
  9. mySerial.begin(19200);
  10. Serial.begin(19200);
  11. ligandoModulo();
  12. Serial.println("Configurando SMS modo texto");
  13. mySerial.println("AT+CMGF=1");
  14. mostraDadosSerial();
  15. }
  16. void loop()
  17. {
  18.   //Serial.println("Fazendo leitura do 1 SMS");
  19.   mySerial.println("AT+CMGR=1");
  20.   mostraDadosSerial();
  21.   delay(1000);
  22.   while (mySerial.available()>0)
  23.      {
  24.       char inChar = mySerial.read();
  25.       linhaAtual += inChar;
  26.         if (inChar == '\n')
  27.           {
  28.             linhaAtual = "";
  29.           }
  30.         if (linhaAtual.endsWith("@"))
  31.           {
  32.             lendoSMS = true;
  33.             sms = "";
  34.           }
  35.         if (lendoSMS)
  36.           {
  37.           if (inChar != '<')
  38.             {
  39.               sms += inChar;
  40.             }
  41.           else
  42.             {
  43.             lendoSMS = false;
  44.             Serial.println(sms);
  45.               if(sms == smsAnterior)
  46.                 {
  47.                   mySerial.println("AT+CMGD=1");
  48.                   sms="";
  49.                 }    
  50.              smsAnterior=sms;
  51.             }
  52.           }
  53.     }
  54.     mySerial.println("");
  55. }
  56. void ligandoModulo()
  57. {
  58.   Serial.println("Ligando/Reiniciando Modulo GSM...");
  59.   if(digitalRead(6)==LOW)
  60.     {
  61.       digitalWrite(6,LOW);
  62.       delay(300);
  63.       digitalWrite(6,HIGH);
  64.       delay(15000);
  65.     }
  66.   Serial.println("Modulo Ligado!");
  67. }
  68. void mostraDadosSerial()
  69. {
  70.   while(mySerial.available()!=0)
  71.   {
  72.     Serial.write(mySerial.read());
  73.   }
  74. }




Logo mais completo esse tópico com videos e tudo mais!

9 comentários:

  1. Vinícius parabéns pelo blog!
    Gostaria de um auxílio seu, adquiri uma placa arduíno que vem com o chip SIM900 e comunicação XBee também. A placa é a GBoard (uma Duemilanove atmega328). Estou com dificuldades para testar os comandos AT. Teria algo que possa me auxiliar?
    Obrigado

    ResponderExcluir
    Respostas
    1. Olá Abraão, de uma olhada nesse novo post:

      http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-introducao-i.html

      Excluir
    2. Vinícius ajudou bastante, consegui com que o SIM900 responda os comandos AT, mas ainda tenho um problema, a biblioteca que veio com a minha placa só funciona com o compilador 0022, quando eu coloco o seu código nesse compilador ele da erro.

      Para fazer seu código funcionar usei a versão 1.05, porém com ela não consigo usar a biblioteca da minha placa.

      Dei um print na tela do compilador mostrando o erro
      http://img32.imageshack.us/img32/7548/0lzp.gif

      Excluir
    3. Pela pesquisa que fiz aqui a biblioteca de softwareSerial não funciona nos compiladores 0022 e 0023
      ( http://www.pjrc.com/teensy/td_libs_SoftwareSerial.html)

      Talvez seja mais fácil adaptar a sua biblioteca da placa ao compilador mais novo 1.05, eu recomendo testar no compilador 1.00 e 1.03.

      Tem como fazer softwareSerial "na mão", é bem chato e complicado eu não recomendaria.

      Excluir
    4. Não tive sucesso com o 1.0, da incompatibilidade também. Procurei como poderia converter a biblioteca para um compilador mais atual, mas não consegui.
      Pelo que vi na net é muito raro encontrar o pessoal usando placas pro compilador 0022. Você acredita ser mais viável adquirir uma placa e um shield mais atuais? (para desenvolver uma aplicação)

      Obrigado pela ajuda.

      Excluir
  2. e ai Vinicius tranquilo? sou novo nessa area de arduino e estou montando meu tcc nessa area hehe..
    tenho um projeto de fazer com que o arduino com o shield sim900 envie uma mensagem ao meu celular após algumas verificações.
    tipo..
    if (condicao == true)
    manda sms

    peguei os códigos que voce disponibilizou naquele outro post e nesse tbm.. mas nao consegui fazer o negocio funcionar.. acho que é pq ainda nao peguei o jeito da coisa ainda hehe..
    pra te falar a verdade, fico perdido até quando voce fala em "comandos AT". esses comandos at eu tenho que enviar a partir de algum outro programa, certo? qual é o mais utilizado pelo pessoal?

    com esse seu comando acima eu fiz o upload mas ele nao me deu nenhuma resposta.. enviei mensagem ao chip que pluguei no shield, mas tbm nao consegui resposta..

    vc tem alguma sujestao de como posso fazer?
    eu tenho tambem um shield LCD com keypad (comprado no dx) e através de uma protoboard, queria ligar os 2 shields ao mesmo tempo.. e validar um esquema tipo. Cliquei o botao 1 do keypad, envia um tipo de mensagem.. cliquei no botao 2, envia outra msg.. assim vai..

    valeu Vinicius..

    ResponderExcluir
    Respostas
    1. Oi Vanderlei, fiz um post sobre a comunicação, de uma olhada em: http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-introducao-i.html

      Excluir
  3. tudo bom vinicius.. muito bom esse seu blogue, tem várias coisas que estão me ajudando!!!
    Achei muito interessante esse seu programa, mas não estou conseguindo fazer ele rodar, quando ele vai pra void mostraDadosSerial(), ele fica ai, o que tenho que fazer pra ele sair dai ??

    meu objetivo é receber uma sms, se essa sms conter a palavra desejada, ela me retornar uma sms dizendo ok, pra falar que relmente recebeu minha sms!!! Se vc puder me ajudar com isso, dar alguma dica ficaria muito agradecido... obrigado

    ResponderExcluir
    Respostas
    1. Fala parceiro, fico feliz que tenha gostado do blog :)

      Sobre seu problema é o seguinte, primeiramente tenha certeza que seu arduino esta comunicando corretamente com o modulo GSM, nesse topico voce encontra o passo a passo:
      http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-introducao-i.html

      Envia assim os comandos separadamente e veja se tudo esta OK, depois tente fazer esse outro tutorial http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-mandando-sms.html

      Ai sim passa para o dessa pagina que é mais dificil.

      A primeira coisa a se fazer é ter certeza que a comunicação Arduino <-> GSM esta funcionando, para depois tentar fazer outros programas.


      Espero que tenha ajudado, abs!

      Excluir