collapse

* Posts Recentes

LLM Crawlers por jm_araujo
[Hoje às 21:57]


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 75229 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 #120 em: 13 de Agosto de 2012, 23:38 »
Se não conseguires receber nada com esse que te enviei agora alteramos esse, mas experimenta o outro, já não falta tanto para acabar...

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #121 em: 13 de Agosto de 2012, 23:42 »
Espera uns minutos que eu já ponho aqui o código. Vou editar o que puseste aqui.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #122 em: 13 de Agosto de 2012, 23:43 »
É preciso enviar algum comando para iniciar o telemóvel? Ou pode-se logo enviar o comando para ler as sms?

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 info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // 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;
      }
    }
  }
  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(info2).indexOf(String(info1))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          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. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.

podesse enviar logo o comando para ler msg, ou qualquer outro..
agora ok.. enviei a msg para ligar o led mas nao ligou o led...
depois enviei para o serial o comando para ler msg e apareceu:


+CMGL: 1,0,,27
07915391131213F4040C9153914600126700002180313213744009ECF4392C07B1EB7A



OK
« Última modificação: 13 de Agosto de 2012, 23:45 por r16 »

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #123 em: 13 de Agosto de 2012, 23:44 »
Ok, acho que já descobri o erro (pelo menos um deles).
Tinha trocado na função indexOf as 2 variáveis.

Fica assim então:
É preciso enviar algum comando para iniciar o telemóvel? Ou pode-se logo enviar o comando para ler as sms?

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 info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // 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;
      }
    }
  }
  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(info2))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          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. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #124 em: 13 de Agosto de 2012, 23:47 »
Realmente o outro código está mais simples, mas já que começámos com este, agora tentamos acabar, senão é trabalho deitado fora...

Edit: Com o último código que enviei ainda tens de enviar o comando pelo serial monitor. E só depois de enviares o comando é que o led acende e recebes a mensagem no serial monitor. Se estiver tudo bem com esse código metemos a ler a sms sozinho.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #125 em: 13 de Agosto de 2012, 23:49 »
rglove
Esse ainda tem um problema.
Estás a procurar o inicio do código PDU, que tem info como numero telemovel, data, etc, mas não estás a procurar o texto em si.
Vê este aqui:

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] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          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 r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #126 em: 13 de Agosto de 2012, 23:50 »
Ok, acho que já descobri o erro (pelo menos um deles).
Tinha trocado na função indexOf as 2 variáveis.

Fica assim então:
É preciso enviar algum comando para iniciar o telemóvel? Ou pode-se logo enviar o comando para ler as sms?

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 info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // 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;
      }
    }
  }
  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(info2))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          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. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.


continua a nao acender o led

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #127 em: 13 de Agosto de 2012, 23:54 »
r16
Tenta o meu.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #128 em: 13 de Agosto de 2012, 23:55 »
É isso mesmo Pedrock. Pensava que a informação que vinha para trás se mantinha igual e só alterava a data da mensagem, mas afinal não  ;)

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #129 em: 13 de Agosto de 2012, 23:56 »
rglove
Esse ainda tem um problema.
Estás a procurar o inicio do código PDU, que tem info como numero telemovel, data, etc, mas não estás a procurar o texto em si.
Vê este aqui:

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] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          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);
 
}



 8) 8) 8) 8) 8) agora sim liga o led.
Pronto agora era fazer o inverso, envie a msg ligar luz.. agora queria que ele SIEMENS, enviasse uma mensagem para o meu numero a dizer: luz ligada

mas gostaria de incluir aquele codigo no loop:
 void delsms(){
    Serial.println("AT+CMGD=1");//Delete sms
    }
 void readsmsAT(){
   Serial.println("AT+CMGR=1");//Read sms AT command
   delay(3000);


de maneira a que eu nao tenha a caixa sempre cheia. estao a ver a ideia?

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #130 em: 14 de Agosto de 2012, 00:00 »
 :)
Agora é só adicionar o send_sms(numero, mensagem) abaixo do código para acender o LED e isso já fica a funcionar. Também se pode adicionar o delete.

EDIT:
Usa este código. Edita o número para o teu (mantém o 351).
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] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(13,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);
 
}
« Última modificação: 14 de Agosto de 2012, 00:03 por Pedrock »

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #131 em: 14 de Agosto de 2012, 00:04 »
:)
Agora é só adicionar o send_sms(numero, mensagem) abaixo do código para acender o LED e isso já fica a funcionar. Também se pode adicionar o delete.

EDIT:
Usa este código. Edita o número para o teu (mantém o 351).
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] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(13,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);
 
}

fica assim:

send_sms(meunumero, luz ligada)

???

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #132 em: 14 de Agosto de 2012, 00:06 »
Edita aqui:
char numero[13] = "351999999999"

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #133 em: 14 de Agosto de 2012, 00:07 »
Ia mandar o código, mas o Pedrock já respondeu :) Apaga primeiro as sms todas do telemóvel e depois adiciona então o código para fazer o delete da sms, mas muda o Serial para Serial3.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #134 em: 14 de Agosto de 2012, 00:17 »
lol que raio agora ja nao acende o led,exprimentei tambem o codigo primeiro do pedrorock a ver se era algum problema.. e tambem nao acende..

olha que isto hein