collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Arduino+GSM (TC35)  (Lida 7633 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.733
  • 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.649
    • 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.469
    • 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