Módulo GSM SIM800L
Neste tutorial, iremos testar as principais aplicações do módulo GSM SIM800L diretamente com os comandos AT pela UART , assim, podemos fazer o mesmo código para diversos microcontroladores como PIC, ESP8266/32, ARM, AVR, etc, mudando apenas os métodos de utilização da UART de MCU para MCU, já que os comandos AT serão sempre iguais. Para esse tutorial usaremos o Arduino Mega como controlador.
[toc]
O que vamos aprender?
As principais aplicações deste módulo são:
- SMS (receber e enviar).
- Obter horário da rede, similar ao NTP ou RTC.
- Obter localização por triangulação da rede.
- Conexões TCP/UDP (inclusive SSL/TLS).
- Ligações com entrada e saída de áudio.
Neste tutorial, Aprenderemos os 3 primeiros itens separadamente encontrados na lista apresentada.
Mãos a obra – Testando algumas funções do SIM800L
Componentes necessários
- 1x – SIM800L
- 1x – Fonte externa de 3,4 a 4.4V de 2A.
- 1x – Arduino Mega
- Fios Jumpers
- Protoboard
Montando o projeto
Atenção: esse módulo pode utilizar muita corrente de sua fonte em picos de transmissão (até 2A), então não alimente-o diretamente pelo Arduino.
Recomenda-seutilizar uma fonte externa de 3,4V a 4,3V de no mínimo 2A. Caso não tenha uma fonte com tanta corrente, você pode adicionar alguns capacitores de alto valor capacitivo para ajudar nos picos de transmissão. Se a fonte não for suficiente para alimentá-lo, ele irá reiniciar aleatoriamente durante as transmissões.
Projeto 1 – Enviando e recebendo SMS
Programando o Arduino
void setup() { Serial2.begin(115200); pinMode(13, OUTPUT);//LED pinMode(8, OUTPUT);//Pino de reset do GSM //reinicia o GSM digitalWrite(8, 0); delay(2000); digitalWrite(8, 1); delay(7000); if (gsmWrite("AT", "OK") == "FAIL") { return;//Se o GSM nao responder, retorna a funcao (trava o mcu) } delay(5000);//Espera o termino da inicializacao do GSM SMSsnd("014998202683", "Arduino ON, lendo mensagens...");//Envia a mensagem pro numero. Atencao: precisa do DDD! } void loop() { SMSrd();//Verifica se há novas mensagens para serem lidas a cada 10seg delay(10000); } String gsmWrite(String snd, String rcv)//Funcao que envia dados pro GSM e espera a resposta de ate 30seg { Serial2.println(snd); if (rcv.indexOf("+CMGS") > -1) { delay(150); Serial2.write(0x1A); } for (uint16_t i = 0; i < 1200; i++) { delay(25); if (Serial2.available()) { delay(50); String a = Serial2.readString(); if (a.indexOf(rcv) > -1 || rcv.length() == 0) { return a; } } } return "FAIL"; } void SMSsnd(String nm, String msg)//Funcao que envia o SMS { String snd = "AT+CMGS=\""; snd += nm; snd += "\""; gsmWrite("AT+CMGF=1", "OK"); gsmWrite("AT+CSMP=17,255,0,0", "OK"); gsmWrite(snd, ">"); gsmWrite(msg, "+CMGS:"); } void SMSrd()//Funcao que le se ha SMS nao lido { String c = ""; gsmWrite("AT+CMGF=1", "OK"); c = gsmWrite("AT+CMGL=\"REC UNREAD\"", ""); if (c.indexOf("+CMGL:") > -1) { if (c.indexOf("ON") > -1)//ON { digitalWrite(13, 1);//se o SMS conter o texto ON, liga o LED } else if (c.indexOf("OFF") > -1)//OFF { digitalWrite(13, 0);//se o SMS conter o texto OFF, desliga o LED } gsmWrite("AT+CMGD=1,1", "OK");//apaga todas mensagens (SIM card ha pouca memoria) } }
Colocando para funcionar
Depois de ligar nosso projeto na alimentação, vamos logo receber uma mensagem indicando que o sistema está ativo, mostrando que o envio de SMS funcionou perfeitamente. Também foi adicionada a leitura de SMS, de modo que, quando um SMS é enviado com a mensagem “ON” ou “OFF”, o LED no pino 13 seja ligado ou desligado.
Projeto 2 – Obtendo horário através da rede
Programando o Arduino
void setup() { Serial.begin(115200); Serial2.begin(115200);//Inicia a Serial do GSM pinMode(8, OUTPUT);//Pino de reset do GSM //Reinicia o GSM digitalWrite(8, 0); delay(2000); digitalWrite(8, 1); delay(7000); String rcv = gsmWrite("AT", "*PSUTTZ:");//Espera o GSM obter o horario da rede if (rcv.indexOf("FAIL") > -1) { gsmWrite("AT+CLTS=1;&W", "OK");//Se nao responder, pode ser configuracao do seu GSM, entao vamos ativar a obtencao automatica de horario pela rede setup();//retorna ao inicio } delay(5000); } void loop() { Serial.println(gsmTIME());//Mostra a data e horario no Serial Monitor delay(5000); } String gsmWrite(String snd, String rcv)//Funcao que envia dados ao GSM e espera a resposta { Serial2.println(snd); if (rcv.indexOf("+CMGS") > -1) { delay(150); Serial2.write(0x1A); } for (uint16_t i = 0; i < 1200; i++) { delay(25); if (Serial2.available()) { delay(50); String a = Serial2.readString(); if (a.indexOf(rcv) > -1 || rcv.length() == 0) { return a; } } } return "FAIL"; } String gsmTIME()//Funcao que retorna a data e horario { String c = gsmWrite("AT+CCLK?", "+CCLK:"); int16_t a = c.indexOf("\"") + 1; int16_t b = c.indexOf("\"", a); return c.substring(a, b); }
Colocando para funcionar
Abrindo o Serial Monitor, podemos observar a data e o horário retornado pelo módulo GSM, lembrando que a data está no padrão (ano/mês/dia). O ultimo valor do horário corresponde ao fuso horário*4, logo, para obter nosso fuso horário, basta dividir “-12” por 4 e chegamos em -3 (fuso horário de brasília).
Projeto 3 – Obtendo localização através da rede
Programando o Arduino
void setup() { Serial.begin(115200); Serial2.begin(115200); pinMode(8, OUTPUT);//Pino de reset do GSM //Reseta o GSM digitalWrite(8, 0); delay(2000); digitalWrite(8, 1); delay(7000); if (gsmWrite("AT", "OK") == "FAIL") { return; } delay(5000); if (gsmWrite("AT+SAPBR=1,1", "OK") == "FAIL")//Ativa a rede pra localizacao { return; } else { String rcv = gsmWrite("AT+CIPGSMLOC=1,1", "+CIPGSMLOC:");//Pergunta a localizacao ao GSM int a = rcv.indexOf(":") + 2; int b = rcv.indexOf(",", a); if (rcv.substring(a, b) == "0") { a = rcv.indexOf(",", b) + 1; b = rcv.indexOf(",", a) + 1; b = rcv.indexOf(",", b); Serial.println(rcv.substring(a, b));//Mostra a localizacao no Serial monitor } } } void loop() { } String gsmWrite(String snd, String rcv)//Funcao que envia dados ao GSM e espera a resposta { Serial2.println(snd); if (rcv.indexOf("+CMGS") > -1) { delay(150); Serial2.write(0x1A); } for (uint16_t i = 0; i < 1200; i++) { delay(25); if (Serial2.available()) { delay(50); String a = Serial2.readString(); if (a.indexOf(rcv) > -1 || rcv.length() == 0) { return a; } } } return "FAIL"; }
Colocando para funcionar
As coordenadas que o módulo GSM retorna é longitude e latitude respectivamente.
Entendendo a fundo
Software
Para utilização do módulo GSM foram usados os comandos “AT” do Datasheet, este pode ser encontrado logo abaixo em nossa seção de referências. Existem incontáveis comandos para as mais diversas aplicações e se você pretende utilizar o módulo GSM, aconselhamos que estude o Datasheet e conheça os comandos necessários para seu projeto.
A comunicação entre o Microcontrolador e o módulo GSM é feita através da porta Serial (UART) à 115200b/s neste caso, mas pode ser alterada. A cada comando enviado, normalmente, retorna-se uma resposta, então sempre que enviamos um comando, precisamos esperar a resposta para saber se os dados enviados foram realmente enviados. Para isso, foi criada uma função básica cuja função é escrever o dado no módulo GSM e esperar o retorno da resposta em um tempo limite de 30 segundos. Tome cuidado que alguns comandos podem demorar até 85 segundos para retornar resposta e caso isso aconteça, o código irá falhar por timeout. Para arrumar isso, aumente o timeout da função de leitura.
-Função gsmWrite(String snd, String rcv)
gsmWrite("AT", "OK");
A função criada para envio de dados do módulo GSM é uma boa maneira de utilizar o mesmo em diversos tipos de códigos, entretanto, como normalmente após a escrita de algum comando nós esperamos uma resposta, isto pode deixar nosso código lento e travando, já que alguns comandos demoram até 85 segundos!
Essa função basicamente escreve o comando (primeiro argumento da função, “snd“) AT na porta Serial e posteriormente espera a resposta do mesmo (segundo argumento da função, “rcv“). Caso o módulo GSM não retorne a reposta esperada em 30 segundos que definimos no loop FOR() da função, retorna-se a mensagem “FAIL”.
-Comandos AT
O módulo GSM SIM800L funciona com os comandos AT e a maioria deles retorna alguma mensagem de confirmação ou erro, vamos ver como alguns deles funcionam!
AT+CCLK
Quando requisitado “AT+CCLK?” do SIM800L, retorna-se “+CCLK: <time>” e ao fim, “OK”. Também pode-se retornar erros como mostrado na imagem.
AT+CMGL
A leitura de SMS do nosso projeto foi dedicada apenas às mensagens não lidas, por isso utilizamos “AT+CMGL=”REC UNREAD””, mas você pode trocar para qualquer uma das opções acima que se encaixar melhor ao seu projeto.
Conclusões finais
As utilidades para o módulo GSM são inúmeras e isto nos permite ter uma gama de aplicações muito grande em um mesmo projeto, já que conta com diversas features, desde SMS até conexões TCP e etc. Apesar de alguns comandos demorarem bastante por causa da latência da rede telefônica, ainda podemos usufruir bem deste incrível módulo. O SIM800L faz muito mais do que mostrado aqui, entretanto estamos mostrando apenas o básico para norteá-los.
Referencias
Estudante de Engenharia da Computação pela USC, pretende se aprimorar e fazer a diferença nesta imensa área da tecnologia. Apaixonado por IoT, sistemas embarcados, microcontroladores e integração da computação nos mais diversos fins práticos e didáticos.
64 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Boa noite! Existe a possibilidade de usar o espaço do sim card para armazenamento de telefones e realizar identificação de quem está ligando e assumir funções distintas para cada numero?
Nunca usei, mas creio que já vi algo disso no manual dos comandos AT. Procure pelo phonebook.
Boa tarde, José !
Cara, fiz com o Arduino Mega e copiei o código. O meu módulo SIM800L está piscando a cada 3 segundos. Estou usando um regulador LM2596. A fonte parece ok.
O problema é que ele não responde o ‘OK’ pro comando AT de jeito nenhum.
Vc sabe o que pode ser ?
JOSE.. voce teria algum exemplo usando gravando dados em um servidor via php?
Não :(
Minha localização sempre vem -53.467918,-24.941240
coloco no google, dá la no Oceano!! :/
Olá tenho uma duvida, ao transcrever esses comandos para o meu arduino é possível gravar esses comandos no SIM800L, sendo assim, não precisando mais do arduino?
O GSM aceita alguns comandos serem escritos na memória (parâmetros de configuração e etc), mas creio que não é possível fazer a mesma coisa do código sem um microcontrolador externo e o SIM800L usado no post.
Se você ir mais a fundo, iria ver que o SIM800 e etc, são microcontroladores e tem até GPIO’s disponíveis pro usuário controlar, mas é um buraco mais fundo..
Olá pessoal, gostaria de desenvolver um projeto utilizando um módulo Gprs gsm Sim800l para acionar um contato NF por ligação telefônica, ou seja: quando o módulo recebesse uma ligação telefônica ele acionaria um relé, teria como?
Alguém conseguiu ler comandos enviado via SMS por exemplo o comando ON ou OFF?
peguei o exemplo acima mais parece que le apenas metade dos dados, segue abaixo o que eu recebo quando mando um SMS ON
AT+CMGL: 2,”REC UNREAD,”+044999999999″,””,”
Boa tarde, eu gostaria de saber como eu consigo programar o SIM900 para obter dados de localização, desde já agradeço!
Sim, é igual ao deste post, mas resumindo em um comando é “AT+CIPGSMLOC=1,1”, mas você precisa ativar alguns itens do GSM antes como “Bearer profile” ou parecidos… De uma perguntada ao tio Google que tem um “datasheet” sobre comandos AT para localização.
Muito obrigada!!
Boa dia José!!! Que bom saber que alguém está utilizando esse conjunto SIM800l e ESP32,
porque não consegui achar quase nada relacionado em minhas pesquisas,
e quando acho é algo que as bibliotecas não funcionam para o ESP32.
Uma dúvida, tu está utilizando o hardwareserial ou simplesmente faz o crossover
no TX e RX e passa a programação com os comandos?
É possível compartilhar somente essa parte do projeto?
O meu objetivo é enviar dados coletados de uma estação meteorológica que estou
desenvoildendo para um servidor de ftp.
Ficarei imensamente agradecido, caso não possa, lhe entenderei perfeitamente!
Vou deixar meu e-mail [email protected] , no mais obrigado pela resposta e
pela luz no fim do túnel!
Não estou utilizando nada além do “padrão”. Envio os comandos AT diretamente pela UART do ESP32 (UART da IDF). Não tenho nenhum código compartilhável.
Caro José Morais, boa tarde.
Agradeço o retorno, obrigado.
Um abraço.
amigo sera que poderia me ajudar? estou fazendo um projeto e nele eu gostaria que ao ser acionado um led o arduino me enviasse uma msgm como me avisando que esse led foi acionado, poderia me ajudar com scketh?
Também gostaria de obter essa informação..
O código de programão acima só funciona com a placa arduino mega e se sim você poderia disponibilizar para a placa uno ?
Sim, para utilizar no Arduino UNO, basta trocar as funções que utilizam “Serial2” por “Serial”, visto que o UNO só tem uma Serial.
Olá, José. Foi dito no inicio do topico que caso nao se tenha a fonte de 2A, poderiausar uma com corrente menor, mas com um capacitor de alta capacitancia. Gostaria de saber se, caso eu utilizar uma bateria independente para alimentação do módulo gsm, daquelas de 12V, com o regulador de tensao 2596, qual o capacitor eu deveria usar?
O LM2596 aguenta tranquilamente os picos do GSM, não precisa de capacitor além do necessário para o ripple (veja datasheet).
JOsé
Que pena pois pensei que seu know how poderia ajudar e muito meu projeto.
Estou disponivel para conversar com outros que tenham experiencia com ESP32 e SIM 800 ou similar.
E queiram trabalhar em etapas do mesmo , como falie meu orçamento nao é nada grandioso mas compnsará o trabalho feito.
Meu tel 21 2274-3551
Carlos Frondizi
José
Estou tentando um projeto com ESP32 e Sim800L
De inicio so dados instantaneos d eum sensor.
numa segunda etapa, gravar os dados na nuvem.
Sei o que queremos mas nao sei fazer.
gostaria de tua ajuda ( tenho verba mas nao muita)
meus dados abaixo
Olá Carlos, me desculpe mas não estou disponível por falta de tempo para projetos. Talvez alguem possa te responder nesse comentário e te ajudar
Oi José, tenho uma dúvida. Quero saber como faço para obter a localização diretamente no meu celular sem usar o monitor serial. Obrigado desde ja!!
Pode tentar enviar via TCP, UDP, Emails, etc
Boa noite, o código funcionou mas só que aparaceu para mim coordenadas do oceano atlantico
?!! kkkk estou surpreso
Olá, estou com problemas.
O código compila normalmente, porém no monitor serial nada aparece… poderia me ajudar?
Verifique se a velocidade do Serial Monitor esta igual a do código.
Estou usando o arduino Uno, tem como eu adaptar essa programação para o meu arduino?
Sim, deve ficar praticamente igual.
Eu deveria tirar o Serial2 ?
Sim, a Serial2 é do Arduino MEGA. Ou você usa a única serial do UNO, ou uma software serial.
a eu estou usando o arduino uno , como eu faço para trocar o serial2 ????
ou vc usou quais bibliotecas ?
Reponde, o nível fica 0,0. As vezes por 1 segundo fica 16,0. Pensei que era o sinal, mas já tentei em diversos locais e não aparece sinal. Estou achando que não esta conseguindo autenticar na rede da operadora. Mas nao sei como faria para autenticar.
Estou utilizando uma fonte de 2 amp de 5v, utilizo um Lm2596 para baixar pra 4v. O LED pisca como se nao encontrasse sinal.
Ele responde a algum comando AT? Pegue o sinal da rede (RSSI) e veja se esta forte..
Ola! Não estou consegundo fazer funcionar o meu, estou achando que é problema no SIM800L. Sabes me dizer se só ai liga-lo, se fizer uma ligação para o numero do chip que esta nele, chama? ou da desligado? Grato.
Normalmente, o problema mais comum pro gsm não funcionar é uma má alimentação.
Olá! Sabes me dizer se funciona com o Arduino Uno Rev3? Grato.
Ótimo tutorial!
Sim
Muito bom o tutorial!
Há alguma forma de confirmar o envio ou entrega do SMS com o SIM800L?
Olá, tudo bem? Primeiramente obrigado pela postagem está muito legal e vai me ajudar mt! Por acaso você já fez tudo isso comunicando com um aplicativo de celular? Penso em um projeto que o celular envie um comando para a placa solicitando a localização e a placa devolve com a resposta porem não sei como fazer essa comunicação, solicitando via SMS acho mt vago.
O mais simples pode ser o próprio SMS. Se não, você pode enviar dados diretamente via TCP/UDP pro destino e etc, isso é bem mais rápido e eficiente que SMS.
Olá, o meu está com erro diz que o “serial2” não foi declarado,poderia enviar o código completo para o meu email?
Você precisa estar usando o Arduino MEGA ou qualquer outro que tenha o objeto da Serial2.
Olá José. Muto bom o seu post vai me ajudar muito.
Mas eu gostaria de saber quais as bibliotecas que você utilizou, pois em cada código está ausente a parte inicial aonde são definidas as bibliotecas a serem utilizadas no sketch.
Você poderia me ajudar por favor me indicando quais as bibliotecas devo utilizar ? Ou quem sabe mostrar o início de cada sketch com as definições de biblioteca ?
Muito obrigado pela atenção e parabéns pelo post
Não foi utilizado nenhuma biblioteca externa, por isso não foi incluído.
Você sabe dizer se é possível obter localização com o sim900?
Sim
Boa tarde José Morais, por um acaso você já desenvolveu algo integrando o sim800l com o modulo transmissor e receptor de radio frequência RF 433 MHz?
Não, normalmente utilizo apenas tecnologias separadas.
Bom dia José, nos exemplos acima usou quais porta de RX e TX? Não consegui obter as coordenadas GPS através da rede. Grato.
boa noite td bem? Tem função auto atendimento no sim800l com arduino?
Nunca utilizei funções sobre “ligação” com ele, mas sei que há disponível todos comandos necessários para inclusive efetuar ligações com microfone e etc. Verifique no datasheet dos comandos AT.
Boa tarde José!!! Que bom saber que alguém está utilizando esse conjunto, porque não consegui achar nada relacionado em minhas pesquisas, e quando acho é algo que as bibliotecas não funcionam para o ESP32. Uma dúvida, tu está utilizando o hardwareserial ou simplesmente faz o crossover no TX e RX e passa a programação com os comandos? É possível compartilhar somente essa parte do projeto? Ficarei imensamente agradecido, caso não possa, lhe entenderei perfeitamente! Vou deixar meu e-mail crisdonini@hotmail,com , no mais obrigado pela resposta e pela luz no fim do túnel!
Pode ser tbm um código exemplo ou literatura para eu me basear, é a primeira vez que tenho um módulo GSM em mãos…
Segui suas dicas e acho que deu certo (compilou certinho), mas só vou conseguir testar amanhã, de qualquer forma se puder me mandar algo para comparar seria legal. Utilizei o Hardware Serial e os comandos AT, se for somente isso, realmente é muito simples e eu me quebrando em achar bibliotecas.
Sim, eu utilizo os pinos de Hardware Serial (porém não nos pinos padrões) com os AT e é tão simples que usa-los é mais rápido do que encontrar bibliotecas, sendo apenas necessário enviar o comando AT e esperar a resposta… Se quiser uma ajuda melhor, pode me chamar no Whatsapp (14 998202683).
José, deu certo!!!! Funcionou certinho, sem segredos ou mandinga hehehehe.
Cara, muito obrigado pelas dicas, caso eu tenha alguma dúvida vou te mandar um Whatsapp sim, muito obrigado!
Boa noite, por um acaso você já fez alguma aplicação do ESP32 com o módulo SIM800L? Preciso enviar SMS mas não acho uma biblioteca válida para o ESP32. Parabens pelo tutorial!!!
Olá Cristian, no momento estou desenvolvendo um produto industrial com essa dupla (ESP32 + 800L) e nao utilizei bibliotecas, como foi ensinado no post. Todo o uso do GSM pelo ESP32 é feito pela Serial e seus comandos AT, creio que essa é sua saída também..