03 junho 2017

Controle o Arduino por SMS com o SIM800L

Você que já conhece o Shield GSM SIM900 e sabe do que ele é capaz, agora tem mais uma opção de placa que, além de mais recursos, tem um layout que pode facilitar a adaptação no seu projeto. É o módulo GSM GPRS SIM800L, que vamos usar nesse post para controlar um Arduino Uno usando mensagens de texto SMS enviadas por um smartphone.

Módulo GSM GPRS SIM800L

O SIM800L é um excelente módulo para projetos de IoT (Internet of Things ou Internet das Coisas), pois além do baixo consumo realiza a comunicação via interface serial, o que facilita a adaptação para as mais variadas placas e microcontroladores que usem esse tipo de comunicação.

O módulo é quad-band (GSM850MHz, EGSM900MHz, DCS1800MHz e PCS1900MHz), suporta GPRS e tem conector para antena externa, permitindo que a placa fique por exemplo dentro de uma caixa lacrada e com apenas a antena exposta, garantindo a perfeita recepção do sinal.

Conexões do módulo SIM800L


O módulo que vamos utilizar tem sete pinos, sendo dois para a alimentação (5V e GND), quatro para a serial/UART e um pino de reset. Na parte superior, podemos ver o conector para antena e o CI SIM800L (datasheet), além dos leds indicadores de energia e conexão com a rede GSM (NET):
SIM800L Detalhes pinos

Na parte inferior, temos o slot para cartão SIM, que faz a conexão com a rede de telefonia celular e que vamos usar neste post como receptor de mensagens SMS.

Com relação ao led NET, ao energizar o módulo ele pisca em intervalos de 1 segundo. Depois que a rede de telefonia é encontrada, o led pisca à cada 3 segundos.

SIM800L Antena

Na imagem acima podemos ver o módulo com o pigtail SMA e a antena instalados.

Conexão do SIM800L no Arduino Uno


Como mencionamos anteriormente a alimentação do módulo é de 5V, e para comunicação com o microcontrolador vamos usar os pinos 10 e 11, emulando uma serial com a ajuda da biblioteca SoftwareSerial

Circuito Arduino Uno e Módulo GSM SIM800L

No circuito acima temos 2 leds ligados às portas digitais 4 e 5. Esses leds serão acesos conforme a mensagem SMS recebida.

Recomendo utilizar alimentação externa para o módulo SIM800L (usei uma fonte de 5V/2A), pois alimentando apenas com o Arduino o módulo reiniciava sempre que se conectava à rede de telefonia celular.

Programa SMS SIM800L


O programa que vamos utilizar para controle do Arduino usa a biblioteca SIM800L (download), que facilita o uso de comandos para envio de SMS, realizar chamadas, recuperar dados do cartão SIM, etc. Descompacte a pasta e coloque-a dentro da pasta LIBRARIES da IDE do Arduino.

No programa também carregamos a biblioteca SoftwareSerial, necessária para que a biblioteca SIM800L funcione. Nesse caso, usaremos os pinos digitais 10 e 11 para emular uma interface serial e realizar a comunicação com o módulo. Não se esqueça de utilizar no slot da placa um cartão SIM válido e desbloqueado.

No loop temos a parte que fica aguardando a chegada de uma mensagem de texto SMS. Quando essa mensagem é recebida, é analisada pelos comandos IF para determinar qual led do circuito deve ser aceso: as mensagens L1 e D1 acendem e apagam, respectivamente, o led vermelho. As mensagens L2 e D2 fazem a mesma coisa com o led verde, e você pode customizar as mensagens de acordo com as necessidades do seu projeto.

Repare que temos comandos reduzidos para apagar as mensagens da memória (linha 22), recuperar o número de telefone (linha 39) e o texto do SMS (linha 30) já que esse trabalho é todo feito pela biblioteca.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//Programa: Controle de Arduino por SMS com SIM800L
//Autor: Arduino e Cia

#include <Sim800l.h>
#include <SoftwareSerial.h>

Sim800l Sim800l;

String textSms, numberSms;
uint8_t LED1 = 4; //Conexao Led vermelho
uint8_t LED2 = 5; //Conexao Led verde
bool error;

void setup()
{
  Serial.begin(9600);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  Sim800l.begin();
  Serial.print("Limpando SMS antigos...");
  error = Sim800l.delAllSms(); //Apaga SMS
  Serial.println(" Apagados!");
  Serial.println("\nAguardando comandos por SMS...");
}

void loop()
{
  //Le o SMS da posicao 1
  textSms = Sim800l.readSms(1);

  //Verifica se o SMS foi recebido e eh valido
  if (textSms.indexOf("OK") != -1)
  {
    //Verifica se o SMS esta vazio
    if (textSms.length() > 7)
    {
      //Retorna o numero do celular que enviou o SMS
      numberSms = Sim800l.getNumberSms(1);
      //Mostra o numero do telefone no Serial Monitor
      Serial.println(numberSms);
      //Converte o texto para maiusculas
      textSms.toUpperCase();

      //Caso receba L1, acende o led 1 (vermelho)
      if (textSms.indexOf("L1") != -1)
      {
        Serial.println("Led 1 Ligado");
        digitalWrite(LED1, 1);
      }
      //Caso receba D1, apaga o led 1 (vermelho)
      else if (textSms.indexOf("D1") != -1)
      {
        Serial.println("Led 1 Desligado");
        digitalWrite(LED1, 0);

      }
      //Caso receba L2, acende o led 2 (verde)
      else if (textSms.indexOf("L2") != -1)
      {
        Serial.println("Led 2 Ligado");
        digitalWrite(LED2, 1);

      }
      //Caso receba D2, apaga o led 2 (verde)
      else if (textSms.indexOf("D2") != -1)
      {
        Serial.println("Led 2 Desligado");
        digitalWrite(LED2, 0);
      }
      //Apaga todos as mensagens da memoria, garantindo que o proximo
      //SMS esteja sempre na posicao 1
      Sim800l.delAllSms();
    }
  }
}

Você pode acompanhar o recebimento de SMS utilizando o Serial Monitor, que mostra a mensagem que foi recebida, e também o número do celular do qual ela foi enviada:

Serial Monitor SIM800L

Comandos AT com o módulo SIM800L


Assim como acontece com outros módulos GSM, você também pode controlar e obter informações do módulo SIM800L utilizando comandos AT. Isso é muito útil, por exemplo, quando você precisa fazer um teste básico para saber se a conexão foi feita corretamente e se há comunicação entre o módulo e a placa controladora.

Para isso, carregue o programa abaixo no Arduino. Você pode usar o mesmo circuito montado anteriormente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//Programa: Comandos AT com o SIM800L
//Autor: Arduino e Cia

#include <SoftwareSerial.h>

//TX do SIM800L conectado ao pino 10
#define SIM800_TX_PIN 10

//RX do SIM800L conectado ao pino 11
#define SIM800_RX_PIN 11

SoftwareSerial serialSIM800(SIM800_TX_PIN, SIM800_RX_PIN);

void setup()
{
  //Comunicacao serial para uso com o Serial Monitor
  Serial.begin(9600);
  while (!Serial);

  //Comunicacao com o modulo SIM800L
  serialSIM800.begin(4800);
  delay(1000);

  Serial.println("Envie o comando AT para o SIM800L...");
}

void loop()
{
  //Mostra no Serial Monitor os dados enviados pelo modulo
  if (serialSIM800.available())
  {
    Serial.write(serialSIM800.read());
  }

  //Envia os comandos AT para o modulo
  if (Serial.available())
  {
    serialSIM800.write(Serial.read());
  }
}

Abra o Serial Monitor, selecione "Ambos, NL e CR" na parte inferior da janela e digite os comandos AT na parte superior:

Serial Monitor - Comandos AT

Você encontra a lista completa de comandos AT disponíveis para o módulo GSM SIM800L neste link.

Finalmente, no vídeo abaixo podemos ver o circuito de controle do Arduino via SMS em funcionamento:


Você também pode usar este programa para controlar relés, sensores e outros equipamentos conectados ao Arduino, ou usar o módulo SIM800L com outras placas como Raspberry Pi, Beaglebone e outras que utilizem a comunicação serial.

60 comentários:

  1. Esses módulos vão ser afetados por aquele bloqueio de aparelhos não homologados que vai acontecer no Brasil?

    ResponderExcluir
    Respostas
    1. Oi Cris,

      Ótima pergunta. Estamos de olho nisso. Vamos aguardar as definições da Anatel & Cia sobre o assunto e fazer alguns testes.

      Abraço!

      Adilson

      Excluir
    2. Venho me fazendo essa pergunta faz tempo... Em plena era da IoT se esse bloqueio no Brasil for realmente efetivado vai dar pano pra manga. rss... Se querem combater a pirataria de celular, penso que o bloqueio deveria ser restrito a chamadas ou trafego de dados, já que 20mb pra IoT pode atender e pra celular não da nem pro começo.

      Excluir
    3. alguma resposta sobre a questão de bloqueio?

      Excluir
    4. Oi Lucas,

      Ainda não. Também estamos aguardando. Por enquanto, tudo funcionando normalmente. :)

      Abraço!

      Adilson

      Excluir
    5. Estava com um projeto para utilizar esses módulos, mas depois do que li no site da ANATEL, acho melhor mudar para Xbee ou redes LOra.
      3) Quais equipamentos precisam ser certificados pela Anatel?
      Todos os equipamentos que utilizem radiocomunicação, dentre outros, precisam ser certificados, como por exemplo: telefones celulares, smartphones, modems, tablets, rastreadores, babás eletrônicas, telefones sem fio, notebooks, microfones sem fios, dentre outros.

      De forma geral, devem ser certificados todos os aparelhos que acessem a rede celular, ou seja, aqueles que utilizam um SimCard ou Chip de uma operadora móvel.

      Excluir
    6. Essa questão podemos resolver usando um celular baratinho, fazendo as adaptações necessárias para trabalhar num projeto com o arduino. Daí não teremos problemas com questões de bloqueio etc.

      Excluir
  2. Faltou declarar os pinos de SS no inicio

    ResponderExcluir
    Respostas
    1. Oi Eduardo,

      Nesse caso, a definição dos pinos da SoftwareSerial é feita dentro do arquivo da biblioteca SIM800L. Por padrão, os pinos utilizados por ela são o 10 e 11.

      Abraço e obrigado por perguntar! ;)

      Adilson

      Excluir
    2. Não tem como utilzar outras portas ? Pois a 11 eu utilizo para usbasp.

      Excluir
    3. Pode editar o Sim800l.h com um editor como o MPLAB IDE, e trocar as portas rx e tx.

      Excluir
  3. Show. Parabéns pelo trabalho com esse site. Descobri ele hoje (22/06/17). Comecei a conhecer o mundo do Arduino agora. Estou lendo tudo que posso para aprender. Muito fácil suas explicações.

    ResponderExcluir
    Respostas
    1. Muitíssimo obrigado, e fique de olho pois sempre temos novidades. :)

      Abraço!

      Adilson

      Excluir
  4. Olá amigo, como faço para receber uma mensagem de volta indicando que o led esta ligado?

    ResponderExcluir
    Respostas
    1. Oi Ivanilson,

      Para envio de SMS, você de usar o comando abaixo:

      Sim800l.sendSms("+5511987654321","Texto Aqui")

      Na biblioteca SIM800L existe um exemplo para envio de SMS.

      Abraço!

      Adilson

      Excluir
    2. Obrigado, outra pergunta tem como exibir o numero que esta ligando para chip que esta no modulo?

      Excluir
  5. Olá amigo, recentemente comprei um modulo GSM/GPRS A6_MINI, mais não encontro nada falando dele, seria bom um tutorial iria ajudar muito. :)

    ResponderExcluir
    Respostas
    1. Oi Ivanilson,

      Onde você comprou esse módulo? Pode me passar o link? Eu não tenho ele (ainda). :)

      Abraço!

      Adilson

      Excluir
    2. https://www.arduinolandia.com.br/modulo-gsm-gprs-a6

      Excluir
  6. Boa tarde, optimo trabalho esplicacao muito clara.
    eu comprei um modulo fiz tudo que recomenda no tutorial mais quando envio os comandos AT ele responde OK, mais quando envio o comando AT+COPS ele responde somente com 0 OK.
    sera que o modulo nao esta conectar-se a rede? como fazer para saber se estou com rede
    ai vai o link do modulo que tenho
    https://pt.aliexpress.com/store/product/10pcs-lot-Smallest-SIM800L-GPRS-GSM-Module-MicroSIM-Card-Core-BOard-Quad-band-TTL-Serial-Port/623118_32767924610.html?spm=a2g03.12010615.0.0.wkOu9h

    ResponderExcluir
  7. Olá Adilson estou precisando de uma ajudinha: Coloquei o sistema para enviar mensagens para um determinado número a cada 3 horas, porém depois de alguns dias as mensagens param! será que o módulo entra em Standy-by ou algo assim?? Se eu reiniciar o arduino tudo volta ao normal e depois tudo de novo...

    ResponderExcluir
    Respostas
    1. Oi Francisco,

      Estranho isso. Que tipo de fonte de alimentação vc está usando? Ele trava sempre depois de "x" dias?

      Abraço!

      Adilson

      Excluir
  8. olá, tentei juntar o módulo sim800l com o GPS, mais como os módulos utilizar o software serial, o GPS retorna lat. 0,00000 log 0,000000. Vc tem alguma solução ?

    ResponderExcluir
  9. Preciso mandar informações para um servidor Web, poderia me dar alguma dica de como fazer???

    ResponderExcluir
    Respostas
    1. Oi Alex,

      Eu ainda não tenho um post específico sobre isso com o SIM800L, mas tenho um com o SIM900, veja se te ajuda, por favor:

      http://www.arduinoecia.com.br/2015/11/acessar-internet-arduino-gsm-shield-sim-900.html

      Abraço!

      Adilson

      Excluir
  10. Baixei o DATASHEET do SIM800L, mas ele está pedindo uma SENHA para abrir o arquivo.....
    Alguém sabe me dizer qual é ?

    ResponderExcluir
  11. Olá Adilson!

    Muito obrigado por compartilhar toda estas informações no seu site! Apenas uma rápida observação: me parece que a alimentação do SIM800L deve ficar entre 3.4V e 4.4V, e não 5V como descrito.
    Um grande abraço!
    Roberto

    ResponderExcluir
    Respostas
    1. Oi Roberto!

      Pois é, eu também fiquei com essa dúvida, mas pelo que eu vi, essa limitação de 3.4 e 4.4V se refere ao chip, e não ao módulo, que tem um regulador de tensão embutido. Mesmo assim, vou ficar de olho para ver se não falei nenhuma besteira. :)

      Abraço!

      Adilson

      Excluir
  12. Olá, poderia me dizer se no vídeo que você mostra o funcionamento do protótipo, se o Arduino estaria conectando ao computador? Fiz essa montagem, porém o meu protótipo só funcionava se conectado ao computador.
    Desde já, obrigada!

    ResponderExcluir
    Respostas
    1. Bom dia,

      Que estranho... mas no meu estava conectado sim.

      Abraço!

      Adilson

      Excluir
  13. Olá, no tutorial vc usou uma alimentação de 5v e 2A. Existem algum problema em usar uma amperagem maior 2A.

    ResponderExcluir
    Respostas
    1. Bom dia,

      Pode usar uma amperagem maior, sem problemas.

      Abraço!

      Adilson

      Excluir
  14. Olá Adilson, boa noite. Sempre acompanho seus posts, e tenho que agradecer muito a você, afinal depois de descobrir seus posts, evoluí exponencialmente no arduino. Obrigado.
    Preciso de ajuda (de verdade), estou fazendo um TCC, preciso muito concluir meu projeto, depois de ter lido seus posts sobre SIM900 e WEB e este aqui de SIM800, projetei meu sistema embarcado para receber info de ajuste por SMS e ele teria que postar num BD Mysql os dados monitorados pelo sisteminha. Pois bem, Universitário (quebrado), já sabe... adquiri no MercadoLivre um SIM800L por que é muuuuuito mais barato. MASSSSS estou desesperado, por que logo de cara nada funcionou, copiei e colei o código ai a cima, montei o esquema na proto com os dois leds, coloquei um chip da VIVO que estava no meu celular (uso todo dia), e peguei o cel do meu pai pra enviar a SMS... Enviado e... nada. O monitor serial continua "Aguardando SMS..." todos os testes que fiz com os comandos at fuincionaram mas na hora de controlar nao vai. O que Fazer?? Please, HELP!!

    ResponderExcluir
    Respostas
    1. Oi Daniel!

      Cara, antes de mais nada, parabéns pela sua persistência.. rs...

      Por acaso você está usando fonte externa para alimentar o SIM800? Eu recomendo.

      Abraço!

      Adilson

      Excluir
    2. Oi Adilson,

      Estou sim! Utilizo uma fonte 5v 2A para alimentar em paralelo Arduino e módulo.

      Eu até consegui agora fazer ele enviar a tal da SMS mas não consigo capturar o número do telefone solicitante para responder, pois dá um conflito esquisito na conversão de Char para string. Não sei pq q o módulo quando recebe uma SMS guarda o número numa char, mas quando vai enviar pega valores de uma string, e passar de uma pra outra da uns erros doidos. Faz um teste. Se conseguir por favor. Help

      Excluir
  15. Alguém sabe me dizer se esses módulos ainda estão funcionais a Anatel barrou ou nao?

    ResponderExcluir
  16. Boa tarde. Excelente post. Sabe me informar se com o SIM900 eu consigo fazer leitura dos DTMF para acionamento de leds por exemplo? Obrigado

    ResponderExcluir
    Respostas
    1. Oi Eduardo,

      Interessante a sua ideia. Bom, ele funciona como se fosse um telefone "comum", se você adicionar o alto falante e o microfone, mas não sei te dizer se ele reconheceria os tons DTMF.

      Abraço!

      Adilson

      Excluir
  17. compiling problem " Read SMS from location 1 textSms = Sim800l.readSms ( 1 ); " these Put a solution to the problem

    ResponderExcluir
  18. A good project, but is possible to insert in the sketch only number autorized that turn on/off the led? thanks

    ResponderExcluir
  19. salve come posso inserire solo numeri autorizzati?
    grazie

    ResponderExcluir
  20. Estes modulos são homologados pela FCC e não serão bloqueados pela Anatel. Na matéria que eu vi só ocorrera o bloqueio do IMEI que não for registrado em algum orgão.

    ResponderExcluir
  21. Há alguns dias, comprei o Módulo GSM GPRS SIM800L + Antena SMA nessa empresa, o qual não funcionou. Copieis os sketchs do seu site. Testei numa placa Arduino Mega e numa Uno. Usei fonte externa para o módulo (5,0V 2A, a mesma que uso com o Raspberry Pi 3). Coloquei um chip de celular que está em uso normal. Nem sequer conectou à rede (o led net ficou piscando a cada segundo). Também, não consegui resposta aos comandos AT (remetia AT na serial e era mostrado apenas AT, sem o OK). Chequei todas as conexões.
    O que devo fazer?
    Aguardo sua resposta.
    Atenciosamente,
    dionizio barbosa

    ResponderExcluir
    Respostas
    1. Oi Dionizio,

      Se você fez tudo corretamente, pode ser que o módulo esteja com defeito. Entre com a empresa que vendeu para você, por favor.

      Abraço!

      Adilson

      Excluir
    2. Ok. Foi Filipeflop. É uma boa empresa; já comprei lá diversas vezes.
      Obrigado.

      Excluir
    3. caro Dionizio Barbosa , nem sempre esses modulos sao tolerantes a 5V. alimente o modulo com 3.8V e considere colocar um conversor de niveis TTL no RX TX entre o arduino e o modulo. Eu so utilizo assim...
      No datasheet do modulo demonstra como realizar a ligação e o circuito desse conversor.

      Excluir
    4. Obrigado, Leandro.
      Vou tentar segur sua orientação, mas não sei se tenho conhecimentos sufucientes para fazer isso. Comprei o módulo certo de que seria muito fácil utilizá-lo...
      Mas, vou tentar...

      Excluir
  22. Bom dia!
    Gostaria de saber como respondo um numero qualquer que me mandou SMS? Criar uma variável ao inves de colocar “+55.....” .

    ResponderExcluir
  23. Bom dia.

    Como faço para salvar o ultimo estado do LED nesse projeto na EEPROM?

    ResponderExcluir
  24. oi qual e a diferença entre esse modulo e o modulo vermelho

    ResponderExcluir
    Respostas
    1. Boa noite,

      A parte de programação é a mesma. O que muda é que o módulo vermelho tem conexões para microfone e alto-falante.

      Abraço!

      Adilson

      Excluir
  25. bom dia tem como a gente substitui o amei do modulo pelo um de modem 3g Anatel , estou com receio com esse bloquei ele pare

    Obrigado Paulo

    ResponderExcluir
    Respostas
    1. Oi Paulo,

      A informação que eu tenho é que não vão bloquear IMEI de dispositivos como modens, por exemplo, creio que esses módulos SIM800L e SIM900 se encaixem nessa categoria, de qualquer forma vamos aguardar para ver se o foco mesmo é bloquear os celulares irregulares.

      De qualquer forma, não é possível substituir o IMEI do módulo.

      Abraço!

      Adilson

      Excluir
  26. Olá!
    Gostaria de saber se você tem algum código fonte simples de condicional "Enviar Mensagem de Texto se apertar um botão ligado ao Arduíno". Por favor.

    ResponderExcluir
    Respostas
    1. Oi Jonas,

      Ainda não tenho, mas já estou mexendo no post. Será lançado em breve. ;)

      Abraço!

      Adilson

      Excluir
  27. Olá, muito bom o tutorial. Estou fazendo alguns testes com o mesmo módulo e Arduino UNO, porém independente do CHIP SIM, operadora ou sinal, sempre me retorna esse erro:

    ------------------------------------------------------------------------------------------
    EnviEnvie o comando AT para o SIM800L...
    AT
    OK
    AT+CSQ
    +CSQ: 23,0

    OK
    AT+COPS=?
    +COPS: (2,"TNL PCS S.A.","Oi","72431"),(1,"Claro","Claro","72405"),(1,"TIM BRASIL","TIM","72403"),(1,"72410","72410","72410"),,(0-4),(0-2)

    OK
    AT+COPS=1
    ERROR
    AT+CMEE=2
    OK
    AT+COPS=2
    +CME ERROR: SIM not inserted

    ----------------------------------------------------------------------------------------------
    SIM not inserted = Não encontrei nada que se refira diretamente ao problema, já tentei diversas maneiras google a fora, mas o erro persiste os chips testado funcionam muito bem em outros aparelhos e inclusive um M2M.

    Alguém já passou por isso?

    ResponderExcluir
    Respostas
    1. Oi Gilson,

      Pode ser um erro de hardware. Vocë consegue testar com outro módulo?

      Abraço!

      Adilson

      Excluir
    2. Olá Adilson, acabou de chegar outro modelo e o erro persiste. Exatamente o mesmo comportamento.

      Excluir
    3. Oi Gilson,

      Conseguiu fazer funcionar? Muito estranho esse erro. Testei aqui com um módulo novo e está tudo ok.

      Abraço!

      Adilson

      Excluir