14 setembro 2015

Acione portas do Arduino por SMS e realize chamadas telefônicas com o GSM Shield SIM900

Faça chamadas, envie e receba SMS e até conecte o seu Arduino à internet com o 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:
GSM GPRS Shield SIM900 EFCom
O Arduino GSM 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.

GSM Shield SIM900 - Conexões

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:

GSM Shield jumper serial

A utilização dos pinos 2 e 3 é mais prática pois assim você pode monitorar a situação do shield 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:

Slot Cartão SIM

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

GSM.cpp Arduino Mega


Retire também os jumpers de configuração da serial, e faça a ligação ao Arduino Mega seguindo o esquema abaixo:

Jumper Serial Arduino Mega

A conexão do GSM Shield no Arduino Mega ficará assim:

GSM Shield e Arduino Mega


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.

 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
//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:

Serial Monitor - Chamada

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

 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
//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.

 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
//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.

Acionando portas do Arduino com GSM Shield

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á!

40 comentários:

  1. Muito bom esse tópico.
    Nem sabia da existência desse shield.

    ResponderExcluir
  2. 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.

    ResponderExcluir
    Respostas
    1. 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!

      Excluir
  3. 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.

    ResponderExcluir
    Respostas
    1. 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!

      Excluir
  4. 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?

    ResponderExcluir
    Respostas
    1. 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!

      Excluir
    2. 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

      Excluir
    3. Pode ser uma fonte dessas de protoboard sim. E pela quantidade de itens, você realmente precisa de fonte(s) externa(s). :)

      Abraço!

      Excluir
  5. 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

    ResponderExcluir
    Respostas
    1. Oi Lucas,

      Que tipo de fonte você está usando para alimentar o circuito ?

      Abraço!

      Excluir
  6. 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!

    ResponderExcluir
  7. 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.

    ResponderExcluir
    Respostas
    1. 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!

      Excluir
  8. 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.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Utilize o formulário de contato no lado direito da página. Conversamos por email.

      Abraço!

      Excluir
  9. 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

    ResponderExcluir
    Respostas
    1. Bom dia Marcos,

      O shield está desligando sozinho ? Pode ser que a fonte não esteja fornecendo corrente suficiente.

      Abraço!

      Excluir
  10. Também estava com este problema no Mega 2560, atualizei a biblioteca e voltou ao normal.

    ResponderExcluir
  11. Olá, estou tentando utilizar o modulo sim800l, com um chip da vivo e ao fazer o GsmScanNetworks Aparece Not connected, voce poderia me ajudar?

    ResponderExcluir
    Respostas
    1. Bom dia Tainara,

      Posso tentar. :) Não tenho esse modelo de módulo aqui comigo. Vc pode me mandar um link dele ?

      Abraço!

      Excluir
    2. alguma novidade com o si800? estou fazendo um projeto com ele também.

      Excluir
    3. estarei utilizando um modelo si800, muda algo ? esse modelo pelo que pesquise seria um sucessor do si900, correto?

      Excluir
    4. link do sim 800
      http://www.projetoarduino.com.br/sim800

      Excluir
  12. 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 ?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Serve sim, pegue o valor da variável, incorpore na mensagem e envie por SMS.

      Abraço!

      Excluir
  13. 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!!

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Boa sugestão. Vamos providenciar. :)

      Abraço e obrigado!

      Excluir
  14. 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?

    ResponderExcluir
  15. 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

    ResponderExcluir
  16. 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: % ÿ

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Isso está com cara de baud rate errado.. Tente alterar o valor na linha 17 para 9600, por exemplo.

      Abraço!

      Excluir
  17. 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?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Você pode me enviar o link da placa ?

      Abraço!

      Excluir
  18. 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

    ResponderExcluir
  19. 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.

    ResponderExcluir
  20. Olá pessoal,
    Pq que quando tem acento na mensagem ele corta a mensagem e so manda até a ultima letra sem acento?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Pois é.. com acentos o programa "se perde".. pode interpretar o acento como um caracter de controle, fim de linha, etc.

      Abraço!

      Excluir