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.