GPRS - SIM900, Ler SMS Executar Ação

terça-feira, 23 de setembro de 2014

GPRS - SIM900


Agora alem de fazer a leitura do
SMS, vamos executar um comando!

Primeiramente gostaria de agradecer a todos que vem visitando o blog. Isso começou como um passa tempo para catalogar meus projetos e publicar alguns pensamentos. Varias pessoas curtiram os posts sobre o SIM900, realmente essa placa é show de bola. E muitos pediram para aperfeiçoar a parte de fazer a leitura de um SMS e executar um comando previamente cadastrado.

Para fazer a leitura da SMS podemos fazer de dois modos, usar a biblioteca TextFinder, ou criar nosso parâmetros de busca no texto. Eu prefiro a segunda opção para não ficar atrelado a varias bibliotecas, alem do mais o programa fica mais enxuto e com firmware otimizado.

Antes de passar o código e explicar como funciona, temos que fazer uma modificação profunda no IDE do Arduino, do contrário NÃO VAI FUNCIONAR!

Enquanto eu criava esse programa, eu enfrentei alguns problemas na hora de transmitir muitos dados de uma só vez. Quando controlamos o SIM900 usamos a porta serial, e em certo momento enviamos um pico de sinal. O Arduino possui um core de código para buffer bem legal, onde você pode manter informações e ler posteriormente. No entanto é por default apenas 64 bytes. Essa valor é hard coded no core do Arduino, e é aplicado a todas placas, até mesmo as que possuem mais memoria RAM.

O limite de 64 bytes significa que um envio de dados maior que isso vai causar perda nas informações.
A solução é simples, alterar esse valor para permitir maior volume de dados e não perder as informações.
O que temos que fazer?


  • Entrar na pasta onde se encontra o IDE do Arduino - C:\Users\Vinicius\Downloads\arduino-1.0.5-windows\arduino-1.0.5\libraries\SoftwareSerial
  • Faça uma copia desse diretorio.
  • Abra o arquivo SoftwareSerial.h com seu editor preferido.
  • Encontre a linha: #define _SS_MAX_RX_BUFF 64
  • Substitua por : #define _SS_MAX_RX_BUFF 256 
  • Salve o arquivo e abre o IDE do Arduino.
Feito! Agora vai funcionar.
O programa a seguir faz o seguinte, lê o primeiro SMS, e executa uma função, no caso do nosso programa ele vai receber um SMS e ligar um LED que esta ligado o pino 13 do Arduino

Você em via uma mensagem: 
#Al para ligar 
#Ad para desligar


  1. #include <SoftwareSerial.h>
  2. const int led = 13;
  3. char number[] = "+5515999999999"; //EDITAR O NUMERO Do TELE QUE IRA RECEBER O SMS
  4. SoftwareSerial cell(2, 3);// RX, TX

  5. void setup() {
  6.   cell.begin(9600);
  7.   SIM900_config();
  8. }
  9. void loop()
  10. {
  11.   if (cell.available() > 0) {
  12.     char Read = cell.read();
  13.     if (Read == '#') {
  14.       delay(10);
  15.       Read = cell.read();
  16.       //Olhe para ver se o characheter é um "A"
  17.       if (Read == 'A') {

  18.         delay(10);
  19.         Read = cell.read();

  20.         if (Read == 'l') //liga o led
  21.         {
  22.           digitalWrite(led, HIGH);

  23.           //A qui e a parte que ele emvia um sms avisando que o LED foi L1GADO
  24.           cell.print("AT+CMGS=\"");
  25.           cell.print(number);
  26.           cell.print("\"\r");
  27.           delay(1000);
  28.           cell.println("LED L1GADO");
  29.           cell.write(char(26));  //em substituição a Serial2.print(0x1a, BYTE);
  30.           cell.println("AT+CMGD=1,4");

  31.         }
  32.         if (Read == 'd') //desliga o led
  33.         {

  34.           digitalWrite(led, LOW);

  35.           //A qui e a parte que ele emvia um sms avisando que o LED foi DESL1GADO
  36.           cell.print("AT+CMGS=\"");
  37.           cell.print(number);
  38.           cell.print("\"\r");
  39.           delay(1000);
  40.           cell.println("LED DESL1GADO");
  41.           cell.write(char(26));  //em substituição a Serial2.print(0x1a, BYTE);
  42.           cell.println("AT+CMGD=1,4");

  43.         }
  44.       }
  45.     }
  46.   }
  47. }
  48. //Abaixo e a parte que configura o SIM900
  49. void SIM900_config()
  50. { cell.println("AT");
  51.   delay(400);
  52.   cell.print("AT+CMGF=1\r");
  53.   delay(400);
  54.   cell.print("AT+CSCS=\"GSM\"\r");
  55.   delay(400);
  56.   cell.print("AT+CNMI=2,2,0,0\r");
  57.   delay(400);
  58.   cell.println("AT+CMGF=1\r");
  59.   //cell.println("AD+CHFA=1");


  60.   delay(1000);
  61. }

1 comentários:

Reginaldo disse...
Este comentário foi removido pelo autor.

Postar um comentário