LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: nunosilvarocha em 15 de Agosto de 2011, 18:42
-
Comprei um modulo gsm Siemens tc35.
Tem ligação serie rs232, e trabalha por comandos AT (podem pesquisar no google.)
Junto vinha um adaptador de alimentação, um modulo para ligar auscultador e microfone (para utilizar em chamadas), e um CD com documentação.
Para testar o modulo liguei-o via serie rs232 ao pc, e com o hiperterminal do Windows consegui efetuar comunicação, efetuando assim alguns testes.
Visto que estava tudo bem, decidi fazer a ligação ao Arduino para que estes comunicassem.
Tive que adicionar um max232 da maxim para converter os sinais TTL do Arduino para rs232 para assim poder comunicar.
Depois de alguns testes, já consigo mandar mensagem, não sei se esta é a forma mais simples.
char rcv[20];
int cnt_rcv=0;
int k=0;
void setup()
{
Serial.begin(9600);
}
//Verifica o OK
//(procura 'OK' no vector)
int verifica_ok(char *ok)
{
int i=0;
for (i=0;i<20;i++)
{
if ((ok[i]=='O') && (ok[i+1]=='K'))
return 1;
}
return 0;
}
//lê os valores que o tc35 retorna
//(carrega para um vector os valores lidos)
void ler_serial()
{
cnt_rcv=0;
while(cnt_rcv==0)
{
while(Serial.available())
{
rcv[cnt_rcv]=Serial.read();
Serial.println(rcv[cnt_rcv]);
delay(200);
//Serial.println(cnt_rcv);
cnt_rcv++;
}
}
}
//converte para ascii
void envia_cmd(char*cmd, int t)
{
byte a;
int i=0;
delay(1000);
for (i=0; i<t; i++)
{
a=cmd[i];
Serial.print(a, BYTE);
}
Serial.print(13, BYTE); // 'ENTER'
Serial.print(10, BYTE); // 'NEW LINE'
}
// Envia o comando AT
int inicia()
{
int i=0;
char cmd[3]="AT";
delay(500);
envia_cmd(cmd, 2);
ler_serial();
delay(200);
//verifica se o modulo gsm retornou 'OK'
if (verifica_ok(rcv)==1)
{
Serial.println("Conectado!!");
delay(200);
return 1;
}
Serial.println("Desconectado!!");
delay(200);
return 0;
}
void envia_mensagem()
{
char cmd1[10]="AT+CMGF=1";
char cmd2[18]="AT+CMGS=910000000";
char cmd3[4]="ola";
//Selecionar mensagem em modo de texto
Serial.println("cmd1");
delay(200);
envia_cmd(cmd1, 9);
ler_serial();
delay(200);
if (verifica_ok(rcv)==1)
{
Serial.println("cmd2");
delay(200);
envia_cmd(cmd2, 17);
//espera até entrar em modo mensagem
while (Serial.read()!='>'){}
delay(200);
envia_cmd(cmd3, 3);
delay(200);
Serial.print(26, BYTE); // 'Ctrl Z'
delay(100);
ler_serial();
Serial.print("mensagem enviada");
Serial.println("ERRO!! Escrita da mensagem ");
}
else
Serial.println("ERRO!! cmd_1 ");
delay(5000);
}
void loop()
{
//assim o programa so executa uma vez
if(k<1)
{
k++;
//indica-me que o programa iniciou
Serial.println("iniciou...");
delay(2000);
//testa se o modulo gsm está a responder
if (inicia()==1)
{
Serial.println("funcao mensagem");
//função para enviar mensagem
envia_mensagem();
}
}
}
Isto ainda é uma versão muito beta.
Digam-me monde posso melhorar, e até alguma informação que tenham sobre este tipo de projetos.
-
Fiz uns melhoramentos no código:
Agora gostava de avançar para a leitura de mensagens.
Alguém sabe se existe algum código que me diga se tenho alguma mensagem por ler?
char rcv[20];
int cnt_rcv=0;
int k=0;
void setup()
{
Serial.begin(9600);
}
//*************************************************************
//lê os valores que o tc35 retorna
//(carrega para um vector os valores lidos)
void ler_serial()
{
cnt_rcv=0;
while(cnt_rcv==0)
{
while(Serial.available())
{
rcv[cnt_rcv]=Serial.read();
//Serial.println(rcv[cnt_rcv]);
delay(200);
//Serial.println(cnt_rcv);
cnt_rcv++;
}
}
}
//*************************************************************
//Verifica o OK
//(procura 'OK' no vector)
int verifica_ok(char *ok)
{
int i=0;
for (i=0;i<20;i++)
{
if ((ok[i]=='O') && (ok[i+1]=='K'))
return 1;
}
return 0;
}
//*************************************************************
// Envia o comando AT
int test_at()
{
Serial.println("AT");
delay(500);
ler_serial();
//verifica se o modulo gsm retornou 'OK'
if (verifica_ok(rcv)==1)
{
Serial.println("Conectado!!");
Serial.println(" ");
delay(500);
return 1;
}
Serial.println("Desconectado!!");
Serial.println(" ");
delay(500);
return 0;
}
//*************************************************************
void envia_mensagem()
{
Serial.println("AT+CMGF=1"); // Modo texto
delay(3000);
ler_serial();
delay(500);
if (verifica_ok(rcv)==1)
{
Serial.println("AT+CMGS=916679819"); // Numero de telemovel a enviar
delay(3000);
Serial.print("ola"); // Mensagem a enviar
delay(3000);
Serial.write(26);//Ctrl+z
delay(3000);
Serial.println("Mensagem enviada...");
Serial.println(" ");
delay(500);
}
else
{
Serial.println("Falhou envio da mensagem... (1)");
Serial.println(" ");
delay(500);
}
}
//*************************************************************
void loop()
{
//assim o programa so executa uma vez
if(k<1)
{
k++;
//indica-me que o programa iniciou
Serial.println("Programa mensagens iniciou...");
Serial.println(" ");
delay(2000);
//testa se o modulo gsm está a responder
if (test_at()==1)
{
Serial.println("Funcao envia mensagens...");
Serial.println(" ");
delay(2000);
//função para enviar mensagem
envia_mensagem();
}
}
}
-
O que é que a datasheet diz sobre receber mensagens?
-
Tens um comando que te diz qts mensagens tens, e outro que activa a indicação de "mensagem recebida agora".
Está no manual do modem !
-
O que é que a datasheet diz sobre receber mensagens?
Como assim? Tenho vários comandos, tenho que explorar!
-
Tens um comando que te diz qts mensagens tens, e outro que activa a indicação de "mensagem recebida agora".
Está no manual do modem !
Isso parece interessante...
Vou procurar!
-
Já evolui bastante hoje (penso eu)!!
Consigo enviar mensagem de qualquer telemóvel para o modulo gsm. O arduino faz a leitura da mensagem e compara.
Se o texto da mensagem disser "Test" então é retornada uma mensagem com o valor de dois sensores (um termístor e um ldr), caso contrario envia uma mensagem dizendo que tem que enviar "Test".
Por agora é só!
-
junta um lcd para ver as mensagens :D
-
junta um lcd para ver as mensagens :D
Quando isto estiver bem afinadinho um lcd parece-me bem!!
-
junta um lcd para ver as mensagens :D
e o código com isso? ;)
estou a trabalhar com um wavecom e estou a ter problemas com os "enter" que ele faz pelo meio