collapse

* Links de Robótica

* Posts Recentes

Preços e fabricantes de pcb por Sérgio_Sena
[Hoje às 10:20]


Palavras Cruzadas por Njay
[Hoje às 02:24]


Isaac Asimov - I, Robot por senso
[Ontem às 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]


IPV4 IPV6 por Hugu
[13 de Setembro de 2017, 22:01]

Autor Tópico: Arduino+GSM (TC35)  (Lida 4810 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Arduino+GSM (TC35)
« 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.
 
« Última modificação: 24 de Agosto de 2011, 21:30 por nunosilvarocha »

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Re: Arduino+GSM (TC35)
« Responder #1 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();
    }
  } 
}






Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.389
  • Helpdesk do sitio
Re: Arduino+GSM (TC35)
« Responder #2 em: 24 de Agosto de 2011, 21:33 »
O que é que a datasheet diz sobre receber mensagens?
Avr fanboy

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.641
    • Electronic Gear for Musicians
Re: Arduino+GSM (TC35)
« Responder #3 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 !

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Re: Arduino+GSM (TC35)
« Responder #4 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!

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Re: Arduino+GSM (TC35)
« Responder #5 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!

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Re: Arduino+GSM (TC35)
« Responder #6 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ó!

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.457
    • Pro - andrefcarvalho
Re: Arduino+GSM (TC35)
« Responder #7 em: 26 de Agosto de 2011, 22:28 »
junta um lcd para ver as mensagens :D

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Re: Arduino+GSM (TC35)
« Responder #8 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!!

Offline ricard0g0mes

  • Mini Robot
  • *
  • Mensagens: 146
Re: Arduino+GSM (TC35)
« Responder #9 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