GSM Shield SIM900: Acione portas do Arduino por SMS e realize chamadas telefônicas
Faça chamadas, envie e receba SMS e até conecte a internet com o Arduino Shield GSM GPRS SIM900 EFCom. Com ele você pode monitorar a sua casa à distância, receber informações sobre sensores, enviar comandos para o Arduino via celular, e muito mais:
O ArduinoGSM Shield SIM900 funciona com Arduino Uno e, com algumas alterações, também com o Arduino Mega. Ele é quad-band (850/900/1800/1900 MHz) e você pode ter serviços de chamadas, SMS, internet e fax, tudo controlado pelo Arduino por meio de comandos AT.
Os comandos AT já estão incorporados à biblioteca do Arduino que vamos utilizar, mas você pode verificar a lista completa dos comandos e também descobrir novas funções acessando este link.
Arduino GSM Shield SIM900 – Conexões
O shield é controlado pelo CI SIM900 (datasheet), localizado na parte central da placa. Na parte superior esquerda, temos os botões de Reset do Arduino, Liga/Desliga do shield e também o Reset do Shield.
Na parte superior temos um conector para ligação de um display Nokia 5100, mas fique atento às conexões, já que esse conector segue um padrão diferente do encontrado nos displays disponíveis no mercado.
Você pode ligar e resetar o shield via software, utilizando as portas D6 (liga/desliga) e D5 (reset) do Arduino. Vamos utilizar esse método nos programas apresentados neste post.
No lado direito superior temos os pinos de configuração da porta serial para comunicação com o Arduino, que pode ser feita pelos pinos 0 (RX) e 1 (TX), ou pelos pinos 2 e 3, usando a biblioteca SoftwareSerial do Arduino. É essa configuração que vamos usar nos testes deste post, com o pino digital 2 como TX (Transmissão), e o pino 3 como RX (Recepção) da serial:
A utilização dos pinos 2 e 3 é mais prática pois assim você pode monitorar a situação do shield SIM900 pelo serial monitor da IDE do Arduino.
Os leds indicadores mostram se o shield está ligado e também a situação da rede GSM/GPRS. O led NET, especificamente, pisca a intervalos específicos para mostrar o status da conexão:
Instalação do GSM shield no Arduino
Para que o shield GSM funcione corretamente, certifique-se de que o seu cartão SIM esteja desbloqueado, e com créditos suficientes para efetuar ligações, enviar SMS e se conectar à internet.
A instalação do cartão SIM é bem simples, bastando encaixar o cartão no slot na parte de baixo da placa:
Depois de encaixar o cartão SIM, rosqueie a antena e encaixe o shield no Arduino. Alimente o Arduino com uma fonte de pelo menos 9V e 1A. Se você não fizer isso, o shield não receberá alimentação adequada, causando desligamento aleatório, perdas de conexão, etc.
Usando o GSM Shield com Arduino Mega
Para utilizar o shield SIM900 no Arduino Mega, abra a pasta da biblioteca e edite o arquivo GSM.cpp. Nele, configure os pinos TX e RX como 50 e 51, conforme a imagem abaixo:
Retire também os jumpers de configuração da serial, e faça a ligação ao Arduino Mega seguindo o esquema abaixo:
A conexão do GSM Shield no Arduino Mega ficará assim:
Carregue normalmente os programas a seguir. Nenhuma outra alteração é necessária.
Fazendo ligações com o GSM Shield SIM900
Para utilizar os programas deste post, faça o download da biblioteca GSM-GPRS-GPS-Shield, disponível neste link. Descompacte a biblioteca, renomeie a pasta para GSM_Shield e coloque-a dentro da pasta LIBRARIES da IDE do Arduino.
Vamos começar os testes pela função mais básica do shield, que é o de fazer uma ligação/chamada telefônica. A própria biblioteca já tem uma função para isso.
O programa abaixo liga automaticamente o shield, por meio da subrotina liga_desliga_GSMShield(). Para que o programa funcione corretamente, apenas o led PWR do shield deve estar ligado. Os leds STA e NET serão acionados automaticamente assim que o programa iniciar. Se o shield não estiver nessa configuração, aperte o botão LIGA/Desliga Shield por alguns segundos.
//Progama: Chamada telefonica usando o GSM Shield SIM900 //Autor: Arduino e Cia #include "SIM900.h" #include <SoftwareSerial.h> #include "call.h" CallGSM call; void setup() { Serial.begin(9600); Serial.print("Ligando shield GSM SIM900. "); liga_desliga_GSMShield(); Serial.println("Testando GSM Shield..."); //Comunicacao com o Shield GSM a 2400 bauds if (gsm.begin(2400)) Serial.println("nstatus=READY"); else Serial.println("nstatus=IDLE"); } void loop() { Serial.println("Discando...."); //Efetua a chamada formato call.Call(<numero a ser chamado>) call.Call("987654321"); Serial.println("Ligacao Efetuada!"); delay(20000); Serial.println("Encerrando a ligacao..."); call.HangUp(); Serial.print("Desligando shield GSM SIM900. "); liga_desliga_GSMShield(); do {} while (1); //Loop parando o programa } void liga_desliga_GSMShield() { Serial.print(F("Aguarde...")); pinMode(6, OUTPUT); digitalWrite(6, LOW); delay(1000); digitalWrite(6, HIGH); delay(1000); Serial.println(F("OK!")); digitalWrite(6, LOW); delay(500); }
Você pode monitorar o andamento da ligação utilizando um fone de ouvido ligado à saída de áudio do shield. Os comandos AT que são enviados à placa são mostrados no Serial Monitor, assim como algumas mensagens de aviso que inserimos no programa:
A princípio o programa efetua a ligação, e desliga depois de 20 segundos. Você pode configurar o programa para fazer esse desligamento manualmente, e utilizar um microfone ligado ao shield para realizar uma chamada.
Enviando SMS pelo Arduino
Enviar um SMS pelo GSM Shield SIM900 também é bem simples utilizando as funções da própria biblioteca. O programa abaixo envia um SMS com o texto Arduino e Cia GSM Shield para o número de telefone especificado na linha 11 do programa. A mensagem a ser enviada pode ser alterada na linha 12:
//Progama : Envio de SMS com o GSM Shield SIM900 //Autor: Arduino e Cia #include "SIM900.h" #include <SoftwareSerial.h> //Carrega a biblioteca SMS #include "sms.h" SMSGSM sms; char numero[20] = "987654321"; char mensagem[30] = "Arduino e Cia GSM Shield"; boolean started = false; void setup() { //Inicializa a serial Serial.begin(9600); Serial.print("Ligando shield GSM SIM900. "); liga_desliga_GSMShield(); Serial.println("Testando GSM shield..."); //Comunicacao com o Shield GSM a 2400 bauds if (gsm.begin(2400)) { Serial.println("nstatus=READY"); started = true; } else Serial.println("nstatus=IDLE"); if (started) { //Envia um SMS para o numero selecionado if (sms.SendSMS(numero, mensagem)) Serial.println("nSMS enviado!"); } Serial.print("Desligando shield GSM SIM900. "); liga_desliga_GSMShield(); } void loop() {} void liga_desliga_GSMShield() { Serial.print(F("Aguarde...")); pinMode(6, OUTPUT); digitalWrite(6, LOW); delay(1000); digitalWrite(6, HIGH); delay(1000); Serial.println(F("OK!")); digitalWrite(6, LOW); delay(500); }
O programa não tem muito segredo: ele inicializa o shield, chama a função sms.SendSMS() que envia a mensagem, e depois desliga o shield.
Acionando portas do Arduino por SMS
Esse programa utiliza a mesma rotina para ligar o shield, mas não tem uma função de desligar. O loop fica executando uma rotina que verifica se algum SMS foi recebido. Caso isso aconteça, o número do celular de quem enviou é mostrado no serial monitor, assim como a mensagem de texto recebida.
//Progama: Aciona porta por SMS com o GSM Shield SIM900 //Autor: Arduino e Cia #include "SIM900.h" #include <SoftwareSerial.h> //Carrega a biblioteca SMS #include "sms.h" SMSGSM sms; boolean started = false; char smsbuffer[160]; char n[20]; boolean estado = LOW; String msg_esperada("Liga 13"); void setup() { //Inicializa a serial Serial.begin(9600); //Define a porta 13 como saida pinMode(13, OUTPUT); Serial.print("Ligando shield GSM SIM900. "); liga_desliga_GSMShield(); Serial.println("Testando GSM shield..."); //Comunicacao com o Shield GSM a 2400 bauds if (gsm.begin(2400)) { Serial.println("nstatus=READY"); started = true; } else Serial.println("nstatus=IDLE"); } void loop() { if (started) { //Aguarda SMS Serial.println("Aguardando SMS..."); if (gsm.readSMS(smsbuffer, 160, n, 20)) { String msg_recebida(smsbuffer); msg_recebida.trim(); msg_esperada.trim(); if (msg_recebida == msg_esperada) { estado = !estado; Serial.println("SMS Recebido! Alterando estado da porta 13...."); digitalWrite(13, estado); delay(50000); } delay(5000); } } } void liga_desliga_GSMShield() { Serial.print(F("Aguarde...")); pinMode(6, OUTPUT); digitalWrite(6, LOW); delay(1000); digitalWrite(6, HIGH); delay(1000); Serial.println(F("OK!")); digitalWrite(6, LOW); delay(500); }
Caso seja recebido o texto “Liga 13” (sem as aspas), o estado do led ligado à porta 13 será alterado (ligado/desligado). Uma mensagem também é enviada para o serial monitor.
Você pode mudar esse texto de ativação da porta na linha 16 do programa e colocar a string de sua preferência.
Se você precisa acessar a internet e gravar informações do Arduino em uma página web usando esse GSM Shield, não perca o post Como acessar a internet com o Arduino GSM Shield SIM900. Até lá!
Muito bom esse tópico.
Nem sabia da existência desse shield.
Olá sou novo no Arduíno e gostaria de saber se tem como pegar o registro de uma chamada recebida como o IMEI do aparelho, e onde eu posso encontrar explicando mais sobre esta ação.
Bom dia,
Não sei se isso é possível, vc está querendo pegar o IMEI de quem liga pra você, correto ? Até onde eu sei, essa informação não é fornecida junto com a chamada.
Abraço!
Parabéns ótimo tópico
Obrigado Luan. Abraço!
Amigo, qual fonte vc utilizou? Pergunto porque “falam” que este shield consome mais de 2A, é verdade? Utilizo 12V e 2A, mas tem hora que fica caindo.
Bom dia Daniel,
Realmente isso acontece, a fonte tem que ser forte, senão o shield desliga sozinho.
Eu estou usando uma fonte de 9V e 2A, e não tive problemas de quedas.
Abraço!
Olha eu novamente te amolando…kkkk
Estou usando 14 Sensores ACS712, 16 relés, e GSM shield…
Porém, "funciona" somente alguns relés e somente alguns ACS corretamente…fazendo o uso separadamente, eles estão ok, ou seja, será que o meu problema é na fonte também que não está aguentando junto ao GSM?
Boa noite!
Vc está alimentando tudo isso usando o Arduino ? 🙂
Realmente pode ser questão de fonte sim, mas os relés e sensores estão sendo acionados ao mesmo tempo? tipo, vários ao mesmo tempo ?
Se for assim, eu começaria a alimentar pelo menos os relés com uma fonte externa.
Abraço!
Fonte externa no caso seria: Fonte no protoboard?
Esqueci de falar também, tenho ainda 2 sensores de distancia, 3 IR send e 4 DHTs…kkkkk
Pode ser uma fonte dessas de protoboard sim. E pela quantidade de itens, você realmente precisa de fonte(s) externa(s). 🙂
Abraço!
Boa tarde, estou tendo dificuldades com uma shield dessas se poder me ajudar agradeceria.
Testei todos os seu códigos mudando o numero, o numero mais codigo de area, o numero mais codigo de are e do país todos o de ligação aparece discando e depois desligar mas não realiza a chamada e o de enviar mensagem aparece como mensagem enviada mas ela não chega.
Testei os exemplos que vem na biblioteca mas todos fica no seguinte erro: DB:NO RESP
O que vc fez de diferente dos exemplo da biblioteca? vc teria um codigo para o shield responder comandos AT? o da biblioteca fica no erro sitado acima
Oi Lucas,
Que tipo de fonte você está usando para alimentar o circuito ?
Abraço!
Você tem começar da seguinte forma: +55119xxxxx (exemplo de um número de SP). O "+55" é fundamental
Boa noite, alguém poderia me dizer como faço para enviar mensagens e fazer ligações? É que estou utilizando essa biblioteca e quando utilizo os comando para ligar e manda mensagens não acontece nada! a unica coisa que funciona é os comandos at!
Tem alguma forma de reiniciar o "shield" por software?
Estou com um shield deste em um Sítio *(1 relé e 1 ACS), mas infelizmente tem hora que "não tem sinal" da operadora, e é necessário "desligar/ligar" a tomada…sendo assim, fazendo por software já deixo programado a "tal" hora reiniciar o shield.
Boa tarde,
Tem sim. Utilize a porta digital 5, da mesma forma que usamos a 6 para ligar o shield (rotina liga_desliga_GSMShield())
Abraço!
Amigo, tem algum e-mail do qual possa entrar em contato? Posso lhe enviar dois ACS712 30A e dois relés(gratuitamente), caso possa me ajudar no meu problema? Já usei vários códigos, mesmo ascendendo a lâmpada, o valor mostrado é o mesmo.
Boa tarde,
Utilize o formulário de contato no lado direito da página. Conversamos por email.
Abraço!
Bom Dia
Estou usando o programa para acionamento de portas e o meu esta dando o seguinte erro
ERROR: SIM900 doesn't answer. Check power and serial pins in GSM.cpp
o que pode ser será que pode me ajudar
Bom dia Marcos,
O shield está desligando sozinho ? Pode ser que a fonte não esteja fornecendo corrente suficiente.
Abraço!
Também estava com este problema no Mega 2560, atualizei a biblioteca e voltou ao normal.
Olá, estou tentando utilizar o modulo sim800l, com um chip da vivo e ao fazer o GsmScanNetworks Aparece Not connected, voce poderia me ajudar?
Bom dia Tainara,
Posso tentar. 🙂 Não tenho esse modelo de módulo aqui comigo. Vc pode me mandar um link dele ?
Abraço!
alguma novidade com o si800? estou fazendo um projeto com ele também.
estarei utilizando um modelo si800, muda algo ? esse modelo pelo que pesquise seria um sucessor do si900, correto?
link do sim 800
http://www.projetoarduino.com.br/sim800
Eu fazendo uma leitura qualquer com o Arduíno através de um sensor e gostaria de enviar para um celular tanto automático através de um valor estabelecido como quando solicitado pelo celular , essa programação acima serve como base ?
Boa tarde,
Serve sim, pegue o valor da variável, incorpore na mensagem e envie por SMS.
Abraço!
Olá gostaria de saber se tem como vc fazer um post falando como mandar o status de um sensor por SMS usando o GSM Shield com Arduino Mega.
O site de vcs está de parabens!!
Boa tarde,
Boa sugestão. Vamos providenciar. 🙂
Abraço e obrigado!
Será possível criar uma base de números de celulares no Arduino e através de um sensor o Arduino detetar um desses números celulares a uma pequena distância (máximo 5 metros)e enviar uma mensagem para esse celular?
gostaria de saber como inserir na mensagem por exemplo tenho um sensor (uma variavel) que uso para calculo dentro da programacao gostaria de enviar a variavel sensor e o resultado do calculo como faco ?
//Tensao da rede eletrica
int rede = 220.0;
//Pino do sensor SCT
int pino_sct = 1;
float potencia_acumulada = 0; // Variavel para calculo de consumo
//Cria variaveis globais
double kwhTotal;
double vlreais;
unsigned long ltmillis, tmillis, timems, previousMillis;
//Calculate todays number of kwh consumed.
//kwhTotal = kwhTotal + ((realPower/100.0) * 1.0/3600.0 * (timems/100.0));
//Calculate todays number of kwh consumed.
kwhTotal = kwhTotal + (((Irms*220.0)/1000.0) * 1.0/3600.0 * (timems/1000.0));
//Mostra o valor da corrente
Serial.print("I: ");
Serial.print(Irms); // Irms
lcd.setCursor(2,0);
lcd.print(Irms);
//Mostra o valor da tensao
Serial.print("R$: ");
Serial.print(kwhTotal * 0.35); // Custo
lcd.setCursor(12,1);
lcd.print(kwhTotal * 0.35);
//Mostra o valor da potencia
Serial.print("P: ");
Serial.print(Irms*rede); // potencia
lcd.setCursor(2,1);
lcd.print(Irms*rede);
//Calcula e mostra o valor da potencia
Serial.print(" KWh : ");
Serial.println(kwhTotal + (((Irms*rede)/1000.0) * 1.0/3600.0 * (timems/1000.0)));
lcd.setCursor(12,0);
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(kwhTotal + (((Irms*rede)/1000.0) * 1.0/3600.0 * (timems/1000.0)));
uma parte da programacao
Boa tarde, não consigo enviar sms ele só aparece DB:NO RESP e ATT: OK
RIC: ”� %M €ü% ÿ
ATT: OK
RIC: %Cÿ
ATT: OK
RIC: Ãü% ÿ
ATT: OK
RIC: % ÿ
Boa tarde,
Isso está com cara de baud rate errado.. Tente alterar o valor na linha 17 para 9600, por exemplo.
Abraço!
Boa noite sera que alguém consegue me ajudar? Eu comprei uma Shild no Aliexpress, porém meu modelo não veio com os pinos D0, D1, D2, D3 escrita conforme exemplo e não consigo ligar de jeito nenhum? Alguém sabe a maneira de ligar este outro modelo de placa?
Boa tarde,
Você pode me enviar o link da placa ?
Abraço!
boa tarde comprei um shield gsm no aliexpress o meu não tem os pinos pra encaixar no arduino quais os pinos terei que usar para se integrar ao arduino
Boa tarde,
conseguiu resolver? Estou com o mesmo problema.
Parabéns pelas boas explicações. Minha duvida é a seguinte: Tem como usar varias entradas do arduino pra enviar varias informações para o celular? meu maior problema é criar o código.
Olá pessoal,
Pq que quando tem acento na mensagem ele corta a mensagem e so manda até a ultima letra sem acento?
Boa noite,
Pois é.. com acentos o programa "se perde".. pode interpretar o acento como um caracter de controle, fim de linha, etc.
Abraço!
Comprei um CHIP (SIM CARD) comum na TIM, desbloqueei, coloquei créditos, mas aparentemente não está funcionando… O LED Status fica aceso, o LED Netlight fica piscando por uns 10 segundos e depois os dois LEDs se apagam… Você pode me dizer o que pode estar havendo? Será que eu preciso comprar um SIM CARD M2M? Teria algo a ver com isso? Desde já agradeço!
Oi George,
Pelo que você está relatando, o shield está desligando por falta de "força".. tente usar uma fonte com amperagem maior.
Abraço!
Boa noite estou tentando enviar um SMS, mais o SMS não chega, mesmo mostrando que a mensagem foi enviada. o que pode ser?
estou usando uma fonte de 12V, 2A chip da claro.
Já tentei com +55 e o numero e +5511 mais o numero e também só o numero mais ate agora nada. desde já obrigado e parabéns pelo post.
resultado do monitor serial:
ATT: OK
RIC:
OK
ATT: OK
RIC:
OK
ATT: OK
RIC:
OK
ATT: +CPMS:
RIC:
+CPMS: 0,20,0,20,0,20
OK
ATT: OK
RIC:
OK
ATT: SHUT OK
RIC:
SHUT OK
nstatus=READY
DEBUG:SMS TEST
ATT: >
RIC:
>
DEBUG:>
ATT: +CMGS
RIC:
ERROR
nSMS enviado!
Desligando shield GSM SIM900. Aguarde…OK!
Boa noite, estou comum problema as mensagens enviadas não chegam no celular, mesmo com a confirmação do monitor serial que o SMS foi enviado com sucesso.
estou com uma fonte de 12V, 2A e chip da claro 1800Mhz.
Arduino Uno R3 ATMEGA 328
O que pode esta acontecendo? desde já agradeço, parabéns pelo POST.
Resultado do Monitor serial:
ATT: OK
RIC:
OK
ATT: OK
RIC:
OK
ATT: OK
RIC:
OK
ATT: +CPMS:
RIC:
+CPMS: 0,20,0,20,0,20
OK
ATT: OK
RIC:
OK
ATT: SHUT OK
RIC:
SHUT OK
nstatus=READY
DEBUG:SMS TEST
ATT: >
RIC:
>
DEBUG:>
ATT: +CMGS
RIC:
ERROR
nSMS enviado!
Desligando shield GSM SIM900. Aguarde…OK!
Boa noite,
Ja tentou colocar o número com o DDD ?
Abraço!
Sim já tentei com o DDD, sem o DDD também com +55 antes do DDD e não deu certo.
Realizei os testes com esse shield e codigo, tudo funcionou perfeitamente. o número telefonico inclui o sinal de + o codigo do país e DDD exemplo +5511987654321. ponto importante, tive que considerar a ligação do RX no pino 2 e TX pino 3, diferente da ligação do tutoria. dessa maneira funcionou perfeitamente.
Boa tarde, como vc ligou os pinos? Eu tenho um shield daqueles azuis. Ai as ligações são um pouco diferentes.
Olá amigo, seria possível configurar várias portas para serem acionadas por sms; por exemplo: Liga lampada da garagem, liga lampada da frente e assim por diante.
Eu gostaria de acender várias lampadas de onde estivesse. É possível?
Oi Julio,
Pode sim, sem problemas. Você pode atribuir um "código" para cada porta, por ex: ao receber o SMS "G1" ele acende a luz da garagem, "P1" a porta, e assim por diante..
Abraço!
Boa tarde,
tenho duas duvidas, primeira como coloco o numero para a discagem, sou de Minas gerais. Tem diferença se os chips forem de DDS diferentes?
Segunda pergunta, tem como disponibilizar o esquemático para o Arduino UNO?
Desde já obrigada.
Oi Stella,
Eu já fiz ligações por exemplo apenas utilizando o DDD, outras pessoas relataram que precisa colocar o "55" na frente também.
No Uno, basta encaixar o shield GSM em cima da placa Arduino. Não tem erro. 🙂
Abraço!
Adilson
O módulo GSM SIM900 aceita chip de qualquer operadora?
Oi Bruna,
Teoricamente sim. Usei com chips da Oi, Vivo e Tim, sem problemas.
Abraço!
Adilson
Alguém já fez algum tipo de integração com asterisk ? Usar como interface gsm
Boa tarde gostaria de uma ajuda gostaria de usar esse código para fazer o controle de um portão de garagem e caso o portão tenha sido esquecido aberto mande um SMS informando esse estado alguém pode ajudar?
Bom dia, alguém conseguiu com o sim800L?
1 – As portas Analógicas do Arduino UNO ficam livres para serem usadas após conectar este Shield?
2 – Tenho um projeto que mede a corrente elétrica de um aparelho e envia o resultado a cada 5 minutos, é possível alimentar alguma planilha online com esse Shield? Existe alguma forma de organizar esses dados que não seja recebendo SMS no meu celular a cada 5 minutos?
Grato!
Pessoal, estou precisando muito conseguir fazer com um SIM800L, pois já tenho um e preciso reduzir cutos, alguém já tentou?? Outra coisa como é o esquema de ligação??
Oi Daniel,
Tenho 2 posts aqui no blog usando o Sim800L, dá uma olhadinha, por favor.
Abraço!
Adilson
Bom dia! Depois da ligação completada é possível a pessoa que recebeu a ligação acionar alguma porta do arduíno pelo telefone celular ?! Tipo, #2 pra acionar a porta 2 do arduino do próprio aparelho celular?!
É possível sim. 😉
Abraço!
Adilson
ola, é possível realizar chamadas sem mostrar meu numero no destinatário?
Boa tarde, estou enfrentando dificuldades em encontrar a biblioteca sim900.h, nao encontro para fazer o dowload!
Bom dia,
O link para a biblioteca está no post, dê uma olhada, por favor.
Abraço!
Adilson
Olá Adilson e equipe,
Primeiramente, obrigado pelo excelente tutorial.
O que deveria ser adicionado ao sketch para usá-lo com um Display TFT como aqui, por exemplo: https://learn.adafruit.com/arduin-o-phone-arduino-powered-diy-cellphone/overview
Aí sim, ficaria muito legal! Obrigado
Oi Daniel!
Muito obrigado. Interessante esse projeto. Eu postei recentemente um artigo sobre uso de display TFT 3.5 com Arduino, deve te ajudar.
Abraço!
Adilson