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.

31 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
  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
  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