LusoRobótica - Robótica em Português

Electrónica => Electrónica Geral => Tópico iniciado por: joaopedrocmp em 22 de Agosto de 2012, 12:56

Título: Arduino + Siemens c72
Enviado por: joaopedrocmp em 22 de Agosto de 2012, 12:56
Boas pessoal,

No seguimento de um topico com o arduino e um siemens c75, decidi tentar alguma coisa mas com um c72, pelo que vi,o pinout é igual, mas tenho um problema, eu tenho um Arduino Dumileanove, logo so tem uma porta serial.

ENtretanto encontrei isto: https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino

Mas não estou a conseguir nenhum resultado.

Ajuda?
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 22 de Agosto de 2012, 13:26
Olá, podes utilizar uma biblioteca que se chama NewSoftSerial para criar outra porta Serial.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 22 de Agosto de 2012, 13:36
O arduino 1.01 vem com uma "softwareSerial" serve, ou émelhor a ke disseste?
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 22 de Agosto de 2012, 13:45
Não sei, experimenta. Eu tenho ideia que essa já não funciona e foi alterado o nome para NewSoftSerial, mas experimenta.
Título: Re: Arduino + Siemens c72
Enviado por: Pedrock em 22 de Agosto de 2012, 16:26
No Arduino 1.0, o SoftwareSerial foi substituído pelo NewSoftSerial.
Por isso, usa-se o SoftwareSerial.
Título: Re: Arduino + Siemens c72
Enviado por: iyahdub em 22 de Agosto de 2012, 18:57
Por coincidencia tenho um Siemens C72 com a mesma intencao.
Tive a sorte de encontrar um conector perfeito aqui, que e uma autentica breakout-board do conector (num gadget de carregar telemoveis mais antigos, com varios conectores tipo universal).
Mas ter tempo e que e de gesso.lol
Mantem o pessoal informado, sff.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 23 de Agosto de 2012, 01:53
Boas,

Eu nas ranhuras do carregador, meti fiador, entretanto meto foto.

Vou experimentar o newserial ;)
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 23 de Agosto de 2012, 03:19
Boas pessoal,

Usei este codigo, no 1.0 e no 0.23 e não respondeu nada. as ligações sao as seguintes:

Pin 1: vcc
Pin2:Gnd
Pin3:---------- 2.7K----------------- Pino 2 do arduino
Pin4------------2.7k------------------Pino3 do arduino
                  |
                  |---------    3.3k----------Gnd

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



/***********************************************************
*                  Setup                                   *
***********************************************************/
void setup() 
{
  pinMode(13,OUTPUT); // LED DEBUG
  //Serial -------------------------------------------------
  // Open serial communications and wait for port to open:
  Serial.begin(9600);  // DEBUG

  mySerial.begin(19200);

}


/***********************************************************
*                  LOOP                                    *
***********************************************************/
void loop() // run over and over
{

 if (mySerial.available())
      Serial.write(mySerial.read());
 if (Serial.available())
      mySerial.write(Serial.read());
      delay(2000);
}

Não apareceu nada.

Apenas o tlm liga a luz sempre que reinicio o programa
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 23 de Agosto de 2012, 04:04
Há uns tempos houve outra pessoa com o mesmo problema e este código funcionou. Experimenta:

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

char info[200];
int index = 0;
char inChar;

void setup() 
{
  Serial.begin(9600);
  mySerial.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) {
        mySerial.println(String(info));
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (mySerial.available()) Serial.write(mySerial.read());
}


Eu alterei para a biblioteca SoftwareSerial porque ao testar o código deu erro por causa da outra biblioteca (NewSoftSerial). Se calhar confundi as 2 e induzi em erro. De qualquer forma se não conseguires com a softwareSerial é só alterar.
Título: Re: Arduino + Siemens c72
Enviado por: Pedrock em 23 de Agosto de 2012, 11:55
A NewSoftSerial não vêm incluída na IDE, foi feita por alguém de fora, e foi introduzida no 1.0.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 24 de Agosto de 2012, 02:29
nada :(
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 24 de Agosto de 2012, 02:33
Usei este:

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

#define ledPin 13 //Used for DEBUG

void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  //Serial -------------------------------------------------
  // Open serial communications and wait for port to open:
  Serial.begin(9600);  // DEBUG
  my.begin(19200);
  delay(2000);
  my.println("AT");
}

void loop() // run over and over
{
  if (my.available()) Serial.write(my.read());
  }

Aparece:


AT
OK

:)
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 24 de Agosto de 2012, 02:36
Código: [Seleccione]
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

char info[200];
int index = 0;
char inChar;

void setup() 
{
  Serial.begin(9600);
  mySerial.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) {
        mySerial.println(String(info));
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (mySerial.available()) Serial.write(mySerial.read());
}

Se esse funcionou este que está em cima também devia funcionar. Tenta, abre o Serial Monitor e envia algum comando.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 24 de Agosto de 2012, 02:42
yaa, ta brutal. :P

Vou explorar os comandos :)

Obrigadão
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 25 de Agosto de 2012, 01:07
Nova duvida:

Copiei o codigo do outro topico para o c35 e adicionei o emulador da 2ª porta serial:

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

Entretanto, ao enviar sms para la, recebo isto:

Código: [Seleccione]
SMS apagados
Inicio do Loop
//Mensagem Recebida:

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

+CMGR: 1,,27
0791539111161616240C9153913141428500002180520045014009EFB

//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada

E o Led 12, não fica aceso.
Título: Re: Arduino + Siemens c72
Enviado por: r16 em 25 de Agosto de 2012, 01:56
ola seu copião  :D

tenta isto

no void setup
pinMode(12,OUTPUT);
Título: Re: Arduino + Siemens c72
Enviado por: rglove 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);
}
Título: Re: Arduino + Siemens c72
Enviado por: r16 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
Título: Re: Arduino + Siemens c72
Enviado por: rglove 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.
Título: Re: Arduino + Siemens c72
Enviado por: Pedrock 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.
Título: Re: Arduino + Siemens c72
Enviado por: rglove 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.
Título: Re: Arduino + Siemens c72
Enviado por: Pedrock 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.
Título: Re: Arduino + Siemens c72
Enviado por: rglove 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.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp 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...
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp 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
Título: Re: Arduino + Siemens c72
Enviado por: r16 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?

Título: Re: Arduino + Siemens c72
Enviado por: Pedrock 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.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp 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);
}
Título: Re: Arduino + Siemens c72
Enviado por: rglove 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.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp 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
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 27 de Agosto de 2012, 01:02
Aumentei o delay, experimenta, mas acho que não tem nada haver com isso.
Experimenta também aumentar mais um bocado o timeout no código do Pedrorock. Já experimentaste meter aquele primeiro código e ler as mensagens com o código só para confirmar que as lês como deve ser?


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(5000);
      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);
}
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 28 de Agosto de 2012, 00:21
experimentei um codigo que espera por comandos via serial...
fiz AT, e respondeu ok. ler sms não experimentei.

Amanha ja faço isso, e ja experimento esse codigo, quanto ao outro, ja pus 5000 de timeout e nada.
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 28 de Agosto de 2012, 00:31
Quando puderes experimenta ler uma sms pelo serial monitor com os comandos AT e vê se a mensagem é lida assim.
Título: Re: Arduino + Siemens c72
Enviado por: iyahdub em 28 de Agosto de 2012, 00:41
Ja agora, um PDF com comandos AT especificos da siemens... Espero que ajude alguem !!
http://abs.misto.cz/_MAIL_/kabely/siemensat.pdf (http://abs.misto.cz/_MAIL_/kabely/siemensat.pdf)

Nokia at comandos
http://nds1.nokia.com/phones/files/guides/Nokia_AThelp.pdf (http://nds1.nokia.com/phones/files/guides/Nokia_AThelp.pdf)

Modems com sms compatibilidade
http://www.developershome.com/sms/checkCommandSupport.asp (http://www.developershome.com/sms/checkCommandSupport.asp)

SMS em formato PDU
http://www.blogelectronica.com/sms-pdu/ (http://www.blogelectronica.com/sms-pdu/)

http://www.gsm-modem.de/sms-pdu-mode.html (http://www.gsm-modem.de/sms-pdu-mode.html)

gprs
http://www.alsitel.com/tecnico/gprs/protocolo.htm (http://www.alsitel.com/tecnico/gprs/protocolo.htm)
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 28 de Agosto de 2012, 10:16
Boas,

Enviei um comando para ler a 2º sms da memoria, e apareceu isto:

OK
AT+CMGR=2

+CMGR: 0,,27
0791539126010000040C9153914270806300002180829095044C

 >:(

Fogo...
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 28 de Agosto de 2012, 11:27
A mensagem está em branco. Era isso que tinhas enviado?
Se não era isso acho que o problema está no telemóvel...
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 28 de Agosto de 2012, 11:29
não, a sms guardada diz: ligar luz

ja experimentei com outro remetente e outra posição na memoria, mas da sempre igual, o corpo da mensagem vazio

configurações do tlm, ou é problema de junta?
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 28 de Agosto de 2012, 11:39
Já viste se os comandos para esse telemóvel são os mesmos? É esquesito isso.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 28 de Agosto de 2012, 11:40
Não, mas testei outros comandos da lista que saquei, e estavam todos a resp "OK"
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 28 de Agosto de 2012, 11:58
No telemóvel a mensagem aparece certa?
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 28 de Agosto de 2012, 12:00
Sim,

Vou experimentar enviar sms por comandos, para ver o ke aparece
Título: Re: Arduino + Siemens c72
Enviado por: iyahdub em 28 de Agosto de 2012, 14:45
Ill try get some time to solder the conector and try it as well... Im curious now !!

PS- DEsculpem..O habito de escrever e falar em ingles e tao grande que me confundo as veze lol
Título: Re: Arduino + Siemens c72
Enviado por: Tyran em 28 de Agosto de 2012, 21:00
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.

cumps
Título: Re: Arduino + Siemens c72
Enviado por: Pedrock em 28 de Agosto de 2012, 21:20
É capaz de ser isso, Tyran.
No 35 não era preciso mas talvez seja preciso neste.
Podes tentar também AT+CMGF=0.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 29 de Agosto de 2012, 12:23
ou seja, antes de ler a mensagem mudo para o modo de texto?
Título: Re: Arduino + Siemens c72
Enviado por: rglove em 29 de Agosto de 2012, 12:48
Sim,experimenta.
Título: Re: Arduino + Siemens c72
Enviado por: Tyran em 30 de Agosto de 2012, 08:34
Antes ou caso não uses esse comando para mais nada, podes fazer isso no "setup". Já agora, já alguem usou gprs?
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 30 de Agosto de 2012, 11:38
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.

cumps

Boas, este comando da erro, possivelmente nao suporta
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 30 de Agosto de 2012, 11:40
É capaz de ser isso, Tyran.
No 35 não era preciso mas talvez seja preciso neste.
Podes tentar também AT+CMGF=0.

Este comando, responde OK, mas ao ler a sms, lê incompleta na msm
Título: Re: Arduino + Siemens c72
Enviado por: Tyran em 31 de Agosto de 2012, 12:26
Então lê o at command guide para esse módulo...
Título: Re: Arduino + Siemens c72
Enviado por: r16 em 31 de Agosto de 2012, 12:31
Então lê o at command guide para esse módulo...

Modulo?
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 31 de Agosto de 2012, 14:31
para o TLM que tenho, encontrei uma lista, (igual a uma postada na pag 3 acho)
Título: Re: Arduino + Siemens c72
Enviado por: Tyran em 31 de Agosto de 2012, 21:04
Então lê o at command guide para esse módulo...

Modulo?

sim... módulo gsm
Título: Re: Arduino + Siemens c72
Enviado por: r16 em 01 de Setembro de 2012, 14:21
Então lê o at command guide para esse módulo...

Modulo?

sim... módulo gsm

mas ele nao ta a usar nenhum modulo, esta a usar um telemovel siemens.
Título: Re: Arduino + Siemens c72
Enviado por: Tyran em 01 de Setembro de 2012, 20:31
Que deve ter lá dentro algum módulo gsm...
Título: Re: Arduino + Siemens c72
Enviado por: sergiotux em 19 de Outubro de 2012, 13:33
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.

cumps

Boas, este comando da erro, possivelmente nao suporta

Olá Joao, conseguil resolver o problema?
Acabo de comprar uma shild sim900 e estou tendo o mesmo problema.
Ao ler a mensagem (comando AT) ela vem apenas parte do texto.
Troquei de softwareserial para hardwareserial e funcinou bem.
Penso que seja algum problema com a libery SoftwareSerial.h (ou similar).

Se tiver novidades e puder me ajuda...agradeço.

Abraços a todos.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 20 de Outubro de 2012, 02:43
trocaste a library utilizada e funcionou bem? leu a sms toda?
Título: Re: Arduino + Siemens c72
Enviado por: sergiotux em 24 de Outubro de 2012, 21:46
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.

cumps

Boas, este comando da erro, possivelmente nao suporta

Olá Joao, conseguil resolver o problema?
Acabo de comprar uma shild sim900 e estou tendo o mesmo problema.
Ao ler a mensagem (comando AT) ela vem apenas parte do texto.
Troquei de softwareserial para hardwareserial e funcinou bem.
Penso que seja algum problema com a libery SoftwareSerial.h (ou similar).

Se tiver novidades e puder me ajuda...agradeço.

Abraços a todos.

Amigos, tudo perfeito, bastou eu baixar o baute rate para 4800 e tudo ok.

Abraços.
Título: Re: Arduino + Siemens c72
Enviado por: sergiotux em 24 de Outubro de 2012, 21:53
Por favor, estou começando a brincar com sms agora e esse código está me ajudando muito.
Obrigado.
Mas eu gostaria de saber qual é a vantagem ou necessidade de utilizar mensagens em PDU, porque não texto direto?

Obrigado

Sérgio
Título: Re: Arduino + Siemens c72
Enviado por: senso em 24 de Outubro de 2012, 21:55
Os telemoveis recebem as mensagens PDU, porque serve para as operadoras terem de enviar e receber menos dados, como a mensagem está no telemovel em PDU, tens de a receber em PDU, mas é relativamente facil de converter para ASCII.
Título: Re: Arduino + Siemens c72
Enviado por: sergiotux em 25 de Outubro de 2012, 12:30
Muito obrigado.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 25 de Dezembro de 2012, 20:58
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.

cumps

Boas, este comando da erro, possivelmente nao suporta

Olá Joao, conseguil resolver o problema?
Acabo de comprar uma shild sim900 e estou tendo o mesmo problema.
Ao ler a mensagem (comando AT) ela vem apenas parte do texto.
Troquei de softwareserial para hardwareserial e funcinou bem.
Penso que seja algum problema com a libery SoftwareSerial.h (ou similar).

Se tiver novidades e puder me ajuda...agradeço.

Abraços a todos.

Amigos, tudo perfeito, bastou eu baixar o baute rate para 4800 e tudo ok.

Abraços.

Boas, podes deixar um link para o download da library?
e que versão do ambiente de trabalho do arduino estas a usar?
Título: Re: Arduino + Siemens c72
Enviado por: dio123 em 16 de Janeiro de 2013, 21:26
Boa noite,

Acabei de comprar o siemens c62 e queria por a trabalhar com arduino. Uma vez que o c45 nao apanha rede.
Esquema:
telemovel pino 4 rx --- 2.7k ---  pino 2 arduino
                                |  - 3.3K --- GND

telemovel pino 3 tx --- 2.7k-----pino 3 arduino

Depois fiz upload deste codigo http://lusorobotica.com/index.php?topic=5258.msg58381#msg58381
 (http://lusorobotica.com/index.php?topic=5258.msg58381#msg58381)

Depois quando abro o serial monitor não aparece nada. O que está mal?
Título: Re: Arduino + Siemens c72
Enviado por: dio123 em 17 de Janeiro de 2013, 16:06
resolvi  o problema.
Acontece  que o meu antigo c45 era por controlo fluxo Hardware.
Ao que parece o c 62 controlo de fluxo hardware tem de estar desligado.

agora vou tentar repor o codigo segurança, o senhor que vendeu nao sabe.
Título: Re: Arduino + Siemens c72
Enviado por: joaopedrocmp em 05 de Abril de 2013, 02:49
Boas, alguem sabe como posso identificar e guardar numa variavel o numero de um remetente de uma sms?