collapse

* Posts Recentes

OpAmp Rail2Rail, 30V ... e mais umas coisinhas por SerraCabo
[Ontem às 22:52]


Por que nunca se deve confiar no que diz o cliente por jm_araujo
[28 de Novembro de 2021, 11:08]


Loja a EVITAR por dropes
[27 de Novembro de 2021, 19:35]


Projecto LED fundem por pouco funcionamento? por filjoa
[24 de Novembro de 2021, 10:45]


Um recurso muito completo com implementações de algoritmos. por blabla
[23 de Novembro de 2021, 12:04]


Como resolver "uhmmm" 50Hz Colunas de PC por dropes
[22 de Novembro de 2021, 14:12]


Software TV sala espera + Publicidades por m90mine
[19 de Novembro de 2021, 14:32]


Stenography - Using programming to save ancient writing method por blabla
[18 de Novembro de 2021, 13:55]


Identificador Via Verde por almamater
[15 de Novembro de 2021, 16:20]


Meu novo robô por josecarlos
[13 de Novembro de 2021, 12:12]

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

0 Membros e 2 Visitantes estão a ver este tópico.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #210 em: 19 de Agosto de 2012, 16:45 »
Usa este e diz me o que aparece no Serial Monitor:
Código: [Seleccione]
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] = "351964002176"; // Numero que recebe e envia 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");
  String adminPDU = converterNumero(numero);
  Serial.print("adminPDU=");
  Serial.println(adminPDU);
}

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(100);
  int index = 0;
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
  while (millis() < (startTime+1000)) //Timeout de 1s
  {
    if (Serial3.available()>0){
      info[index] = Serial3.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
  //Passou 1s
    Serial.println("//Recebido:"); //DEBUG
    Serial.println(String(info)); //DEBUG
    Serial.println("//Fim"); //DEBUG
  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
      String adminPDU = converterNumero(numero);
      if (String(info).indexOf(adminPDU)>0 && String(info).indexOf(adminPDU)<40) //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
     
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (Serial3.available()>0) Serial3.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

void LigarLuz()
{
    digitalWrite(ledPin,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(ledPin,HIGH); //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) {
          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);
  }
  while (Serial3.available()>0) Serial3.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)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

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

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 #211 em: 19 de Agosto de 2012, 16:50 »
Usa este e diz me o que aparece no Serial Monitor:
Código: [Seleccione]
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] = "351964002176"; // Numero que recebe e envia 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");
  String adminPDU = converterNumero(numero);
  Serial.print("adminPDU=");
  Serial.println(adminPDU);
}

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(100);
  int index = 0;
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
  while (millis() < (startTime+1000)) //Timeout de 1s
  {
    if (Serial3.available()>0){
      info[index] = Serial3.read(); //Ler
      index++; }
    //if (String(info).indexOf("OK")>0) break;
  }
  //Passou 1s
    Serial.println("//Recebido:"); //DEBUG
    Serial.println(String(info)); //DEBUG
    Serial.println("//Fim"); //DEBUG
  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
      String adminPDU = converterNumero(numero);
      if (String(info).indexOf(adminPDU)>0 && String(info).indexOf(adminPDU)<40) //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
     
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (Serial3.available()>0) Serial3.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

void LigarLuz()
{
    digitalWrite(ledPin,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(ledPin,HIGH); //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) {
          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);
  }
  while (Serial3.available()>0) Serial3.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)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

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

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


aparece esses caracteres malucos a seguir ao adminpdu;

Código: [Seleccione]
SMS apagados
adminPDU=539146001267ºê!!ë
//Recebido:

OK

//Fim
//Recebido:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim

queres que envie a msg a mesma ou nao vale a pena?

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #212 em: 19 de Agosto de 2012, 17:39 »
Não vale a pena. Já sei onde está o problema mas agora não estou em casa. Depois arranjo isso.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #213 em: 19 de Agosto de 2012, 18:53 »
Já está.
E só aparece alguma coisa no Serial quando receber uma mensagem.
Código: [Seleccione]
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] = "351964002176"; //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(19200);  // DEBUG
  Serial3.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
 
  Serial3.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 (Serial3.available()>0){
      info[index] = Serial3.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 && String(info).indexOf(adminPDU)<40) //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
     
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (Serial3.available()>0) Serial3.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

void LigarLuz()
{
    digitalWrite(ledPin,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(ledPin,HIGH); //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) {
          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);
  }
  while (Serial3.available()>0) Serial3.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)
{
  Serial3.write(hexdump_a(byte));
  Serial3.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)
    {
      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 #214 em: 19 de Agosto de 2012, 19:51 »
Já está.
E só aparece alguma coisa no Serial quando receber uma mensagem.
Código: [Seleccione]
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] = "351964002176"; //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(19200);  // DEBUG
  Serial3.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
 
  Serial3.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 (Serial3.available()>0){
      info[index] = Serial3.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 && String(info).indexOf(adminPDU)<40) //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
     
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      delay(1000);
      while (Serial3.available()>0) Serial3.read(); //Limpar resposta
      Serial.println("Mensagem Apagada");
      memset( &info, 0, sizeof(info) ); //Limpar array info
  }
}

void LigarLuz()
{
    digitalWrite(ledPin,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(ledPin,HIGH); //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) {
          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);
  }
  while (Serial3.available()>0) Serial3.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)
{
  Serial3.write(hexdump_a(byte));
  Serial3.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)
    {
      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 e apareceu isto:

Código: [Seleccione]
Inicio do Loop
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C9153914600126700002180919193654009ECF4392C07B1EB7A

OK

//Fim da Mensagem\
Mensagem de outra pessoa
Mensagem Apagada

enviei do meu numero.

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #215 em: 19 de Agosto de 2012, 20:32 »
Substitui:
if (String(info).indexOf(adminPDU)>0 && String(info).indexOf(adminPDU)<40)

Por:
if (String(info).indexOf(adminPDU)>0)

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #216 em: 19 de Agosto de 2012, 21:11 »
Substitui:
if (String(info).indexOf(adminPDU)>0 && String(info).indexOf(adminPDU)<40)

Por:
if (String(info).indexOf(adminPDU)>0)

Código: [Seleccione]
SMS apagados
Inicio do Loop
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,28
07915391131213F4040C915391460012670000218091024582400A2076FA1C9683D8753D

OK

//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #217 em: 19 de Agosto de 2012, 21:36 »
Acho que está a funcionar. Não deu porque meteste um espaço antes de "ligar luz". Tenta outra vez.

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #218 em: 19 de Agosto de 2012, 22:19 »
Bem observado. ta a funcionar sim :) vou fazer agora o video pra por no youtube

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #219 em: 19 de Agosto de 2012, 22:34 »
Bem observado. ta a funcionar sim :) vou fazer agora o video pra por no youtube
Ainda bem... :D
O ideal era filtrar esse tipo de coisas, mas não é fácil. É preciso um conversor PDU->Texto :-\

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #220 em: 19 de Agosto de 2012, 23:24 »
Bem observado. ta a funcionar sim :) vou fazer agora o video pra por no youtube
Ainda bem... :D
O ideal era filtrar esse tipo de coisas, mas não é fácil. É preciso um conversor PDU->Texto :-\

aqui esta:


Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #221 em: 20 de Agosto de 2012, 00:40 »
Já ví o vídeo. Muito bem detalhado! E obrigado pelos agradecimentos todos. :P

Comprei ontem um clone do Ethernet Shield. Quando o receber estou a pensar fazer uma coisa parecida, mas pela Internet. Como tenho internet no telemovel posso aceder à pagina sempre que quiser. Assim não preciso gastar dinheiro noutro cartão de telemovel.
Já estive a criar parte do HTML para o site. Quando tiver o shield e aquilo a funcionar, devo por um vídeo aqui no fórum também.  :)

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #222 em: 20 de Agosto de 2012, 00:43 »
Também já vi, parabéns, ficou porreiro :p
Este ano também vou começar um projecto e uma das partes vai ser exatamente o que tu fizeste ou parecido, sou capaz de aproveitar partes do código.

Cumprimentos

Offline r16

  • Mini Robot
  • *
  • Mensagens: 339
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #223 em: 20 de Agosto de 2012, 00:57 »
pedrock tambem tenho ethernet shield.. com chip wiznet5100 clone.

tenho um codigo a funcionar para ele que e o seguinte:

Código: [Seleccione]
#include <Ethernet.h>
#include <SPI.h>
/*
    Simple Ethernet Test
 
 Arduino server outputs simple text to browser
 
     The circuit:
     * Arduino Duemilanove
 * Arduino Ethernet shield
 * Basic FTDI breakout 5V
 *LED connected to GND and digital pin 4 via resistor
 
 By Minde
     http://www.sciencprog.com/
 */
 
Byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x49, 0xD6 };
Byte IP[]    = {192,168,1,70}; // IP address of WiShield
Byte gateway[]  = {192,168,1,254}; // router or gateway IP address
Byte subnet[] = {255,255,255,0};
 
String password= "12345"; // Altere sua senha
Int tries = 0; // tentativas ao digitar a senha
Boolean proceed = true; //Flag que permite a exibição DA página protegida
 
Server server(6969);        //server port
Int ledPin = 4;  // LED pin
Int LEDpin = 7;
String state = String(3);
Word Adc = 0;
String readString = String(30); //string for fetching data from address
Boolean LEDON = false; //LED status flag
 

Void Portada();
 

Void setup(){
  //start Ethernet
  Ethernet.begin(mac, IP, gateway, subnet);
  //Set pin 4 to output
  PinMode(LEDpin,OUTPUT);
 
  DigitalWrite(LEDpin,LOW);
  State = "OFF";
String state = String(3);
  //enable serial datada print
  Serial.begin(9600);
}
 

Void loop(){
  // Create a client connection
 
  Client client = server.available();
  If (client) {
    While (client.connected()){   
      Char c = client.read();
      If (readString.length() < 30){
         ReadString += c;
      }
      Serial.print(c);
      If (c == '\n') {     
        if(readString.trim() == ("GET /?pwd="+password+" HTTP/1.1")){
          //client.println("<h1>Clave Ok</h1>");
     Proceed = true;
          Portada();
       }else{
            //Pagina de login
            Client.println("HTTP/1.1 200 OK");
            Client.println("Content-Type: text/HTML; charset=utf-8");
            Client.println();
            Client.println("<form action='./' method='get'>");
            Client.println("Senha: <input type='text' name='pwd' />");
            Client.println("<input type='submit' value='OK' />");
            Client.println("</form>");
            if(tries++ >0)
              Client.println("<small>senha incorreta!</small>");
       }     
   
   
       //client.println("HTTP/1.1 200 OK");
       //client.println("Content-Type: text/HTML");
       /*
       Client.println();
       Client.print("<body style=background-color:#ffffff>");     
 
       Client.println("<h1>Control de Acceso</h1>");       
       Client.println("<form method=get name=LED>");
       Client.println("<input type=""password"" name=C>");
     
     
       Client.println("<input type=submit value=submit></form>");
     
       */
       //clearing string for next read
       ReadString="";
       //stopping client
       Client.stop();     
    }
  }
}
}
 
 
 
Void Portada(){
  While(proceed){
  // Create a client connection
  Client client = server.available();
 
  Client.println("HTTP/1.1 200 OK");
  Client.println("Content-Type: text/HTML ; charset=utf-8");
  Client.println();
 
 If (client) {
    // an http request ends with a blank line
    Boolean currentLineIsBlank = true;
    Client.println("<form  method=get name=form>");
    While (client.connected()) {
      If (client.available()) {
        Char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
 
        If (readString.length() < 30) {
          ReadString.concat(c);
        }
 
        If (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          Int LED = readString.indexOf("LED=");
 
          If (readString.substring(LED,LED+5) == "LED=T") {
            DigitalWrite(LEDpin,HIGH);
            State = "ON";
          }
          Else if (readString.substring(LED,LED+5) == "LED=F") {
            DigitalWrite(LEDpin,LOW);
            State = "OFF";
          }
 
            Int MODO = readString.indexOf("auth=");
            If (readString.substring(MODO,MODO+11) == "auth=logoff") {
              Proceed = false;
              Serial.println("Proceed false");
              Tries=-1;
              Client.println("<center><h5><a href=\"./?auth=login\"\"> Você fez Logoff. Clique para voltar.</a></h5></center></form>");
              break;
            }
 

         
          client.println("<img src='http://dl.dropbox.com/u/6916111/tvoff.png' style=\"position:fixed;left:68px;top:80px;width:636px;height:431px;z-index:1;padding:0;\">");
          if (state == "ON") { 
       //   client.print("TESTE ");       
          client.println("<img src='http://dl.dropbox.com/u/6916111/tvon.png' type='image' style=\"position:fixed;left:254px;top:146px;width:146px;height:93px;z-index:2;padding:0;\">");
          client.println("<a href=\"./?LED=F\" src='http://dl.dropbox.com/u/6916111/off.png' type='image' style=\"position:fixed;left:254px;top:146px;width:146px;height:93px;z-index:2;padding:0;\">");
   }
   
  else {
  client.println("<img src='http://dl.dropbox.com/u/6916111/off.png' type='image' style=\"position:fixed;left:254px;top:146px;width:146px;height:93px;z-index:2;padding:0;\">");
          client.println("<a href=\"./?LED=T\" src='http://dl.dropbox.com/u/6916111/tvon.png' type='image' style=\"position:fixed;left:254px;top:146px;width:146px;height:93px;z-index:2;padding:0;\">");
   }
 
          //client.print("LED is ");
         // client.print(state);
         client.print("<br><br>");
         client.println("<a href=\"./?auth=logoff\"\">[Logoff]</a>");   
         client.println("</form>");
         
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    readString = "";
    // close the connection:
    client.stop();
     }
      }
}
 
 

este codigo cria automaticamente na memoria do arduino uma pagina html...

eu usei uma imagem de fundo...que continha uma sala com uma televisao na parede.

depois como ves ai no codigo  tem outra imagem de uma televisao apagada que se sobrepoe em cima da tv acessa da imagem original.

depois tem outra imagem com a tv acessa que se sobrepoe a imagem da tv apagada que por sua vez ta por cima da imagem original.

confuso??

 ::)

Pronto na altura tinha so feito isto para um teste que funcionou bastante bem..

sempre que clicas na TV a imagem da tv aparece ligada... sempre que clicas novamente a imagem da tv aparece desligada.

PS: para entrares no site podes ver no codigo que e preciso uma password..

so tem um senao que eu nao consegui na altura descobrir que é_

imagina que o site é

meuarduino.blabla.pt

quando qualquer um acede a esse site... ele pede a password...

mas se tu por exemplo entrares no site... e alguem entrar ao mesmo tempo que tu...  consegue entrar sem pedir password.




imagem de fundo:


imagem da tv apagada:


imagem da tv acesa:


esta foi a forma mais facil e porreira, de eu poder personalizar o arduino e podelo controlar pela net...
podes usar as imagens que quiseres para um ON ou um OFF eu usei essa tv.

se fores por caminhos php... vais ter mt trabalho

:)

Ate amanha


Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
« Responder #224 em: 20 de Agosto de 2012, 01:06 »
Foi um desses clones com 5100 que comprei também.
Quanto a esse código, acho que me vai dar jeito, obrigado.
Não vou copiar, porque já tenho uma ideia de como se faz e existem exemplos, mas dá para tirar ideias e comparar. Essa ideia de aparecer a televisão desligada e ligada é muito interessante.
Quanto à password, já tinha pensado nisso, e também já tinha pensado que se fizesse isso duma certa forma ia ter esse problema de poder aceder sem password. Pode-se resolver o problema usando cookies. Como já disse, quando tiver isso ponho aqui no fórum.

Cumps.