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

Título: Arduino+GSM (TC35)
Enviado 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.
Código: [Seleccione]
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.
 
Título: Re: Arduino+GSM (TC35)
Enviado por: nunosilvarocha em 24 de Agosto de 2011, 21:29
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?


Código: [Seleccione]
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();
    }
  } 
}





Título: Re: Arduino+GSM (TC35)
Enviado por: senso em 24 de Agosto de 2011, 21:33
O que é que a datasheet diz sobre receber mensagens?
Título: Re: Arduino+GSM (TC35)
Enviado por: Sérgio_Sena em 25 de Agosto de 2011, 09:14
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 !
Título: Re: Arduino+GSM (TC35)
Enviado por: nunosilvarocha em 25 de Agosto de 2011, 13:10
O que é que a datasheet diz sobre receber mensagens?

Como assim? Tenho vários comandos, tenho que explorar!
Título: Re: Arduino+GSM (TC35)
Enviado por: nunosilvarocha em 25 de Agosto de 2011, 13:10
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!
Título: Re: Arduino+GSM (TC35)
Enviado por: nunosilvarocha em 26 de Agosto de 2011, 02:03
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ó!
Título: Re: Arduino+GSM (TC35)
Enviado por: andre_f_carvalho em 26 de Agosto de 2011, 22:28
junta um lcd para ver as mensagens :D
Título: Re: Arduino+GSM (TC35)
Enviado por: nunosilvarocha em 27 de Agosto de 2011, 03:39
junta um lcd para ver as mensagens :D

Quando isto estiver bem afinadinho um lcd parece-me bem!!
Título: Re: Arduino+GSM (TC35)
Enviado por: ricard0g0mes em 13 de Fevereiro de 2012, 18:34
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