Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
+4
decionovaes
santiago54321
janiocavalcanti
evertondt
8 participantes
Página 1 de 1
Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Pessoal estou estudando como receber uma mensagem com o sim900 ou sim908 e a a partir dela acionar um dispositivo. Vamos criar uma solução legal para todos?
Alguem tem uma idéia ou uma sujestão??
Comando e resposta de leitura de uma mensagem no chip:
AT+CMGR=1 // comando de leitura de mensagem tipo AT e a resposta abaixo
+CMGR: "REC READ","01991000000","","12/05/15,22:59:12-12"
dispositivo1, ligar
OK
---
A idéia é pegar o texto, separar as partes, ver se o numéro é o cadastrado, e ligar ou desligar o dispositivo descrito
Um codigo que estou tentando:
Ele apenas lê uma parte para ide 1.0 ou 1.0.1
#include
SoftwareSerial mySerial(2, 3);
#define BUF_LEN 84 //64
int powerkey = 5;
int statuspin = 6;
int pinState = 0;
void setup() {
pinMode(powerkey, OUTPUT);
pinMode(statuspin, INPUT);
mySerial.begin(9600); // the GPRS baud rate
Serial.begin(9600); // the GPRS baud rate
}
byte num_of_bytes;
byte retorno;
char comm_buf[BUF_LEN];
byte n;
void loop()
{
pinState = digitalRead(statuspin);
if(pinState==LOW)
{
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
Serial.println("comando 1 -----------------------------");//executa comando
mySerial.println("AT+CMGR=1");//executa comando
delay(10000); //pausa milesegundo para espera resultado na serial
leserial(); // chama função processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
/*
for(n=0; n {
Serial.println(comm_buf[n]);
parametro = strtok (comm_buf, ","); // defina como texto até o primeiro virgula
Serial.println("parametro");
Serial.println(parametro);
}
*/
splitString(comm_buf); // chama a função splitString e envia dados do buffer
// Serial.println("retorno:");//executa comando
// Serial.println(retorno);//executa comando
Serial.println(comm_buf); //mostra retorno real
limpa_buffer(); //limpa buffer
}
/**********************************************************
Metodo splitstring
**********************************************************/
void splitString(char* data) {
Serial.print("Data entered splitString: ");
Serial.println(data);
Serial.print("FIM Data entered splitString: ");
char* parameter;
parameter = strtok (data,",");
while (parameter != NULL) {
//PROXIMO_METODO_COMA_AÇÃO(parameter);
Serial.println("parameter separado as partes");
Serial.println(parameter);
parameter = strtok (NULL,",");
}
}
/**********************************************************
Metodo para leitura da softserial
buffer maximo de (num_of_bytes) caracteres
**********************************************************/
void leserial()
{
num_of_bytes = mySerial.available(); //Pega quantidade de bytes ques estao na serial
Serial.println("quantidade de bytes ques estao na serial");//executa comando
Serial.println(num_of_bytes);//executa comando
while (mySerial.available() > 0) //Espera de até Available ser true
{
for(n=0; n {
comm_buf[n] = mySerial.read(); //armazena buffer e a cada mySerial.read carry on buffer interno
http://Serial.println("e n = :");//
// Serial.println(n);//
http://Serial.println("comm_buf[n] COM VALOR:");//
// Serial.println(comm_buf[n]);//
}
}
mySerial.flush(); //limpa buffer de entrada da serial
}
/**********************************************************
Metodo para limpeza do buffer
**********************************************************/
void limpa_buffer()// limpa o buffer
{
memset(comm_buf,'\0',BUF_LEN); // menseter c: ( , , )
}
/**********************************************************
Método que checa bytes recebidos
compare_string - ponteiro para a string que deve ser encontrar
retorno: 0 - string não foi reconehceda
1 - string foi reconehceda
**********************************************************/
byte IsStringReceived(char const *compare_string)
{
http://Serial.println("testando...");
char *ch;
byte ret_val = 0;
if(1) {
ch = strstr((char *)comm_buf, compare_string);
if (ch != NULL)
{
http://Serial.println("existe Valor");
ret_val = 1;
}
else
{
}
}
return (ret_val);
}
------------
resultado na com conseguido até o momento somente para teste e ver o que está ocorrendo:
+CMGR: "REC READ"
comando 1 -----------------------------
quantidade de bytes ques estao na serial
63
AT+CMGR=1
+CMGR: "REC READ","0199100000","","12/05/15,22:59
Data entered splitString: AT+CMGR=1
+CMGR: "REC READ","0199100000","","12/05/15,22:59
FIM Data entered splitString: parameter separado as partes
AT+CMGR=1
+CMGR: "REC READ"
parameter separado as partes
"0199100000"
parameter separado as partes
""
parameter separado as partes
"12/05/15
parameter separado as partes
22:59
AT+CMGR=1
Conto com a contribuição, Obrigado
Alguem tem uma idéia ou uma sujestão??
Comando e resposta de leitura de uma mensagem no chip:
AT+CMGR=1 // comando de leitura de mensagem tipo AT e a resposta abaixo
+CMGR: "REC READ","01991000000","","12/05/15,22:59:12-12"
dispositivo1, ligar
OK
---
A idéia é pegar o texto, separar as partes, ver se o numéro é o cadastrado, e ligar ou desligar o dispositivo descrito
Um codigo que estou tentando:
Ele apenas lê uma parte para ide 1.0 ou 1.0.1
#include
SoftwareSerial mySerial(2, 3);
#define BUF_LEN 84 //64
int powerkey = 5;
int statuspin = 6;
int pinState = 0;
void setup() {
pinMode(powerkey, OUTPUT);
pinMode(statuspin, INPUT);
mySerial.begin(9600); // the GPRS baud rate
Serial.begin(9600); // the GPRS baud rate
}
byte num_of_bytes;
byte retorno;
char comm_buf[BUF_LEN];
byte n;
void loop()
{
pinState = digitalRead(statuspin);
if(pinState==LOW)
{
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
Serial.println("comando 1 -----------------------------");//executa comando
mySerial.println("AT+CMGR=1");//executa comando
delay(10000); //pausa milesegundo para espera resultado na serial
leserial(); // chama função processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
/*
for(n=0; n
Serial.println(comm_buf[n]);
parametro = strtok (comm_buf, ","); // defina como texto até o primeiro virgula
Serial.println("parametro");
Serial.println(parametro);
}
*/
splitString(comm_buf); // chama a função splitString e envia dados do buffer
// Serial.println("retorno:");//executa comando
// Serial.println(retorno);//executa comando
Serial.println(comm_buf); //mostra retorno real
limpa_buffer(); //limpa buffer
}
/**********************************************************
Metodo splitstring
**********************************************************/
void splitString(char* data) {
Serial.print("Data entered splitString: ");
Serial.println(data);
Serial.print("FIM Data entered splitString: ");
char* parameter;
parameter = strtok (data,",");
while (parameter != NULL) {
//PROXIMO_METODO_COMA_AÇÃO(parameter);
Serial.println("parameter separado as partes");
Serial.println(parameter);
parameter = strtok (NULL,",");
}
}
/**********************************************************
Metodo para leitura da softserial
buffer maximo de (num_of_bytes) caracteres
**********************************************************/
void leserial()
{
num_of_bytes = mySerial.available(); //Pega quantidade de bytes ques estao na serial
Serial.println("quantidade de bytes ques estao na serial");//executa comando
Serial.println(num_of_bytes);//executa comando
while (mySerial.available() > 0) //Espera de até Available ser true
{
for(n=0; n
comm_buf[n] = mySerial.read(); //armazena buffer e a cada mySerial.read carry on buffer interno
http://Serial.println("e n = :");//
// Serial.println(n);//
http://Serial.println("comm_buf[n] COM VALOR:");//
// Serial.println(comm_buf[n]);//
}
}
mySerial.flush(); //limpa buffer de entrada da serial
}
/**********************************************************
Metodo para limpeza do buffer
**********************************************************/
void limpa_buffer()// limpa o buffer
{
memset(comm_buf,'\0',BUF_LEN); // menseter c: (
}
/**********************************************************
Método que checa bytes recebidos
compare_string - ponteiro para a string que deve ser encontrar
retorno: 0 - string não foi reconehceda
1 - string foi reconehceda
**********************************************************/
byte IsStringReceived(char const *compare_string)
{
http://Serial.println("testando...");
char *ch;
byte ret_val = 0;
if(1) {
ch = strstr((char *)comm_buf, compare_string);
if (ch != NULL)
{
http://Serial.println("existe Valor");
ret_val = 1;
}
else
{
}
}
return (ret_val);
}
------------
resultado na com conseguido até o momento somente para teste e ver o que está ocorrendo:
+CMGR: "REC READ"
comando 1 -----------------------------
quantidade de bytes ques estao na serial
63
AT+CMGR=1
+CMGR: "REC READ","0199100000","","12/05/15,22:59
Data entered splitString: AT+CMGR=1
+CMGR: "REC READ","0199100000","","12/05/15,22:59
FIM Data entered splitString: parameter separado as partes
AT+CMGR=1
+CMGR: "REC READ"
parameter separado as partes
"0199100000"
parameter separado as partes
""
parameter separado as partes
"12/05/15
parameter separado as partes
22:59
AT+CMGR=1
Conto com a contribuição, Obrigado
evertondt- Mensagens : 12
Data de inscrição : 13/05/2012
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Estou com esta mesma idéia.
ainda estou pesquisando sobre como comandar utilizando o shield, e além disso eu quero fazer leitura de um sinal analógico e enviar para o celular.
agradeço se alguem puder ajudar.
ainda estou pesquisando sobre como comandar utilizando o shield, e além disso eu quero fazer leitura de um sinal analógico e enviar para o celular.
agradeço se alguem puder ajudar.
janiocavalcanti- Mensagens : 2
Data de inscrição : 03/04/2012
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Olá pessoal, tmb tenho o mesmo projeto para ser desenvolvido, aguardo a contribuição dos mais experientes !
santiago54321- Mensagens : 9
Data de inscrição : 14/05/2012
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Everton,
Tenta este método, encontrei na net mas nao consegui fazer funcionar ! se conseguir resolver posta ai !
Admin faz a sua mágica ai...
void lesms()
{
Serial.println("AT+CMGR=1"); //Reads the first SMS
Serial.flush();
for (x=0;x < 255;x++){
data[x]='\0';
}
x=0;
do{
while(Serial.available()==0);
data[x]=Serial.read();
x++;
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
}while(!(data[x-1]=='K'&&data[x-2]=='O'));
data[x-3]='\0'; //finish the string before the OK
Serial.println(data); //shows the message
delay(10000);
}
Tenta este método, encontrei na net mas nao consegui fazer funcionar ! se conseguir resolver posta ai !
Admin faz a sua mágica ai...
void lesms()
{
Serial.println("AT+CMGR=1"); //Reads the first SMS
Serial.flush();
for (x=0;x < 255;x++){
data[x]='\0';
}
x=0;
do{
while(Serial.available()==0);
data[x]=Serial.read();
x++;
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
}while(!(data[x-1]=='K'&&data[x-2]=='O'));
data[x-3]='\0'; //finish the string before the OK
Serial.println(data); //shows the message
delay(10000);
}
santiago54321- Mensagens : 9
Data de inscrição : 14/05/2012
Separa apenas o texto da mensagem
santiago54321 o cógigo funciona sim
Legal bom para o pessoal que quer receber uma mensagem e enviar para um display ou outdoor
Teste ai:
Legal bom para o pessoal que quer receber uma mensagem e enviar para um display ou outdoor
Teste ai:
- Código:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
#define BUF_LEN 84 //64
int powerkey = 5;
int statuspin = 6;
int pinState = 0;
int x =0;
const int MAXDATA = 256;
char data [MAXDATA];
void setup() {
pinMode(powerkey, OUTPUT);
pinMode(statuspin, INPUT);
mySerial.begin(9600); // the GPRS baud rate
Serial.begin(9600); // the GPRS baud rate
}
void loop()
{
pinState = digitalRead(statuspin);
if(pinState==LOW)
{
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
Serial.println("comando 1 - ler a primeira mensagem");//executa comando
mySerial.println("AT+CMGR=1"); //Reads the first SMS
mySerial.flush();
for (x=0;x < 255;x++){
data[x]='\0';
}
x=0;
do{
while(mySerial.available()==0);
data[x]=mySerial.read();
x++;
if(data[x-1]==0x0D&&data[x-2]=='"'){ // remove o cabeçalho +CMGR: "REC READ","xxxx","","12/05/21,12:21:43-12"
x=0;
}
}
while(!(data[x-1]=='K'&&data[x-2]=='O')); // enquanto não encontrar o ok não para
data[x-3]='\0'; //finish the string before the OK
Serial.println(data); //shows the message
delay(10000);
}
Última edição por evertondt em Sex 20 Jul - 21:58, editado 1 vez(es)
evertondt- Mensagens : 12
Data de inscrição : 13/05/2012
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Everton,
Funcionou sim, mas o seu código é bem mais interessante pois com ele possivel identificar o numero do remetente, ler a mensagem e tomar um decisão conforme for, conseguiu algum progresso com ele ?
Funcionou sim, mas o seu código é bem mais interessante pois com ele possivel identificar o numero do remetente, ler a mensagem e tomar um decisão conforme for, conseguiu algum progresso com ele ?
santiago54321- Mensagens : 9
Data de inscrição : 14/05/2012
QUASE LÁ !!!
Prezados,
Estamos a um passo, ja estou recebendo sms separando o remetente e separando a mensagem enviada (mensagem enviada tem que 4 digitos Ex:0001)
O problema é que a variavel que guarda o código muda de valor sózinho no meio do programa, a variavel "codcadastrado" muda de "0001" para "52488014013".
Segue o código e o resultado dele:
---------------------VALIDANDO MENSAGEM SMS ---------------------
|
|
NUMERO DO REMETENTE: 552488014013
CODIGO ENVIADO : 0001
|
|
O REMETENTE E' IGUAL AO CADASTRADO
|
O CODIGO ENVIADO DIFERENTE DO CADASTRADO
|
CODIGO CADASTRADO: 52488014013
CODIGO ENVIADO : 0001
|
|
Estamos a um passo, ja estou recebendo sms separando o remetente e separando a mensagem enviada (mensagem enviada tem que 4 digitos Ex:0001)
O problema é que a variavel que guarda o código muda de valor sózinho no meio do programa, a variavel "codcadastrado" muda de "0001" para "52488014013".
Segue o código e o resultado dele:
- Código:
#include <SoftwareSerial.h>
#include <String.h>
SoftwareSerial mySerial(4, 5);
#define BUF_LEN 84
int statuspin = 4;
int pinState = 0;
int x,y,i,j;
char ncadastrado[] = "552488014013";
char nremetente[] = "";
char codcadastrado[] = "0001";
char codremetente[] = "";
const int MAXDATA1 = 256;
const int MAXDATA2= 256;
char msg1[MAXDATA1];
char msg2[MAXDATA2];
const int MAXDATA = 256;
char data [MAXDATA];
void setup()
{
pinMode(statuspin, INPUT);
pinMode(9, OUTPUT);
mySerial.begin(9600); // the GPRS baud rate
Serial.begin(9600); // the GPRS baud rate
}
byte num_of_bytes;
byte retorno;
char comm_buf[256];
byte n;
void loop()
{
if(Serial.available())
{
mySerial.print((unsigned char)Serial.read());
}
else if(mySerial.available())
{
Serial.print((unsigned char)mySerial.read());
}
poweron();
//enviasms();
lesms();
validasms();
if (y==0)
{
//enviasms();
http://mySerial.println("AT+CMGD=1");
y=1;
}
}
void poweron()
{
pinState = digitalRead(statuspin);
if(pinState==LOW)
{
Serial.println("estou ligando...");
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
}
void lesms()
{
Serial.println("|");
Serial.println("|");
Serial.println("|");
Serial.println("|");
Serial.println("-------------------------- LENDO SMS --------------------------");
Serial.println("|");
Serial.println("|");
mySerial.println("AT+CMGR=1"); //Reads the first SMS
mySerial.flush();
for (x=0;x < 255;x++){
data[x]='\0';
}
x=0;
do{
while(mySerial.available()==0);
data[x]=mySerial.read();
x++;
//if(data[x-1]==0x0D&&data[x-2]=='"'){ // remove o cabeçalho +CMGR: "REC READ","xxxx","","12/05/21,12:21:43-12"
//x=0;
//}
if(data[x-1]=='+'&&data[x-2]=='"'){ // remove o cabeçalho +CMGR: "REC READ","xxxx","","12/05/21,12:21:43-12"
x=0;
}
}
//while(!(data[x-1]=='K'&&data[x-2]=='O')); // enquanto não encontrar o ok não para
while(!(data[x-1]=='K'&&data[x-2]=='O')); // enquanto não encontrar o ok não para
data[x-3]='\0'; //finish the string before the OK
Serial.println(data); //shows the message
//splitString(data);
delay(2000);
Serial.println("|");
Serial.println("|");
Serial.println("---------------------------- F I M ----------------------------");
Serial.println("|");
Serial.println("|");
Serial.println("|");
Serial.println("|");
}
void validasms()
{
j=0;
i=0;
Serial.println("---------------------VALIDANDO MENSAGEM SMS ---------------------");//executa comando
/*
Serial.println("|");
Serial.println("|");
Serial.println("POCISAO DE data [ ] DO REMETENTE QUE ENVIOU");
Serial.println("|");
for(i=0; i<12; i++)
{
Serial.print("pocisao: ");
Serial.print(i);
Serial.print(" caracter: ");
Serial.println(data[i]);
}
Serial.println("|");
Serial.println("|");
Serial.println("POCISAO DE data [ ] DO CODIGO ENVIADO");
Serial.println("|");
for(i=41; i<45; i++)
{
Serial.print("pocisao: ");
Serial.print(i);
Serial.print(" caracter: ");
Serial.println(data[i]);
} */
Serial.println("|");
Serial.println("|");
strcpy (msg1, data);
strcpy (msg2, data);
//###########################
for(i=0; i!=12; i++)
{
nremetente[i]=msg1[i];
}
nremetente[12]='\0';
//###########################
j=0;
i=0;
char codremetente[] = " ";
for(i=41; i!=45; i++)
{
codremetente[j]=msg2[i];
j++;
}
codremetente[5]='\0';
///###########################
Serial.print("NUMERO DO REMETENTE: ");
Serial.println(nremetente);
Serial.print("CODIGO ENVIADO : ");
Serial.println(codremetente);
Serial.println("|");
Serial.println("|");
if (!strcmp(nremetente, ncadastrado))
{
Serial.println("O REMETENTE E' IGUAL AO CADASTRADO");
Serial.println("|");
} else {
Serial.println("O REMETENTE NAO IGUAL AO CADASTRADO");
Serial.println("|");
Serial.print("REMETENTE CADASTRADO : ");
Serial.println(ncadastrado);
Serial.print("REMETENTE QUE ENVIOU : ");
Serial.println(nremetente);
Serial.println("|");
Serial.println("|");
}
if (!strcmp(codremetente, codcadastrado))
{
Serial.println("O CODIGO E' IGUAL AO CADASTRADO");
Serial.println("|");
} else {
Serial.println("O CODIGO ENVIADO DIFERENTE DO CADASTRADO");
Serial.println("|");
Serial.print("CODIGO CADASTRADO: ");
Serial.println(codcadastrado);
Serial.print("CODIGO ENVIADO : ");
Serial.println(codremetente);
Serial.println("|");
Serial.println("|");
}
Serial.println("---------------------------- F I M ----------------------------");
delay(60000);
}
void enviasms()
{
mySerial.println("AT+CIFSR");//executa comando
delay(3000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer(); //limpa buffer
mySerial.println("AT+CSQ");//executa comando
delay(3000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+cstt=\"zap.vivo.com.br\",\"vivo\",\"vivo\"");//executa comando
delay(2000); //espera
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+ciicr");//executa comando
delay(5000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+cifsr");//executa comando
delay(2000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+cdnscfg?");//executa comando
delay(2000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("AT+CMGF=1\r"); // Because we want to send the SMS in text mode
delay(1000);
mySerial.println("AT+CMGS=\"88014013\"\r"); // Setting for the SMS Message center number,
delay(1000);
leserial();
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("mensagem de teste"); // Start accepting the text for the message
delay(1000);
mySerial.println((char)26);
leserial();
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
}
/**********************************************************
Metodo splitstring
**********************************************************/
void splitString(char* data) {
Serial.print("Data entered splitString: ");
Serial.println(data);
Serial.print("FIM Data entered splitString: ");
char* parameter;
parameter = strtok (data,",");
while (parameter != NULL) {
//PROXIMO_METODO_COMA_AÇÃO(parameter);
Serial.println("parameter separado as partes");
Serial.println(parameter);
parameter = strtok (NULL,",");
}
}
/**********************************************************
Metodo para leitura da softserial
buffer maximo de (num_of_bytes) caracteres
**********************************************************/
void leserial()
{
num_of_bytes = mySerial.available(); //Pega quantidade de bytes ques estao na serial
while (mySerial.available() > 0) //Espera de até Available ser true
{
for(n=0; n<num_of_bytes; n++)
{
comm_buf[n] = mySerial.read(); //armazena buffer e a cada mySerial.read carry on buffer interno
}
}
mySerial.flush(); //limpa buffer de entrada da serial
}
/**********************************************************
Metodo para limpeza do buffer
**********************************************************/
void limpa_buffer()
{
memset(comm_buf,'\0',BUF_LEN);
}
/**********************************************************
Method checks received bytes
compare_string - pointer to the string which should be find
return: 0 - string was NOT received
1 - string was received
**********************************************************/
byte IsStringReceived(char const *compare_string)
{
http://Serial.println("testando...");
char *ch;
byte ret_val = 0;
if(1) {
ch = strstr((char *)comm_buf, compare_string);
if (ch != NULL)
{
Serial.println("existe Valor");
ret_val = 1;
}
else
{
}
}
return (ret_val);
}
---------------------VALIDANDO MENSAGEM SMS ---------------------
|
|
NUMERO DO REMETENTE: 552488014013
CODIGO ENVIADO : 0001
|
|
O REMETENTE E' IGUAL AO CADASTRADO
|
O CODIGO ENVIADO DIFERENTE DO CADASTRADO
|
CODIGO CADASTRADO: 52488014013
CODIGO ENVIADO : 0001
|
|
- Código:
santiago54321- Mensagens : 9
Data de inscrição : 14/05/2012
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Não consegui executar o código ,ficou um pouco confuso mas vou dar uma estudada nele aqui
santiago54321 escreveu:Prezados,
Estamos a um passo, ja estou recebendo sms separando o remetente e separando a mensagem enviada (mensagem enviada tem que 4 digitos Ex:0001)
O problema é que a variavel que guarda o código muda de valor sózinho no meio do programa, a variavel "codcadastrado" muda de "0001" para "52488014013".
Segue o código e o resultado dele:
- Código:
#include <SoftwareSerial.h>
#include <String.h>
SoftwareSerial mySerial(4, 5);
#define BUF_LEN 84
int statuspin = 4;
int pinState = 0;
int x,y,i,j;
char ncadastrado[] = "552488014013";
char nremetente[] = "";
char codcadastrado[] = "0001";
char codremetente[] = "";
const int MAXDATA1 = 256;
const int MAXDATA2= 256;
char msg1[MAXDATA1];
char msg2[MAXDATA2];
const int MAXDATA = 256;
char data [MAXDATA];
void setup()
{
pinMode(statuspin, INPUT);
pinMode(9, OUTPUT);
mySerial.begin(9600); // the GPRS baud rate
Serial.begin(9600); // the GPRS baud rate
}
byte num_of_bytes;
byte retorno;
char comm_buf[256];
byte n;
void loop()
{
if(Serial.available())
{
mySerial.print((unsigned char)Serial.read());
}
else if(mySerial.available())
{
Serial.print((unsigned char)mySerial.read());
}
poweron();
//enviasms();
lesms();
validasms();
if (y==0)
{
//enviasms();
http://mySerial.println("AT+CMGD=1");
y=1;
}
}
void poweron()
{
pinState = digitalRead(statuspin);
if(pinState==LOW)
{
Serial.println("estou ligando...");
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
}
void lesms()
{
Serial.println("|");
Serial.println("|");
Serial.println("|");
Serial.println("|");
Serial.println("-------------------------- LENDO SMS --------------------------");
Serial.println("|");
Serial.println("|");
mySerial.println("AT+CMGR=1"); //Reads the first SMS
mySerial.flush();
for (x=0;x < 255;x++){
data[x]='\0';
}
x=0;
do{
while(mySerial.available()==0);
data[x]=mySerial.read();
x++;
//if(data[x-1]==0x0D&&data[x-2]=='"'){ // remove o cabeçalho +CMGR: "REC READ","xxxx","","12/05/21,12:21:43-12"
//x=0;
//}
if(data[x-1]=='+'&&data[x-2]=='"'){ // remove o cabeçalho +CMGR: "REC READ","xxxx","","12/05/21,12:21:43-12"
x=0;
}
}
//while(!(data[x-1]=='K'&&data[x-2]=='O')); // enquanto não encontrar o ok não para
while(!(data[x-1]=='K'&&data[x-2]=='O')); // enquanto não encontrar o ok não para
data[x-3]='\0'; //finish the string before the OK
Serial.println(data); //shows the message
//splitString(data);
delay(2000);
Serial.println("|");
Serial.println("|");
Serial.println("---------------------------- F I M ----------------------------");
Serial.println("|");
Serial.println("|");
Serial.println("|");
Serial.println("|");
}
void validasms()
{
j=0;
i=0;
Serial.println("---------------------VALIDANDO MENSAGEM SMS ---------------------");//executa comando
/*
Serial.println("|");
Serial.println("|");
Serial.println("POCISAO DE data [ ] DO REMETENTE QUE ENVIOU");
Serial.println("|");
for(i=0; i<12; i++)
{
Serial.print("pocisao: ");
Serial.print(i);
Serial.print(" caracter: ");
Serial.println(data[i]);
}
Serial.println("|");
Serial.println("|");
Serial.println("POCISAO DE data [ ] DO CODIGO ENVIADO");
Serial.println("|");
for(i=41; i<45; i++)
{
Serial.print("pocisao: ");
Serial.print(i);
Serial.print(" caracter: ");
Serial.println(data[i]);
} */
Serial.println("|");
Serial.println("|");
strcpy (msg1, data);
strcpy (msg2, data);
//###########################
for(i=0; i!=12; i++)
{
nremetente[i]=msg1[i];
}
nremetente[12]='\0';
//###########################
j=0;
i=0;
char codremetente[] = " ";
for(i=41; i!=45; i++)
{
codremetente[j]=msg2[i];
j++;
}
codremetente[5]='\0';
///###########################
Serial.print("NUMERO DO REMETENTE: ");
Serial.println(nremetente);
Serial.print("CODIGO ENVIADO : ");
Serial.println(codremetente);
Serial.println("|");
Serial.println("|");
if (!strcmp(nremetente, ncadastrado))
{
Serial.println("O REMETENTE E' IGUAL AO CADASTRADO");
Serial.println("|");
} else {
Serial.println("O REMETENTE NAO IGUAL AO CADASTRADO");
Serial.println("|");
Serial.print("REMETENTE CADASTRADO : ");
Serial.println(ncadastrado);
Serial.print("REMETENTE QUE ENVIOU : ");
Serial.println(nremetente);
Serial.println("|");
Serial.println("|");
}
if (!strcmp(codremetente, codcadastrado))
{
Serial.println("O CODIGO E' IGUAL AO CADASTRADO");
Serial.println("|");
} else {
Serial.println("O CODIGO ENVIADO DIFERENTE DO CADASTRADO");
Serial.println("|");
Serial.print("CODIGO CADASTRADO: ");
Serial.println(codcadastrado);
Serial.print("CODIGO ENVIADO : ");
Serial.println(codremetente);
Serial.println("|");
Serial.println("|");
}
Serial.println("---------------------------- F I M ----------------------------");
delay(60000);
}
void enviasms()
{
mySerial.println("AT+CIFSR");//executa comando
delay(3000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer(); //limpa buffer
mySerial.println("AT+CSQ");//executa comando
delay(3000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+cstt=\"zap.vivo.com.br\",\"vivo\",\"vivo\"");//executa comando
delay(2000); //espera
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+ciicr");//executa comando
delay(5000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+cifsr");//executa comando
delay(2000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
retorno = IsStringReceived("OK"); // verifica se o retorno é o esperado
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("at+cdnscfg?");//executa comando
delay(2000); //espera resultado na serial
leserial(); //processa dados e armazena no buffer
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("AT+CMGF=1\r"); // Because we want to send the SMS in text mode
delay(1000);
mySerial.println("AT+CMGS=\"88014013\"\r"); // Setting for the SMS Message center number,
delay(1000);
leserial();
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
mySerial.println("mensagem de teste"); // Start accepting the text for the message
delay(1000);
mySerial.println((char)26);
leserial();
Serial.println(comm_buf); //mostra retorno real
limpa_buffer();
}
/**********************************************************
Metodo splitstring
**********************************************************/
void splitString(char* data) {
Serial.print("Data entered splitString: ");
Serial.println(data);
Serial.print("FIM Data entered splitString: ");
char* parameter;
parameter = strtok (data,",");
while (parameter != NULL) {
//PROXIMO_METODO_COMA_AÇÃO(parameter);
Serial.println("parameter separado as partes");
Serial.println(parameter);
parameter = strtok (NULL,",");
}
}
/**********************************************************
Metodo para leitura da softserial
buffer maximo de (num_of_bytes) caracteres
**********************************************************/
void leserial()
{
num_of_bytes = mySerial.available(); //Pega quantidade de bytes ques estao na serial
while (mySerial.available() > 0) //Espera de até Available ser true
{
for(n=0; n<num_of_bytes; n++)
{
comm_buf[n] = mySerial.read(); //armazena buffer e a cada mySerial.read carry on buffer interno
}
}
mySerial.flush(); //limpa buffer de entrada da serial
}
/**********************************************************
Metodo para limpeza do buffer
**********************************************************/
void limpa_buffer()
{
memset(comm_buf,'\0',BUF_LEN);
}
/**********************************************************
Method checks received bytes
compare_string - pointer to the string which should be find
return: 0 - string was NOT received
1 - string was received
**********************************************************/
byte IsStringReceived(char const *compare_string)
{
http://Serial.println("testando...");
char *ch;
byte ret_val = 0;
if(1) {
ch = strstr((char *)comm_buf, compare_string);
if (ch != NULL)
{
Serial.println("existe Valor");
ret_val = 1;
}
else
{
}
}
return (ret_val);
}
---------------------VALIDANDO MENSAGEM SMS ---------------------
|
|
NUMERO DO REMETENTE: 552488014013
CODIGO ENVIADO : 0001
|
|
O REMETENTE E' IGUAL AO CADASTRADO
|
O CODIGO ENVIADO DIFERENTE DO CADASTRADO
|
CODIGO CADASTRADO: 52488014013
CODIGO ENVIADO : 0001
|
|
- Código:
evertondt- Mensagens : 12
Data de inscrição : 13/05/2012
Evento novo SMS
Alguém já conseguiu capturar o evento do SIM908 quando ele recebe um novo SMS? Deveria chegar na serial :+CMTI: "SM",1. Quando envio um SMS para o shield, nada acontece, mas se mando um comando AT qualquer para o shield pela serial, recebo essa resposta. Já testaram essas soluções com o Arduino+ shield 908 desligados do computador?
decionovaes- Mensagens : 4
Data de inscrição : 16/03/2013
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
logo logo vou comprar meu SIM908 e vou começar a trabalhar nisso também!
Bruno Rafael- Mensagens : 22
Data de inscrição : 17/03/2013
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Galera, estou trabalhando em algo parecido e cheguei a este código que funciona bem:
Postarei só o trecho que realmente interessa a quem quer desmembrar um SMS que recebido.
#define TAM 75
char dados[TAM] = " ";
byte contador;
String sms;
Serial2.println("AT+CMGR=1");
delay(2000);
if(Serial2.available() > TAM) {
for (contador = 0; contador < TAM; contador++)
{
dados[contador] = Serial2.read();
}
}
sms = dados;
sms = sms.substring(70,74); //função muito útil. é só vc determinar quais 'pontos' da string vc quer que ele recorta.
Espero ter ajudado!
Lembrando que estou usando SIM908 + Mega!!!
Postarei só o trecho que realmente interessa a quem quer desmembrar um SMS que recebido.
#define TAM 75
char dados[TAM] = " ";
byte contador;
String sms;
Serial2.println("AT+CMGR=1");
delay(2000);
if(Serial2.available() > TAM) {
for (contador = 0; contador < TAM; contador++)
{
dados[contador] = Serial2.read();
}
}
sms = dados;
sms = sms.substring(70,74); //função muito útil. é só vc determinar quais 'pontos' da string vc quer que ele recorta.
Espero ter ajudado!
Lembrando que estou usando SIM908 + Mega!!!
Bruno Rafael- Mensagens : 22
Data de inscrição : 17/03/2013
AJUDA...
Estou acompanhando o trabalho de vcs para tentar fazer com que esse programa funcione direitinho, e estou tentando testar o que vcs já fizeram!!!
mas não consigo enviar SMS, gostaria de saber se vcs estão enviando pelo serial monitor ou usando aquele hyperterminal para fazerem os teste ???
Se puderem me ajudar em outra coisa ficaria grato, alguem tem um código pra mim só enviar uma sms para um celuar, dizendo : funcionou, por exemplo. E se sim uso o serial monitor ou o hyperterminal !!!
estou com muita duvida msm, na vdd estou meio perdido!!! se alguem ai puder me ajudar com isso ficaria mt grato
mas não consigo enviar SMS, gostaria de saber se vcs estão enviando pelo serial monitor ou usando aquele hyperterminal para fazerem os teste ???
Se puderem me ajudar em outra coisa ficaria grato, alguem tem um código pra mim só enviar uma sms para um celuar, dizendo : funcionou, por exemplo. E se sim uso o serial monitor ou o hyperterminal !!!
estou com muita duvida msm, na vdd estou meio perdido!!! se alguem ai puder me ajudar com isso ficaria mt grato
americo- Mensagens : 7
Data de inscrição : 27/08/2013
Idade : 32
Localização : Maringá - Pr
Arduino esquentando demais
Fala ae pessoal, estou coma dúvida aqui em relação ao temperatura do Arduino, pois na parte traseira posterior entre o plug da fonte e o plug da USB, fica uma temperatura elevadíssima!
Estou utilizando um Arduino Mega R3, com Gsm/Gprs Shield Sim900d, comprado no próprio site do projeto arduino.
Isso é normal?
Estou utilizando um Arduino Mega R3, com Gsm/Gprs Shield Sim900d, comprado no próprio site do projeto arduino.
Isso é normal?
zenetos- Mensagens : 2
Data de inscrição : 26/10/2013
Re: Receber uma mensagem e acionar um dispositivo com o celular ( sim900/908 )
Normal aquecer um pouco o ams1117 mas não ficar a uma temperatura elevadissima
Tópicos semelhantes
» Sim900 Shield
» SIM908 e arduino UNO rastreador veicular
» Enviar SMS e receber confirmação de comando efetuado
» Sim900 Shield + Arduino MEGA
» Teste simples para o sim900
» SIM908 e arduino UNO rastreador veicular
» Enviar SMS e receber confirmação de comando efetuado
» Sim900 Shield + Arduino MEGA
» Teste simples para o sim900
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|