collapse

* Posts Recentes

LLM Crawlers por jm_araujo
[Ontem à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 75234 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 #165 em: 16 de Agosto de 2012, 17:58 »
Mete um delay antes de leres a sms.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #166 em: 16 de Agosto de 2012, 18:04 »
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);
 
}

testei enviei ligar luz e ele apagame me log a sms nem aparece a msg no serial

Código: [Seleccione]

OK

Mensagem Apagada
AT+CMGD=1

OK
AT+CMGR=1

+CMGR: 0,,0

OK

Mensagem Apagada
AT+CMGD=1

OK
AT+CMGR=1

+CMGR: 0,,0

OK


Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #167 em: 16 de Agosto de 2012, 18:39 »
Tirei a parte para apagar os SMS. 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) {
          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);
 
}

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #168 em: 16 de Agosto de 2012, 19:01 »
Fiz umas alterações e usei outro comando, que serve para ler as mensagens novas. O outro lia a mensagem na posição 1, ou seja, a mais antiga, e por isso tinha-se que apagar sempre. Desta maneira, se resultar, é melhor.
Vê se funciona:
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) { //Para debug - Reencaminha comandos do PC para o telemóvel
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(3);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0"); //read received unread messages
  delay(1000);
  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");
            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) );
          Serial3.println("AT+CMGD=1");
          delay(1000);
          while (Serial3.available() >0) {Serial3.read();}
          Serial.println("Mensagem Apagada");
          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 #169 em: 16 de Agosto de 2012, 19:35 »
Fiz umas alterações e usei outro comando, que serve para ler as mensagens novas. O outro lia a mensagem na posição 1, ou seja, a mais antiga, e por isso tinha-se que apagar sempre. Desta maneira, se resultar, é melhor.
Vê se funciona:
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) { //Para debug - Reencaminha comandos do PC para o telemóvel
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(3);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0"); //read received unread messages
  delay(1000);
  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");
            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) );
          Serial3.println("AT+CMGD=1");
          delay(1000);
          while (Serial3.available() >0) {Serial3.read();}
          Serial.println("Mensagem Apagada");
          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);
 
}


com este codigo enviei a mensagem "teste" apagou a msg...
mandei ligar luz tambem apagou a msg e nao fez mais nada

Código: [Seleccione]
m Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
« Última modificação: 16 de Agosto de 2012, 19:39 por r16 »

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #170 em: 16 de Agosto de 2012, 19:39 »
Comentei a parte para apagar a mensagem. Testa e põe aqui o que aparece no serial monitor.
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) { //Para debug - Reencaminha comandos do PC para o telemóvel
    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+CMGL=0"); //read received unread messages
  delay(1000);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(3);
      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");
            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) );
          //Serial3.println("AT+CMGD=1");
          //delay(1000);
          //while (Serial3.available() >0) {Serial3.read();}
          //Serial.println("Mensagem Apagada");
          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 #171 em: 16 de Agosto de 2012, 19:45 »
Comentei a parte para apagar a mensagem. Testa e põe aqui o que aparece no serial monitor.
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) { //Para debug - Reencaminha comandos do PC para o telemóvel
    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+CMGL=0"); //read received unread messages
  delay(1000);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(3);
      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");
            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) );
          //Serial3.println("AT+CMGD=1");
          //delay(1000);
          //while (Serial3.available() >0) {Serial3.read();}
          //Serial.println("Mensagem Apagada");
          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);
 
}

enviei a msg teste apareceu..:
+CMGL: 1,0,,24
07915391131213F4040C915391460012670
AT+CMGL=0

enviei a msg ligar luz apareceu:

AT+CMGL=0

+CMGL: 2,0,,27
07915391131213F4040C915391460012670
AT+CMGL=0

OK


e fiquei com duas msg na pasta recebidas

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #172 em: 16 de Agosto de 2012, 19:52 »
Passa-se alguma coisa, porque as mensagens estão em branco. Tenta o código anterior que funcionava.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #173 em: 16 de Agosto de 2012, 20:33 »
o ultimo que eu tinha a funcionar bem a apagar as mensagens ,ligar luz e ligar rega era 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
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);
 
}


no entanto foi me enviado ha uns tempos um codigo,para o shield gsm que acho que apaga msg indesejadas..
nao sei se podes tirar alguma ideia daqui:

Código: [Seleccione]
/*Program for modem Siemens MC35i for control Digital Outputs via SMS.
Develop by Hugo Santos
e-mail: hugo.santos@i9box.
Started on 20/02/2012
*/
#include <icrmacros.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
#include <Tone.h>
const int beep_freq[] = { 200, 400, 600, 800, 1000, 1200, 1400};
Tone beep;


SoftwareSerial pic(2, 3); //RX2 TX3

char sender_ID[14];
char corpo[4];
char incoming_modem_data[50];
char sms_array[120];
char counter[7];
boolean estado_botao = false;
boolean sendSMS = false;
char eeprom_SMS_Number[14];
char auth_SMS_Number;
//Pins Name
const short int picReset = 4;
const short int speaker = 5;
const short int pin10 = 10;
const short int pin11 = 11;
const short int pin12 = 12;
const short int pin13 = 13;
const short int pinA0 = A0;
const short int pinA1 = A1;
const short int pinA2 = A2;
const short int progPin = A3;




void setup() 
{
beep.begin(speaker);
Serial.begin(9600);
pic.begin(9600);
pic.listen();
delay(7000);//Delay for modem wakeup
read_auth_SMS_Number();//To load the SMS auth number stored on the eeprom at startup
Serial.println(eeprom_SMS_Number);
//Setup Pins
pinMode(picReset,OUTPUT);
pinMode (speaker,OUTPUT);// Connected to a Speaker to beep functions
pinMode (pin10,OUTPUT);
pinMode (pin11,OUTPUT);
pinMode (pin12,OUTPUT);
pinMode (pin13,OUTPUT);
pinMode (pinA0,INPUT);
pinMode (pinA1,INPUT);
pinMode (pinA2,INPUT);
pinMode (progPin,INPUT);//Connected to a swith for PC program SMS Number
//Set pins
digitalWrite(picReset,LOW);//Used to Reset the Counter on the pic PIN RA0--Normal pulled down
digitalWrite(pin10, LOW);//Set de default status
digitalWrite(pin11, LOW);//Set de default status
digitalWrite(pin12, LOW);//Set de default status
digitalWrite(pin13, LOW);//Set de default status
digitalWrite(pinA0, LOW);//Set de default status
digitalWrite(pinA1, LOW);//Set de default status
digitalWrite(pinA2, LOW);//Set de default status

//Setup the aut_number via VB program
if( digitalRead(progPin) == 1 ){
  change_auth_number();
  }

//_____________________________________________
Serial.println("AT");  //Set Modem to Text Mode
delay(30);
Serial.print(0x0d,BYTE);  //Give an Enter @ final of the AT Command   
delay(30);
Serial.println("AT+CMGF=1");
clear_SMS_Modem_Memory(); //To prevent some seend SMS when modem was offline to became deleted
Serial.flush();//Clear the pc Buffer to remove unexpected data
}

void loop() 
{
check_Incoming_SMS();
verify_Data_Received();
}

//_____________________________
void change_auth_number(){
  char read_data_pc[10]; 
  beep.play(beep_freq[4], 1000);
  delay(200);
  beep.play(beep_freq[1], 1000);
  //Serial.println("Waiting for new SMS Number:");
  while (Serial.available() <= 10);
  if(Serial.read() == 83){
    for(int i= 0; i<= 8;i++){ 
    read_data_pc[i] = Serial.read();
    //Serial.println(read_data_pc[i]);
    EEPROM.write((i + 4),read_data_pc[i]);
    }
    }
  EEPROM.write(0,char(43));//+
  EEPROM.write(1,char(51));//3
  EEPROM.write(2,(char)(53));//5
  EEPROM.write(3,char(49));//1

}






//_____________________________
String read_auth_SMS_Number(){
for(int i=0;i<=12;i++){
  eeprom_SMS_Number[i] = EEPROM.read(i);
  }
eeprom_SMS_Number[13] = '\0';
return eeprom_SMS_Number;

}
//_____________________________


String read_pic16F887A()
{
pic.print("R");//To seend an order to pic give me back the counter number It will reply with 6 bytes
while(pic.available() < 6) {};
for (int i = 0; i < 6;){
   counter[i++] = pic.read();
   counter[i] = '\0';

return counter;
}

//_____________________________

void check_Incoming_SMS()
{
int i = 0 ;
  while (Serial.available() > 0) {
  incoming_modem_data[i] = Serial.read();
  delay(80);//To give some conversion delay
  i++;
  if(i >= 49)break; //Prevents from big array error
  }
}
//____________________________
void verify_Data_Received()
{
  //In this function we will try to filter the array data to see if it is a real message AT+CMI or just a RING or an ERROR output from the modem pc 
  if(incoming_modem_data[5] == (0x54) && incoming_modem_data[6] == (0x49)){
  incoming_modem_data[11]= 0x00;//For clear the array element to prevent for a loop
  extract_SMS_Data();//Jump to the extract_SMS_Data function to get values
  }
}
//____________________________
void extract_SMS_Data(){
Serial.print("AT+CMGR=");//Send instrution to read the SMS
delay(30);
Serial.print(incoming_modem_data[14]); //Position of the SMS Received
delay(30);
Serial.print(0x0d,BYTE);//Makes an Enter @ the end
int i=0;
while (Serial.available() > 0) {
sms_array[i] = Serial.read();
delay(80);//To give some conversion delay
//pc.println(i); //Diagnose
//pc.println(sms_array[i]);
i++;
if(i >= 98)break; //Prevents from big array error
}
//pc.println(get_SMS_ID_Sender());
//pc.println(get_corpo_sms());
get_SMS_ID_Sender();
get_corpo_sms();
clear_Received_SMS();
functions_List();

}
//________________________
String get_SMS_ID_Sender()
{
int l = 33; //Position were the array starts to get the SMS Sender ID
for (int j = 0;j<=12;j++){
sender_ID[j] = sms_array[l];
l++;

sender_ID[13] = '\0'; //Terminate the String element on the array
return sender_ID;
}
//________________________
String get_corpo_sms(){
int l = 73;
for( int i = 0;i<= 2; i++){
corpo[i] = sms_array[l];
l++;
}
corpo[3] = '\0'; //Para terminar a string de dados
return corpo;
}
//____________________________
void clear_Received_SMS(){
Serial.print("AT+CMGD=");
Serial.println(incoming_modem_data[14]);
delay(100);
Serial.print(0x0d,BYTE);
delay(100);

//________________________
void functions_List(){
 
//Digital outputs_________________
if (strcmp(corpo, "on1")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin10, HIGH);
delay(30);
send_SMS(String(eeprom_SMS_Number),"Saida 1 ", "Activada");
//send_SMS(String(eeprom_SMS_Number),"Contador = ",read_pic16F887A());
}

if (strcmp(corpo, "of1")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin10, LOW);
send_SMS(String(eeprom_SMS_Number),"Saida 1 ", "Desactivada");
}


if (strcmp(corpo, "on2")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin11, HIGH);
delay(30);
send_SMS(String(eeprom_SMS_Number),"Saida 2 ", "Activada");
}

if (strcmp(corpo, "of2")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin11, LOW);
send_SMS(String(eeprom_SMS_Number),"Saida 2 ", "Desactivada");
}

if (strcmp(corpo, "on3")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin12, HIGH);
delay(30);
send_SMS(String(eeprom_SMS_Number),"Saida 3 ", "Activada");
//send_SMS(String(eeprom_SMS_Number),"Contador = ",read_pic16F887A());
}

if (strcmp(corpo, "of3")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin12, LOW);
send_SMS(String(eeprom_SMS_Number),"Saida 3 ", "Desactivada");
}

if (strcmp(corpo, "on4")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin13, HIGH);
delay(30);
send_SMS(String(eeprom_SMS_Number),"Saida 4 ", "Activada");
//send_SMS(String(eeprom_SMS_Number),"Contador = ",read_pic16F887A());
}

if (strcmp(corpo, "of4")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(pin13, LOW);
send_SMS(String(eeprom_SMS_Number),"Saida 4 ", "Desactivada");
}


if (strcmp(corpo, "ctd")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
send_SMS(String(eeprom_SMS_Number),"Contador = ",read_pic16F887A());
}

if (strcmp(corpo, "rst")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{
digitalWrite(picReset,HIGH);
delay(40);
digitalWrite(picReset,LOW);
send_SMS(String(eeprom_SMS_Number),"Contador ","Resetado");
}

if (strcmp(corpo, "an0")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{

send_SMS(String(eeprom_SMS_Number),"Valor Analogico Entrada 0 = ",analogRead(pinA0));

}

if (strcmp(corpo, "an1")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{

send_SMS(String(eeprom_SMS_Number),"Valor Analogico Entrada 1 = ",analogRead(pinA1));

}

if (strcmp(corpo, "an2")  == 0 && strcmp(sender_ID, eeprom_SMS_Number) == 0) //strcmp compara a string com o valor caso seja verdadeiro devolde valor 0
{

send_SMS(String(eeprom_SMS_Number),"Valor Analogico Entrada 2 = ",analogRead(pinA2));

}
}
//_________________________________________________________________
void send_SMS(String destination, String body, String message){

Serial.println("AT+CMGF=1"); //Set the modem in SMS mode
delay(500);                   //Waits for 500ms important!!!
Serial.print("AT+CMGS=");    //AT command for start the SMS send
Serial.print(destination);//Insert the destination number
Serial.println();            //Give a new line
delay(500);       //Waits for 500ms
Serial.print(body);//Seends the pre body
Serial.print(message);//Seends the message
Serial.println(26, BYTE);    //Seend a CTRL-Z for end the text insertion

}
//________________________________________________________________

void clear_SMS_Modem_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
Serial.print("AT+CMGD=");
Serial.print(i);
Serial.println(0x0d,BYTE);
delay(100);
}

beep.play(beep_freq[0], 1000);
delay(200);
beep.play(beep_freq[2], 1000);
delay(200);
beep.play(beep_freq[4], 1000);

}



Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #174 em: 16 de Agosto de 2012, 20:40 »
E já viste se esse ainda funciona?

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #175 em: 16 de Agosto de 2012, 20:53 »
Sim funciona  se eu enviar uma msg ligar luz, ou ligar rega ele liga o led, envia sms para mim e apaga msg.

mas se eu enviar uma msg qualquer ANTES ...ja nao funciona.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #176 em: 16 de Agosto de 2012, 20:58 »
Ok. Estou a modificar o código.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #177 em: 16 de Agosto de 2012, 21:40 »
Ok. Estou a modificar o código.

Ok obrigado.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #178 em: 16 de Agosto de 2012, 22:10 »
Estive a melhorar o código e a organizá-lo. Espero que funcione... Testa-o bem e depois diz-me.
Aqui tens:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU

char numero[13] = "351964002176"; // Numero que recebe SMS

void setup()
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
  clear_SMS_Memory(); //Apagar SMS 1-30
  Serial.println("SMS apagados");
}

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(1000);
  if (Serial3.available()>0) //Se há alguma coisa para ler...
  {
    int index = 0;
    while (Serial3.available()>0) //Enquanto há para ler...
    {
      info[index] = Serial3.read(); //Ler
      index++;
      delay(2);
    }
    //Acabou de ler tudo
    Serial.println(String(info)); //Envia string lida para o PC
    if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
      { LigarLuz(); }
    else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
      {LigarRega(); }
    Serial3.println("AT+CMGD=1"); //Apagar mensagem
    Serial3.flush(); //Limpar resposta
    Serial.println("Mensagem Apagada");
    memset( &info, 0, sizeof(info) ); //Limpar array info
    }
}

void LigarLuz()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

void LigarRega()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Rega Ligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Rega Ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

void CheckPCserial()
{
  int index = 0;
    if (Serial.available()>0) {
    while (1) {
      info[index] = Serial.read();
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
}

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  Serial3.flush();
}

#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))

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: 16 de Agosto de 2012, 22:12 por Pedrock »

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #179 em: 16 de Agosto de 2012, 22:26 »
Estive a melhorar o código e a organizá-lo. Espero que funcione... Testa-o bem e depois diz-me.
Aqui tens:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU

char numero[13] = "351964002176"; // Numero que recebe SMS

void setup()
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
  clear_SMS_Memory(); //Apagar SMS 1-30
  Serial.println("SMS apagados");
}

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(1000);
  if (Serial3.available()>0) //Se há alguma coisa para ler...
  {
    int index = 0;
    while (Serial3.available()>0) //Enquanto há para ler...
    {
      info[index] = Serial3.read(); //Ler
      index++;
      delay(2);
    }
    //Acabou de ler tudo
    Serial.println(String(info)); //Envia string lida para o PC
    if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
      { LigarLuz(); }
    else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
      {LigarRega(); }
    Serial3.println("AT+CMGD=1"); //Apagar mensagem
    Serial3.flush(); //Limpar resposta
    Serial.println("Mensagem Apagada");
    memset( &info, 0, sizeof(info) ); //Limpar array info
    }
}

void LigarLuz()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

void LigarRega()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Rega Ligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Rega Ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

void CheckPCserial()
{
  int index = 0;
    if (Serial.available()>0) {
    while (1) {
      info[index] = Serial.read();
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
}

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  Serial3.flush();
}

#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))

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);
 
}


neste caso envio a mensagem,,,,
e aparece isto sempre no serial monitor

 
Código: [Seleccione]
OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada
AT+CMGD=1

OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada
AT+CMGD=1
AT+CMGR=1

OK

Mensagem Apagada

tipo isso ta sempre a passar de meio em meio segundo...
da ideia que assim que recebe a mensagem MESMO que seja certa
ligar luz ou ligar lampada que a apaga logo.