collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[Ontem às 14: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]


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


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

Autor Tópico: Arduino + Siemens c72  (Lida 23369 vezes)

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

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Arduino + Siemens c72
« Responder #15 em: 25 de Agosto de 2012, 01:56 »
ola seu copião  :D

tenta isto

no void setup
pinMode(12,OUTPUT);

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Arduino + Siemens c72
« Responder #16 em: 25 de Agosto de 2012, 02:09 »
Penso que o problema não é só esse porque as mensagens que recebeste estão incompletas. Não sei se o fiz da melhor forma, mas supostamente com o código que está em baixo se houver uma sms ele faz um delay de 2 segundos antes de a ler. Não sei se vai resolver, mas experimenta.

Código: [Seleccione]
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);

int ledPin = 13; //Used for DEBUG
char info[400];

char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU

char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU

char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS

void setup()
{
  pinMode(12,OUTPUT);
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  my.begin(19200);
  clear_SMS_Memory(); //Apagar SMS 1-30
  Serial.println("SMS apagados"); //DEBUG
  Serial.println("Inicio do Loop"); //DEBUG
}

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  my.println("AT+CMGR=1"); //ler mensagem na posição 1
  int index = 0;
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
  while (millis() < (startTime+1000)) //Timeout de 1s
  {
    if (my.available()>0){
      info[index] = my.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
  //Passou 1s
  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
  {
      delay(2000);
      my.println("AT+CMGR=1");
      index=0;
      startTime = millis();
       while (millis() < (startTime+1000)) //Timeout de 1s
  {
    if (my.available()>0){
      info[index] = my.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
      Serial.println("//Mensagem Recebida:"); //DEBUG
      Serial.println(String(info)); //DEBUG
      Serial.println("//Fim da Mensagem\\"); //DEBUG
      if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
      {
        Serial.println("Mensagem do admin");
         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(desligarluz))>0)
            { DesligarLuz();}
         else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
             {LigarRega(); }
         else if (String(info).indexOf(String(desligarrega))>0)
             {DesligarRega();}
      }
      else Serial.println("Mensagem de outra pessoa"); //DEBUG
     
      my.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (my.available()>0) my.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

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

void DesligarLuz()
{
    digitalWrite(12,LOW); //LED aceso
    Serial.println("Luz desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz desligada"); //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 DesligarRega()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Rega Desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Rega Desligada"); //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) {
          my.println(String(info));
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
}

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    my.print("AT+CMGD=");
    my.println(i);
    delay(100);
  }
  while (my.available()>0) my.read(); //Limpar resposta
}

#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)
{
  my.write(hexdump_a(byte));
  my.write(hexdump_b(byte));
}

String converterNumero(char *pho){
  char num[13];
  int data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      num[y]=(pho[y+1]);
      num[y+1]=(pho[y]);
    }
    num[y] = '\0';
  return num;
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      my.write(pho[y+1]);
      my.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;

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

 
  my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  my.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
  my.write(0x1A); // Ctrl+Z
  my.write(0x0D); // CR
  my.write(0x0A); // LF
  delay(5000);
}

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Arduino + Siemens c72
« Responder #17 em: 25 de Agosto de 2012, 02:16 »
Penso que o problema não é só esse porque as mensagens que recebeste estão incompletas. Não sei se o fiz da melhor forma, mas supostamente com o código que está em baixo se houver uma sms ele faz um delay de 2 segundos antes de a ler. Não sei se vai resolver, mas experimenta.

Código: [Seleccione]
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);

int ledPin = 13; //Used for DEBUG
char info[400];

char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU

char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU

char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS

void setup()
{
  pinMode(12,OUTPUT);
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  my.begin(19200);
  clear_SMS_Memory(); //Apagar SMS 1-30
  Serial.println("SMS apagados"); //DEBUG
  Serial.println("Inicio do Loop"); //DEBUG
}

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  my.println("AT+CMGR=1"); //ler mensagem na posição 1
  int index = 0;
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
  while (millis() < (startTime+1000)) //Timeout de 1s
  {
    if (my.available()>0){
      info[index] = my.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
  //Passou 1s
  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
  {
      delay(2000);
      my.println("AT+CMGR=1");
      index=0;
      startTime = millis();
       while (millis() < (startTime+1000)) //Timeout de 1s
  {
    if (my.available()>0){
      info[index] = my.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
      Serial.println("//Mensagem Recebida:"); //DEBUG
      Serial.println(String(info)); //DEBUG
      Serial.println("//Fim da Mensagem\\"); //DEBUG
      if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
      {
        Serial.println("Mensagem do admin");
         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(desligarluz))>0)
            { DesligarLuz();}
         else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
             {LigarRega(); }
         else if (String(info).indexOf(String(desligarrega))>0)
             {DesligarRega();}
      }
      else Serial.println("Mensagem de outra pessoa"); //DEBUG
     
      my.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (my.available()>0) my.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

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

void DesligarLuz()
{
    digitalWrite(12,LOW); //LED aceso
    Serial.println("Luz desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz desligada"); //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 DesligarRega()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Rega Desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Rega Desligada"); //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) {
          my.println(String(info));
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
}

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    my.print("AT+CMGD=");
    my.println(i);
    delay(100);
  }
  while (my.available()>0) my.read(); //Limpar resposta
}

#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)
{
  my.write(hexdump_a(byte));
  my.write(hexdump_b(byte));
}

String converterNumero(char *pho){
  char num[13];
  int data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      num[y]=(pho[y+1]);
      num[y+1]=(pho[y]);
    }
    num[y] = '\0';
  return num;
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      my.write(pho[y+1]);
      my.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;

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

 
  my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  my.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
  my.write(0x1A); // Ctrl+Z
  my.write(0x0D); // CR
  my.write(0x0A); // LF
  delay(5000);
}

eu não tive problema quando testei com o meu siemens. mas e uma questao de ele testar... agora faltava lhe la por o pin12 em output no void setup

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Arduino + Siemens c72
« Responder #18 em: 25 de Agosto de 2012, 02:19 »
Pois, mas as sms que o telemóvel envia para o arduino estão incompletas, se calhar por não terem sido ainda recebidas por inteiro e o arduino já as estar a ler (?). Daí ter posto o delay de 2 segundos se recebesse uma sms para a voltar a ler novamente passado 2 segundos. Assim se o problema for esse fica resolvido porque em 2 segundos a mensagem já é recebida completamente.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Arduino + Siemens c72
« Responder #19 em: 25 de Agosto de 2012, 02:22 »
rglove
Puseste o comando de ler a SMS duas vezes.
EDIT: Só agora vi o outro post. Ele pode testar das duas maneiras.

Talvez se possa resolver o problema aumentando o timeout. Aumentei de 1000 para 2000.
E pus o pino 12 como output.
Código: [Seleccione]
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);

int ledPin = 13; //Used for DEBUG
char info[400];

char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU

char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU

char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS

void setup()
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  pinMode(12,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  my.begin(19200);
  clear_SMS_Memory(); //Apagar SMS 1-30
  Serial.println("SMS apagados"); //DEBUG
  Serial.println("Inicio do Loop"); //DEBUG
}

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  my.println("AT+CMGR=1"); //ler mensagem na posição 1
  int index = 0;
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
  while (millis() < (startTime+2000)) //Timeout de 1s
  {
    if (my.available()>0){
      info[index] = my.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
  //Passou 1s
  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
  {
      Serial.println("//Mensagem Recebida:"); //DEBUG
      Serial.println(String(info)); //DEBUG
      Serial.println("//Fim da Mensagem\\"); //DEBUG
      if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
      {
        Serial.println("Mensagem do admin");
         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(desligarluz))>0)
            { DesligarLuz();}
         else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
             {LigarRega(); }
         else if (String(info).indexOf(String(desligarrega))>0)
             {DesligarRega();}
      }
      else Serial.println("Mensagem de outra pessoa"); //DEBUG
     
      my.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (my.available()>0) my.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

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

void DesligarLuz()
{
    digitalWrite(12,LOW); //LED aceso
    Serial.println("Luz desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz desligada"); //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 DesligarRega()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Rega Desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Rega Desligada"); //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) {
          my.println(String(info));
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
}

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    my.print("AT+CMGD=");
    my.println(i);
    delay(100);
  }
  while (my.available()>0) my.read(); //Limpar resposta
}

#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)
{
  my.write(hexdump_a(byte));
  my.write(hexdump_b(byte));
}

String converterNumero(char *pho){
  char num[13];
  int data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      num[y]=(pho[y+1]);
      num[y+1]=(pho[y]);
    }
    num[y] = '\0';
  return num;
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      my.write(pho[y+1]);
      my.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;

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

 
  my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  my.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
  my.write(0x1A); // Ctrl+Z
  my.write(0x0D); // CR
  my.write(0x0A); // LF
  delay(5000);
}

Põe aqui o que te aparece no serial monitor.
« Última modificação: 25 de Agosto de 2012, 02:24 por Pedrock »

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Arduino + Siemens c72
« Responder #20 em: 25 de Agosto de 2012, 02:26 »
Hmm, não tinha pensado dessa forma. Pensei que o problema é que o telemóvel estava a enviar a sms incompleta porque na altura em que o arduino pedia para ler ela estava incompleta. Então meti a ler 2 vezes, na primeira vez ele vê se recebe alguma sms e caso receba espera 2 segundos e volta a ler novamente. Assim se ela estivesse incompleta agora já está completa.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Arduino + Siemens c72
« Responder #21 em: 25 de Agosto de 2012, 02:33 »
Hmm, não tinha pensado dessa forma. Pensei que o problema é que o telemóvel estava a enviar a sms incompleta porque na altura em que o arduino pedia para ler ela estava incompleta. Então meti a ler 2 vezes, na primeira vez ele vê se recebe alguma sms e caso receba espera 2 segundos e volta a ler novamente. Assim se ela estivesse incompleta agora já está completa.
Não sei, até pode ser isso...
O estranho é que as duas mensagens ficaram cortadas no mesmo sítio, por isso desconfiei do timeout. Este telemóvel deve demorar mais tempo a enviar a resposta.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Arduino + Siemens c72
« Responder #22 em: 25 de Agosto de 2012, 02:40 »
Sim, se calhar tens razão e como funcionou com o r16 provavelmente o problema deve ser esse.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Arduino + Siemens c72
« Responder #23 em: 26 de Agosto de 2012, 01:05 »
obrigado pessoal, quanto ao copiar, xD lol, depois acertamos "contas" xD

Entretanto, testo o programa amanha, que hoje não tenho saldo, a minha namorada nao deixa mandar porque diz que estas coisas são inúteis e so ando a gastar tempo ... mulheres...

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Arduino + Siemens c72
« Responder #24 em: 26 de Agosto de 2012, 23:57 »
Led nao acende

resultado:

SMS apagados
Inicio do Loop
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,27
0791539126010000040C9153911614075600002180623222534009E97
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 1,,27
0791539126010000040C9153911614075600002180623222534009E9B
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Arduino + Siemens c72
« Responder #25 em: 27 de Agosto de 2012, 00:07 »
Led nao acende

resultado:

SMS apagados
Inicio do Loop
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,27
0791539126010000040C9153911614075600002180623222534009E97
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 1,,27
0791539126010000040C9153911614075600002180623222534009E9B
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada


tas a enviar a msg "ligar luz" com letras pequenas?


Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Arduino + Siemens c72
« Responder #26 em: 27 de Agosto de 2012, 00:13 »
tas a enviar a msg "ligar luz" com letras pequenas?
O problema não é esse.

Tentaste a minha solução ou a do rglove? Testa as duas se não o fizeste.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Arduino + Siemens c72
« Responder #27 em: 27 de Agosto de 2012, 00:36 »
Usei o codigo que o pedro postou

Código: [Seleccione]
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);

int ledPin = 13; //Used for DEBUG
char info[400];

char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU

char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU

char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS

void setup()
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  pinMode(12,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  my.begin(19200);
  clear_SMS_Memory(); //Apagar SMS 1-30
  Serial.println("SMS apagados"); //DEBUG
  Serial.println("Inicio do Loop"); //DEBUG
}

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  my.println("AT+CMGR=1"); //ler mensagem na posição 1
  int index = 0;
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
  while (millis() < (startTime+2000)) //Timeout de 1s
  {
    if (my.available()>0){
      info[index] = my.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
  //Passou 1s
  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
  {
      Serial.println("//Mensagem Recebida:"); //DEBUG
      Serial.println(String(info)); //DEBUG
      Serial.println("//Fim da Mensagem\\"); //DEBUG
      if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
      {
        Serial.println("Mensagem do admin");
         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(desligarluz))>0)
            { DesligarLuz();}
         else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
             {LigarRega(); }
         else if (String(info).indexOf(String(desligarrega))>0)
             {DesligarRega();}
      }
      else Serial.println("Mensagem de outra pessoa"); //DEBUG
     
      my.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (my.available()>0) my.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

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

void DesligarLuz()
{
    digitalWrite(12,LOW); //LED aceso
    Serial.println("Luz desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz desligada"); //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 DesligarRega()
{
    digitalWrite(ledPin,HIGH); //LED aceso
    Serial.println("Rega Desligada"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Rega Desligada"); //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) {
          my.println(String(info));
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
}

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    my.print("AT+CMGD=");
    my.println(i);
    delay(100);
  }
  while (my.available()>0) my.read(); //Limpar resposta
}

#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)
{
  my.write(hexdump_a(byte));
  my.write(hexdump_b(byte));
}

String converterNumero(char *pho){
  char num[13];
  int data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      num[y]=(pho[y+1]);
      num[y+1]=(pho[y]);
    }
    num[y] = '\0';
  return num;
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      my.write(pho[y+1]);
      my.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;

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

 
  my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  my.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
  my.write(0x1A); // Ctrl+Z
  my.write(0x0D); // CR
  my.write(0x0A); // LF
  delay(5000);
}

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Arduino + Siemens c72
« Responder #28 em: 27 de Agosto de 2012, 00:42 »
E o que apareceu no serial monitor foi o que postaste?
Se sim usa o meu e experimenta também.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Arduino + Siemens c72
« Responder #29 em: 27 de Agosto de 2012, 00:43 »
com o teu, recebo isto:

SMS apagados
Inicio do Loop
//Mensagem Recebida:


ERROR
AT+CMGR=1
39126010000040C9153911614075600002180720023554009E2A
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 1,,27
0791539126010000040C9153911614075600002180720023554009E3BK
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada