Arduino GPRS - SIM900, projeto aplicado lendo SMS
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 so 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ê a primeira SMS, e salva os dados, se na próxima leitura a SMS for a mesma que a anterior ele apaga. Para executar uma ação basta estipular, se ele ler uma ação previamente programada, o uC faz X ação, como no exemplo, acende os LEDs.
Lembrando que sua ação vem dentro de @ Ação <
Isso é feito para criar uma proteção as SMS recebidas(tirando espúrios), é praticamente uma senha. O Inicializador(@) e finalizador(<) da mensagem pode ser mudado, como exemplo <texto> Ação </texto>, ou qualquer outra maneira que você achar legal.
- #include <SoftwareSerial.h>
- SoftwareSerial mySerial(2, 3);
- String linhaAtual = "";
- String sms = "";
- String smsAnterior = "";
- boolean lendoSMS = false;
- int led = 4;
- void setup()
- {
- mySerial.begin(19200);
- Serial.begin(19200);
- pinMode(led, OUTPUT);
- ligandoModulo();
- Serial.println("Configurando SMS modo texto");
- mySerial.println("AT+CMGF=1");
- mostraDadosSerial();
- }
- void loop()
- {
- //Serial.println("Fazendo leitura do 1 SMS");
- mySerial.println("AT+CMGR=1");
- mostraDadosSerial();
- delay(1000);
- while (mySerial.available()>0)
- {
- char inChar = mySerial.read();
- linhaAtual += inChar;
- if (inChar == '\n')
- {
- linhaAtual = "";
- }
- if (linhaAtual.endsWith("@"))
- {
- lendoSMS = true;
- sms = "";
- }
- if (lendoSMS)
- {
- if (inChar != '<')
- {
- sms += inChar;
- }
- else
- {
- lendoSMS = false;
- Serial.println(sms);
- if(sms=="@Liga LED" && smsAnterior!=sms)
- {
- Serial.println("Ligando LED");
- digitalWrite(led, HIGH);
- }
- if(sms=="@Desliga LED" && smsAnterior!=sms)
- {
- Serial.println("Desligando LED");
- digitalWrite(led, LOW);
- }
- if(sms == smsAnterior)
- {
- mySerial.println("AT+CMGD=1,4");
- sms="";
- }
- smsAnterior=sms;
- }
- }
- }
- mySerial.println("");
- }
- void ligandoModulo()
- {
- Serial.println("Ligando/Reiniciando Modulo GSM...");
- if(digitalRead(6)==LOW)
- {
- digitalWrite(6,LOW);
- delay(300);
- digitalWrite(6,HIGH);
- delay(15000);
- }
- Serial.println("Modulo Ligado!");
- }
- void mostraDadosSerial()
- {
- while(mySerial.available()!=0)
- {
- Serial.write(mySerial.read());
- }
- }
Ligando/Reiniciando Modulo GSM...
Modulo Ligado!
Configurando SMS modo texto
ÿÿÿÿÿÿÿÿ
RDY
+CFUN: 1
+CPIN: READY
+PACSP: 1
@Liga LED
Ligando LED
@Desliga LED
Desligando LED
Vídeo de exemplo do funcionamento do programa:
É isso ai pessoal, se você gostou compartilhe com seus amigos, ou pode fazer uma pequena doação para continuar mantendo o ritmo e sempre atender o pedido do pessoal e desenvolver os programas.