sábado, 7 de setembro de 2013

Arduino GPRS - SIM900, Mandando SMS

Como visto em http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-introducao-i.html ,
Montamos uma comunicação entre os dispositivos, agora vamos executar ações!

Nesse exemplo vamos enviar uma SMS do modulo SIM900.

Para isso temos que usar os seguinte comandos AT:

Esse comando AT+CMGF=1 coloca o SIM900 em modo texto de SMS.


AT+CMGS="NUMERO" especifica numero a ser enviado SMS.
<CTRL-Z> = ASCII caracter 26 sinaliza que o corpo da SMS terminou.

Bom esses são os comandos separados, aqui vai um escopo para o arduino, coisa simples, que funciona como testes e pode ser aprimorada:

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(2,3);
  3. char flag=0;
  4. void setup()
  5. {
  6. delay(30000);
  7. mySerial.begin(19200);
  8. Serial.begin(19200);
  9. }
  10. void loop()
  11. {
  12.   if(flag==0)
  13.     {
  14.       mySerial.print("AT+CMGF=1\r"); //mandando SMS em modo texto
  15.       delay(1000);
  16.       mySerial.print("AT+CMGS=\"+NUMERO\"\r"); // numero que vamos mandar o SMS
  17.       delay(1000);
  18.       flag=1;
  19.     }
  20.    
  21.     if(flag==1)
  22.       {
  23.         mySerial.print("Teste SIM900 e Arduino!\r"); // corpo da msg
  24.         delay(1000);
  25.         mySerial.write(0x1A); //equivalente a mandar Ctrl+Z(finaliza corpo do SMS)
  26.         delay(1000);
  27.         flag=2;
  28.       }
  29.       if(flag==2)
  30.         {
  31.           Serial.println("SMS Enviado com sucesso!");
  32.           delay(5000);
  33.           flag=3;
  34.         }
    }

Fazendo isso, vai receber em seu celular a SMS:


Bom é isso a, simples e pratico, exemplificando uma coisa que futuramente vai ser agregada a um programa complexo.


Atenção aos pinos D3 e D2!



33 comentários:

  1. no comando mySerial.print("AT+CMGS=\"+NUMERO\"\r");
    eu tenho que colocar no meu codigo mySerial.print("AT+CMGS=\"+55149999999999\"\r");
    por exemplo? sendo 55 o codigo do país, 14 o codigo de area e os 9999 o numero do cel? o resto eu deixo da mesma forma, certo?

    ResponderExcluir
    Respostas
    1. não tem necessidade, apenas o numero XXXXXXXX já funciona, se for fazer interurbano ou internacional ai sim tem que colocar operadora

      Excluir
  2. eu consegui fazer mostrar a mensagem apenas no serial monitor.. eu vi que voce disse que o chip tem que estar sem PIN.. acho q eh por isso q eu nao estou conseguindo enviar a mensagem.. meu chip acho q tem um PIN.. tem uma dica facil ai q eu consigo tirar o pin?

    ResponderExcluir
    Respostas
    1. coloca em um celular qualquer e desabilita o PIN

      Excluir
    2. ainda acho que estou fazendo coisa errada haha.. apenas copiei e colei o codigo.. coloquei o numero do meu cel e nada =/
      fiz o teste e coloquei o chip no cel, desabilitei o pin.. fiz uma ligacao e mandei uma msg do celular pra ver que tava funcionando o chip certinho..
      estou utilizando um chip da claro, desses novos e tal.. sera q tem alguma coisa a ver?

      Excluir
    3. Vanderlei, já sei qual é o erro, no s_rx, coloque o jumprer nos 2 primeiros pinos, deixando o ultimo vago. Para s_tx, deixe o primeiro pino vago e coloque o jumper nos dois últimos como na foto que anexei ao projeto. Agora vai dar certo

      Excluir
    4. Vinicius se for no IComsat como eu faço pra rodar ??

      Obrigado!!

      Excluir
    5. Fala Tulio,
      Geralmente os IComsat usam BAUD RATE diferente, 9600,19200, essa é a unica coisa que altera.

      abs

      Excluir
    6. Tendi Vinicius, so nao entendi onde faço o jumper correto na IComsat para rodar corretamente ???

      abraços !!

      Excluir
    7. Em cima do seu modulo deve haver alguns jumpers para selecionar pinos TX/RX, na programação seleciona os mesmo pinos usando essa linha:


      SoftwareSerial mySerial(RX TX);

      Para conectar os fios lembre-se que o TX do arduino vai no RX do IComsat, assim como RX do arquino vai no TX do IComsat

      Excluir
  3. Vanderlei, já sei qual é o erro, no s_rx, coloque o jumprer nos 2 primeiros pinos, deixando o ultimo vago. Para s_tx, deixe o primeiro pino vago e coloque o jumper nos dois últimos como na foto que anexei ao projeto. Agora vai dar certo

    ResponderExcluir
    Respostas
    1. eles estavam dessa forma, alterei para o canto oposto.. de qualquer forma vou chegar em casa e fazer o teste novamente hehe.. valeu Vinicius.. jaja eu te encho o saco aqui novamente =p

      Excluir
  4. Olá, tenho um shield sim 900 icomsat 1.1 e nao estou sabendo configurar o tx e rx ,por causa disso nao consigo enviar as mensagens ,estou usando o seu codigo ele aparece
    sms enviado mas nao chega no celular .

    ResponderExcluir
    Respostas
    1. OI,

      Verifique seus pinos TX e RX, lembrando que o TX do arduino tem que ir no RX do SIM900, assim como RX do arduino tem que ir no TX do SIM900.

      Um teste bom é ligar os modulos separados e conectar apenas os pares TX/RX com um fio e fazer os testes de comunicação... de uma olhada em http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-introducao-i.html

      lá tem o exemplo mais simples pra testar isso!

      Excluir
    2. Eu mudei a posição do tx e rx mas nao consigo mandar a mensagem para celular ,você tem alguma dica para montar o tx e rx o meu e o Arduino 2560 a ultima versão,e o meu sim e diferente do seu mostrado no exemplo o meu sim900 S2-1040s-z0955 por favor tem alguma dica.
      Obrigado.

      Excluir
  5. Eu mudei a posição do tx e rx mas nao consigo mandar a mensagem para celular ,você tem alguma dica para montar o tx e rx o meu e o Arduino 2560 a ultima versão,e o meu sim e diferente do seu mostrado no exemplo o meu sim900 S2-1040s-z0955 por favor tem alguma dica.
    Obrigado.

    ResponderExcluir
    Respostas
    1. Verifique seus pinos TX e RX, lembrando que o TX do arduino tem que ir no RX do SIM900, assim como RX do arduino tem que ir no TX do SIM900.

      Lembrando que o arduino usa TX/RX de hardware e uma outra porta TX/RX por SoftwareSerial

      Um teste bom é ligar os modulos separados e conectar apenas os pares TX/RX com um fio e fazer os testes de comunicação... de uma olhada em http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-introducao-i.html

      lá tem o exemplo mais simples pra testar isso!

      Excluir
  6. Olá Vinícius, eu estou querendo ligar o meu ar-condicionado pelo gsm shield, mas o programa que tenho não responde, você tem algum que possa fazer essa função liga desliga por sms?

    Desde já agradeço.

    ResponderExcluir
    Respostas
    1. Fala Robson, estou terminando um post sobre isso.
      Essa samana eu publico, vai te ajudar a desenvolver essa função liga/desliga.

      Excluir
    2. http://microembarcado.blogspot.com.br/2013/09/arduino-gprs-sim900-ler-sms-executar.html

      Excluir
  7. Obrigado irmão, é para um projeto da faculdade, e parabéns pelo blog.

    ResponderExcluir
  8. Olá, Vinicius, parabéns pelas postagem.
    eu envio esse código para o arduino no final da compilação fala que foi enviado porem da um erro embaixo:
    "avrdude: stk500_getsync(): not in sync: resp=0x00"
    o tx e o rx estao igual na imagem sua.

    tento comunicar com o sim900 porem nao aprece nada!
    me socorre!

    ResponderExcluir
    Respostas
    1. Fala parceiro, qual placa arduino você esta usando? talvez o TX/RX do modulo GSM esteja nos mesmos pinos da serial do arduino pino 0 e 1.

      O ideal nesses casos é isolar os problemas, primeiro tenta gravar o código sem o modulo GSM conectado. Eu sugiro seguir esse post:

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

      E ter certeza que a comunicação com modem esta funcionando. Depois disso passar para programas mais elaborados.

      Qualquer coisa so perguntar ai.

      Abs!

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
    3. Estou usando o UNO.
      realmente o erro que eu comentei, foi resolvido, era so retirar o modulo.
      porem ele mostra que o sms foi enviado, porem eu nao recebo no meu celular.

      Excluir
  9. Ola Vinicius, ja li varios artigos do seu blog e voce esta de parabens... eu e muitos amigos meus tiramos muitas duvidas com seus post.

    Estou com meu arduino Uno REV 3 e com um shield sim900 assim como o seu... Tento mandar a sms com essa programacao , mais meu nao recebo a sms, o programa roda no monitor serial aparece a mensagem que foi enviada com sucesso , porem nao chega...

    utilizo chip da vivo no sim900 e um arduino UNO rev 3....

    poderia me ajudar a resolver esse problema?

    desde j`a agradeco.

    Vlw

    ResponderExcluir
    Respostas
    1. Fala Gabriel! fico feliz que esteja gostando do blog :D

      Então sobre o seu problema, vamos começar do inicio, vamos primeiro ter certeza que seu arduino esta comunicando com o seu modem GSM, para isso eu recomendo seguir esse post:

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

      Logo depois que a comunicação estiver OK, passe para codigos mais avançados.

      Qualquer duvidas estamos ai,
      abs

      Excluir
  10. o sim900 `e compativel com o arduino uno rev 3?

    obrigadoo ;)

    ResponderExcluir
    Respostas
    1. Sim compatível com qualquer microcontrolador, e com todos Arduinos.

      Excluir
  11. Cara com essa sua programacao nao deu certo pra mim...
    mais essa funcionou perfeitamente

    Segue:

    #include

    SoftwareSerial mySerial(2, 3);

    #define BUF_LEN 84

    char comm_buf[256];

    void setup()
    {
    mySerial.begin(9600); // the GPRS baud rate
    Serial.begin(9600); // the GPRS baud rate
    mySerial.println("AT+CNMI = 3,3,0,0,0");
    delay(2000);
    mySerial.println("AT+CMGF=1");
    delay(2000);
    Serial.println("----------------------------- ENVIA SMS ----------------------------");
    mySerial.println("AT+CMGS=\"+5517TELEFONE\"\r"); //nº do celular
    delay(1000);
    mySerial.println("TESTE ENVIO DE SMS ARDUINO!"); // mensagem a ser enviada
    delay(1000);
    mySerial.println((char)26);
    Serial.println(comm_buf);
    memset(comm_buf,'\0',BUF_LEN);
    mySerial.flush();
    delay(5000);
    Serial.println("---------------------------- F I M ----------------------------");

    }



    void loop()
    {


    }

    ResponderExcluir
    Respostas
    1. quem bom que esse funcionou, me parece que seu modem funciona com mySerial.begin(9600); o modem usado no post usa mySerial.begin(19200); talvez esse tenha sido o problema

      Excluir
  12. Olá Vinícius, parabéns pelo projeto, como eu faria para adicionar mais números de telefone?

    ResponderExcluir