collapse

* Posts Recentes

LLM Crawlers por TigPT
[Hoje às 19:58]


Emulador NES em ESP32 por dropes
[30 de Abril de 2024, 15:09]


Circuito Microfone que funcione por almamater
[27 de Abril de 2024, 17:14]


Arame de Estendal por almamater
[18 de Abril de 2024, 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


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


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]

Autor Tópico: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.  (Lida 75228 vezes)

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

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #150 em: 14 de Agosto de 2012, 01:33 »
O problema está no código PDU que não tem a mensagem lá. Se reparares independentemente da sms que envias o código PDU é o mesmo.

Experimenta este código. Envia a sms e diz o que obtens. (apaga todas as sms antes)

O meu não tem a parte para reencaminhar os comandos do PC.

EDIT:
Tenta este:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Abre o Serial Monitor. Envia a SMS e vê se a luz acende. Se não, copia o que aparece no Serial Monitor.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #151 em: 14 de Agosto de 2012, 01:39 »
4040C915391460012670000218041107+R


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF4390E



AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411074C1A

K
AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110728540C97B

K
AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072B7

O
AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF4392C07B1EB

O

AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110728540E30EA

A+R


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF4392C07BB

O

AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110728540E3C1A

KATM1

+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF432B7


AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110720C97B

OATM=



ta tao rapido que nao consigo copiar tudo...agora SIM liga me e apaga me o led , e envia me infinitamente mensagens LOL

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #152 em: 14 de Agosto de 2012, 01:46 »
rglove, e pedrock agredeço a vossa ajuda e paciencia por hoje, mas tenho que me ir deitar, quando regressar aqui leio as vossas alteracoes, e envio para o arduino, tenho que me ir deitar se nao a mulher mete me fora de casa. muito obrigado

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #153 em: 14 de Agosto de 2012, 01:55 »
Ok, se reparares a maioria desses códigos PDU não contém a mensagem completa, apenas parte.
Experimenta este:

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    delay(1000);
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            while (Serial3.available() >0) {}
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Não sei se vai funcionar, mas experimenta. Apaga antes as sms todas. Só aumentei o tempo de espera entre a recepção e a leitura da sms, porque se calhar quando a lês ela não está completa ainda. Também já está a apagar automaticamente a sms quando a recebe.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #154 em: 14 de Agosto de 2012, 02:00 »
rglove, e pedrock agredeço a vossa ajuda e paciencia por hoje, mas tenho que me ir deitar, quando regressar aqui leio as vossas alteracoes, e envio para o arduino, tenho que me ir deitar se nao a mulher mete me fora de casa. muito obrigado

Amanhã é outro dia... Depois diz como correu!

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #155 em: 16 de Agosto de 2012, 00:31 »
Código: [Seleccione]
[quote author=rglove link=topic=5212.msg57734#msg57734 date=1344906033]
[quote author=r16 link=topic=5212.msg57732#msg57732 date=1344905184]
rglove, e pedrock agredeço a vossa ajuda e paciencia por hoje, mas tenho que me ir deitar, quando regressar aqui leio as vossas alteracoes, e envio para o arduino, tenho que me ir deitar se nao a mulher mete me fora de casa. muito obrigado
[/quote]

Amanhã é outro dia... Depois diz como correu!
[/quote]

boas pessoal, bem isto ja ta a bombar ...mas agora ta aqui uma coisa mal..

o codigo que tenho a funcionar é:

[code#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}]


eu envio do meu telemovel "ligar luz"
ele liga a luz...
envia um sms de retorno para mim a dizer luz ligada...
apaga a sms do telemovel a dizer "ligar luz" so que depois para ai.....

se eu voltar a enviar outra mensagem "ligar luz" ele ja nao acende,, ou seja ta a parar de fazer o loop,, como resolvo isso??

obrigado

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #156 em: 16 de Agosto de 2012, 00:37 »
Substitui:
while (Serial3.available() >0) {}
Por:
while (Serial3.available() >0) {Serial3.read();}

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #157 em: 16 de Agosto de 2012, 00:49 »
Substitui:
while (Serial3.available() >0) {}
Por:
while (Serial3.available() >0) {Serial3.read();}

obrigado , agora ja ta a fazer o loop.
Outra coisa Pedro, agora se quizer colocar outra mensagem por exemplo "ligar rega"

tenho que adicionar la em cima

char ligarrega[] = "AQUI O CODIGO PDU"; //"ligar lega" em PDU

e depois meto este codigo a onde:

Código: [Seleccione]
Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           //send_sms(numero, "REGA LIGADA");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

se puderes alterar ai envia-me sff.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #158 em: 16 de Agosto de 2012, 01:09 »
Basta meter um else if abaixo do if que verificava se tinha "ligar luz", mas desta vez com o "ligar rega".
Já meti o PDU para "ligar rega".
Aqui tens:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #159 em: 16 de Agosto de 2012, 01:15 »
É melhor alterar também a linha que apaga a sms e metê-la a apagar qualquer sms, porque da forma que eu pus só apaga a sms quando ela traduzir algum "comando", caso não traduza comando nenhum o código não vai funcionar mais. É só meter essa linha mais em cima, dentro do if Serial3.available().

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #160 em: 16 de Agosto de 2012, 01:35 »
Basta meter um else if abaixo do if que verificava se tinha "ligar luz", mas desta vez com o "ligar rega".
Já meti o PDU para "ligar rega".
Aqui tens:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

funciona fixe...

testei agora uma coisa,,, se enviar uma sms teste.......ou se o tlm receber uma msg de alguem.. ele vai ocupar a posicao 1 ou seja
AT+CMGD=1

depois se eu enviar uma msg correcta a dizer "ligar luz" ou "ligar rega" ele ja nao faz nada.. porque tenho ali aquela mensagem desconhecida a ocupar espaço...

existe alguma maneira de contornar isso????ou seja apagar as mensagens desconhecidas..ou ele so accionar as mensagens correctas.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #161 em: 16 de Agosto de 2012, 01:42 »
Existe... Lê o que postei antes de ti. Foi precisamente isso que disse, precisas de alterar o código que apaga as sms. Só está a apagar as sms que traduzem comandos, tens de colocar as linhas de código que apagam as sms no inicio dentro da condição if Serial3.available(). Mete logo na linha a seguir a isso e vai estar a funcionar direito.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #162 em: 16 de Agosto de 2012, 01:47 »
Desculpa os posts seguidos, mas só agora é que reparei que estava a dizer mal, tens de colocar essas linhas a seguir ao if Serial3.available() <= 0 e não a seguir a if Serial3.available().

Fica assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


Experimenta e diz se está a funcionar

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #163 em: 16 de Agosto de 2012, 16:49 »
Desculpa os posts seguidos, mas só agora é que reparei que estava a dizer mal, tens de colocar essas linhas a seguir ao if Serial3.available() <= 0 e não a seguir a if Serial3.available().

Fica assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


Experimenta e diz se está a funcionar

Enviei uma mensagem a dizer "ligar luz"

e aparece isto

Código: [Seleccione]
91131213F4040C915391460012670000218061616AT+CMGR=1

Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C9153914600126700002180616161

Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616

Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616MGR=1

Mensagem Apagada

+CMGR: 1,,27

e apaga logo a mensagem..

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #164 em: 16 de Agosto de 2012, 17:57 »
Faltava aí um delay. Tenta assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    delay(1000);
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

  Serial3.println("AT+CMGF=0");
  delay(1500);
  Serial3.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  Serial3.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}