LusoRobótica - Robótica em Português

Electrónica => Electrónica Geral => Tópico iniciado por: r16 em 11 de Agosto de 2012, 13:12

Título: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 13:12

VIDEO DO PROJECTO CONCLUIDO

http://youtu.be/R2tW8JVtEuE (http://youtu.be/R2tW8JVtEuE)




Viva comprei um C35I, para ligar ao arduino para que este reconheca os comados AT.
Certo porem tou com algumas dificuldades em saber como polo a funcionar , e tambem nas ligacoes que tenho que fazer.

Ora bem eu tenho a minha disposicao resistencias de:

3.3k
2.7k
12k
15k
18k

Eu estive a ver em varios sites como se fazia as ligacoes a ele.

Eu ja descobri o pinout do telemovel e tenho cabo de dados:
1   GND   -   Ground
2   SELF-SERVICE   in/out   Recognition/control battery charger
3   LOAD   in   Charging voltage
4   BATTERY   out   Battery (S25 only)
5   DATA OUT (TX)   out   Data sent
6   DATA IN (RX)   in   Data received
7   Z_CLK   -   Clock line for accessory bus. Use as DCD In data operation
8   Z_DATA   -   Data line for accessory bus. Use as CTS in data operation
9   MICG   -   Ground for microphone
10   MIC   in   Microphone input
11   AUD   out   Loudspeaker
12   AUDG   -   Ground for external speaker

A minha duvida é como montar o esquema na breadboard com as resistencias alguem me pode ajudar?


Encontrei este site mas ele funciona com um siemens c75 logo as ligacoes nao sao iguais nem o pinout:

https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino (https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino)

No entanto tambem descobri este site:
http://www.embeddedrelated.com/groups/basicx/show/22276.php (http://www.embeddedrelated.com/groups/basicx/show/22276.php)

onde aqui fala de ligar uma resistencia de 12k ao tx e 18k ao rx e ao gnd..se nao efectuar estas ligacoes ja verifiquei que o tlm fica sem apanhar rede pois ele trabalho abaixo dos 5v.

Tou muito confuso se algume me poder ajudar agradecia.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 14:58
Tens que fazer divisões de voltagem com as resistências.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 15:20
Como sei como fazer isso? Podes ser mais explicito sff.

Posso te dar mais dados, precisas dos dados da bateria do telemovel? do carregador?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: pmj_pedro em 11 de Agosto de 2012, 15:27
Como sei como fazer isso? Podes ser mais explicito sff.

Posso te dar mais dados, precisas dos dados da bateria do telemovel? do carregador?

http://en.wikipedia.org/wiki/Voltage_divider#Resistive_divider (http://en.wikipedia.org/wiki/Voltage_divider#Resistive_divider)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 15:34
Agradeço as respostas mas as tuas mantem-se, pois não sei como calcular esse valor resistivo,, que dados uso?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 15:45
Vê a página que o pmj_pedro postou.

Vout = R2 / (R1+R2) * Vin
Substituindo:
3 = 18000 / (12000 + 18000) * 5
3 = 3

Usei os valores daquele site que encontraste, mas podiam ser calculados.
Agora é só montares o esquema que está na página da wikipédia e usas R1 de 12k ohm e R2 de 18k ohm.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 16:14
ok segundo aqui o rapaz que usa tambem um c35:

ele diz:
"I figured it out, solved the problem doing a voltage divider with a 12K
resistor between basic TX and cellphone RX and another 18K resistor between
cellphone RX and GND."

Segundo o desenho indicado por vós

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fd%2Fdb%2FResistive_divider.png&hash=840944573b0741a11c6268cf2519865272b308ff)

R1 = 12k
R2 = 18k

TX pino 3 do Arduino
RX pino 2 do Arduino

Fio azul que vem do telemovel TX
Fio Amarelo que vem do telemovel RX

Portanto ai nesse esquema onde diz Vin e Vout onde ligo o fio azul e amarelo que vem do telemovel????

e depois onde ligo os fios do tx e rx que vão para o arduino????
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 16:39
TX significa transmição e RX recepção.

O pino 0 do arduino é o RX e o 1 é o TX.

Tens de ligar TX com RX e RX com TX.

Como o arduino fornece 5v e o telemóvel recebe 3v, usas o divisor de tensão para passar os 5v do TX do arduino para 3v no RX do telemóvel. O TX do telemóvel acho que ligas diretamente ao RX do arduino.

E parece que esse que usou o C35 tem um site com alguma informação:
http://alumni.ipt.pt/~pmad/gsm_alarm.php (http://alumni.ipt.pt/~pmad/gsm_alarm.php)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 16:53
Este codigo aqui da para eu testar se os comandos ATestao a funcionar bem?

Acho que é preciso colocar esse INT
em estado=3

e depois basta escrever no serial monitor AT??

Código: [Seleccione]
/***********************************************************
*                  SMS Alarm 
    This Software uses Arduino connected to a mobile phone(SIEMENS C75)
    and it sends a SMS when a certain amount of light is off (LDR) and it sends
    another (SMS) after light values are restored.
   
    Copyright (C) 2012  Carlos Oliveira

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
***********************************************************/
/*
HARDWARE SETUP

13 -Led pin Debug 13 (used for status)
A2 -Analog input A2 (Light Sensor LDR)
2 -RX (phone) 2
3 -TX (phone) 3
 
 */
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3


/***********************************************************
*                  PDU encoder setup       
*  Copyright (C) 2010  Daniel Richman
***********************************************************/
/* From hexdump.h ALIEN Project Daniel Richman */
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
/* To select the 4 bits we do this */
#define first_four(byte)       (0x0F & (byte))

/* Last four: Shift left to get to a number < 16 */
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)

/* The MSB goes first. */
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))
/*
 */
//**********************************************************
// End of PDU encoder setup

//init
SoftwareSerial phone=SoftwareSerial(rxPin, txPin);
int ledPin = 13; //Used for DEBUG
int sensorPin = A2; 
int sensorValue = 0;
int estado=0;
//estado=3 for testing serial communication with mobile
boolean flagLUZoff=false;
boolean flagSMS=false;

/***********************************************************
*                  Setup                                   *
***********************************************************/
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  //Serial -------------------------------------------------
  // Open serial communications and wait for port to open:
  Serial.begin(9600);  // DEBUG
  while (!Serial) {;
  // wait for serial port toconnect.Needed for Leonardo only
  }

  //C75 init ----------------------------------------------
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  phone.begin(9600);

}


/***********************************************************
*                  LOOP                                    *
***********************************************************/
void loop() // run over and over
{
  automatoMain();
}

/***********************************************************
*                  Automato                                *
***********************************************************/

void automatoMain() {

  switch(estado) {
  case 0://check light value
    digitalWrite(ledPin, HIGH); 
    delay(1000);   
    sensorValue = analogRead(sensorPin);
    digitalWrite(ledPin, LOW);
    delay(1000);
    if (sensorValue < 900){
      flagLUZoff=true;
      estado=1;
    }
    else{
      flagLUZoff=false;
      estado=2;
    }

    break;

  case 1:// SMS send Light OFF
    delay(1000);
    if(flagLUZoff && !flagSMS){
    Serial.println("Sending SMS light is OFF"); // DEBUG
    send_sms("351969999999","Light is OFF!");
    flagSMS=true;
    }
    delay(1000);
    estado=0;
    break;

  case 2:// SMS send Light ON
    if(!flagLUZoff && flagSMS){
    Serial.println("Sending SMS light is ON"); // DEBUG
    send_sms("351969999999","Light is ON!");
    flagSMS=false;
    }   
    delay(1000);
    estado=0;
    break;

  case 3://Phone communication tests (via Serial COM)
    if (phone.available())
      Serial.write(phone.read());
    if (Serial.available())
      phone.write(Serial.read());

    break;

  default:
    break;
  }
}

/***********************************************************
*                  SMS PDU encript 

    This part of the code is not written by me, nevertheless I had to
    change some parts (documented) in order to work correctly under
    Arduino V1.0. And also I added a converter function for the phone
    number, but only works for phone number with 12 digits.
   
    code was taken from Tim Zaman site:
    ([url=http://www.timzaman.nl/?p=47&lang=en]http://www.timzaman.nl/?p=47&lang=en[/url])
   
    **********************************************************
   
    Copyright (C) 2010  Daniel Richman (/Timbobel) (/Oliveira)
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    For a full copy of the GNU General Public License,
    see . <http://www.gnu.org/licenses/>.
*
***********************************************************/
void hexdump_byte(unsigned char byte)
{
  phone.write(hexdump_a(byte));
  phone.write(hexdump_b(byte));
}

/***********************************************************
*                  convert Phone   (C.Oliveira)                        *
*this only works if your phone number has 12 digits, if not*
*use the old conversion method                             *
***********************************************************/
void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      phone.write(pho[y+1]);
      phone.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;

  phone.println("AT+CMGF=0");
  delay(1500);
  phone.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  phone.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 
/* Phone number is hardcoded if digits diferent from 12
   [url=http://twit88.com/home/utility/sms-pdu-encode-decode]http://twit88.com/home/utility/sms-pdu-encode-decode[/url]
  use the utility to convert into pdu format, just fullfil
  the receiver number and press convert button.
  Hexadecimal PDU Message
  below the example for: 351987654321
  output:
  AT+CMGW=14  <--- size of, use above
  0011000C915391785634120000AA
  */
  // phone.print("0011000C915391785634120000AA"); // mobile: 351987654321 OLD METHOD for phones with digits !=12
 
  phone.print("0011000C91"); // using the convertPhone function , for phones # with digits =12       
  convertPhone(recPhone);
  phone.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
  phone.write(0x1A); // Ctrl+Z
  phone.write(0x0D); // CR
  phone.write(0x0A); // LF
  delay(5000);
 
}

https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino (https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 17:10
Com esse código, se tirares o comentário ("//") do estado =3, o código fica à espera que envies algo pelo serial para o arduino, que depois é enviado para o telemóvel.
E liga os pinos desta forma:
2 do arduino ao TX do telemóvel
3 do arduino ao RX do telemóvel

EDIT:
Não te esqueças do divisor de voltagem entre o pino 3 e o RX e é preciso colocar uma resistência para limitar a currente entre o pino 2 e o TX.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 17:36
Bom liguei tudo como esta aqui excepto as resistencias que tao ai na linha roxa onde pus as minhas de 12k e 18k, de resto ta igualzinho.

Mudei aquilo para o estado 3.

E quando envio do serial monitor o comando AT, tal como explica aqui:

1- Send:  AT , received OK , it works!
2- Check the SMS format  (page 27 from AT reference pdf)  , only show a 0, it means that only supports PDU.
3- Just to be sure tried to force Text , but ERROR was received.

Código: [Seleccione]
AT
OK

AT+CMGF?
+CMGF: 0
OK

AT+CMGF=1
ERROR



Simplesmente nao aparece nada no serial monitor

  :( :( :( :( :( :( :(


PS: nesse site onde tirei esse codigo o rapaz usa um siemens c75 e usou um outro fio que é o:
CTS

Siemens C75 used pinout:
 > Vbatt - Power Charging (used for charging).
 > Gnd - GND  (main ground).
 > Tx   connected to arduino RX (using a resistor to limit current ).
 > Rx  connected to arduino TX (using a voltage devider from 5v to ~2,75v).
 > CTS  need to be connected to ground in order to work

eu tambem liguei o meu pinout

7   Z_CLK   -   Clock line for accessory bus. Use as DCD In data operation
8   Z_DATA   -   Data line for accessory bus. Use as CTS in data operation

8 mesmo a massa mas mesmo assim nao da.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: dropes em 11 de Agosto de 2012, 17:50
Desculpa a intromissão, para inserir código é no sinal # das mensagens e evitam-se listagens grandes assim como símbolos mal interpretados tipo " if (l >= 8)"
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 18:20
Copia o código que tens no arduino e põe aqui.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 19:33
Aqui esta ele se houver um outro mais facil..era melhor, mas nao encontrei.
Como podes ver o estado ta em 3


Código: [Seleccione]
/***********************************************************
*                  SMS Alarm 
    This Software uses Arduino connected to a mobile phone(SIEMENS C75)
    and it sends a SMS when a certain amount of light is off (LDR) and it sends
    another (SMS) after light values are restored.
   
    Copyright (C) 2012  Carlos Oliveira

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
***********************************************************/
/*
HARDWARE SETUP

13 -Led pin Debug 13 (used for status)
A2 -Analog input A2 (Light Sensor LDR)
2 -RX (phone) 2
3 -TX (phone) 3
 
 */
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3


/***********************************************************
*                  PDU encoder setup       
*  Copyright (C) 2010  Daniel Richman (more in the function)
***********************************************************/
/* From hexdump.h ALIEN Project Daniel Richman */
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
/* To select the 4 bits we do this */
#define first_four(byte)       (0x0F & (byte))

/* Last four: Shift left to get to a number < 16 */
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)

/* The MSB goes first. */
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))
/*
 */
//**********************************************************
// End of PDU encoder setup

//init
SoftwareSerial phone=SoftwareSerial(rxPin, txPin);
int ledPin = 13; //Used for DEBUG
int sensorPin = A2; 
int sensorValue = 0;
int estado=3;
//estado=3 for testing serial communication with mobile;
boolean flagLUZoff=false;
boolean flagSMS=false;

/***********************************************************
*                  Setup                                   *
***********************************************************/
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  //Serial -------------------------------------------------
  // Open serial communications and wait for port to open:
  Serial.begin(9600);  // DEBUG
  while (!Serial) {;
  // wait for serial port toconnect.Needed for Leonardo only
  }

  //C75 init ----------------------------------------------
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  phone.begin(9600);

}


/***********************************************************
*                  LOOP                                    *
***********************************************************/
void loop() // run over and over
{
  automatoMain();
}

/***********************************************************
*                  Automato                                *
***********************************************************/

void automatoMain() {

  switch(estado) {
  case 0://check light value
    digitalWrite(ledPin, HIGH); 
    delay(1000);   
    sensorValue = analogRead(sensorPin);
    digitalWrite(ledPin, LOW);
    delay(1000);
    if (sensorValue < 900){
      flagLUZoff=true;
      estado=1;
    }
    else{
      flagLUZoff=false;
      estado=2;
    }

    break;

  case 1:// SMS send Light OFF
    delay(1000);
    if(flagLUZoff && !flagSMS){
    Serial.println("Sending SMS light is OFF"); // DEBUG
    send_sms("351964002176","Light is OFF!");
    flagSMS=true;
    }
    delay(1000);
    estado=0;
    break;

  case 2:// SMS send Light ON
    if(!flagLUZoff && flagSMS){
    Serial.println("Sending SMS light is ON"); // DEBUG
    send_sms("351969999999","Light is ON!");
    flagSMS=false;
    }   
    delay(1000);
    estado=0;
    break;

  case 3://Phone communication tests (via Serial COM)
    if (phone.available())
      Serial.write(phone.read());
    if (Serial.available())
      phone.write(Serial.read());

    break;

  default:
    break;
  }
}

/***********************************************************
*                  SMS PDU encript 

    This part of the code is not written by me, nevertheless I had to
    change some parts (documented) in order to work correctly under
    Arduino V1.0. And also I added a converter function for the phone
    number, but only works for phone number with 12 digits.
   
    code was taken from Tim Zaman site:
    (http://www.timzaman.nl/?p=47&lang=en)
   
    **********************************************************
   
    Copyright (C) 2010  Daniel Richman (/Timbobel) (/Oliveira)
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    For a full copy of the GNU General Public License,
    see . <http://www.gnu.org/licenses/>.
*
***********************************************************/
void hexdump_byte(unsigned char byte)
{
  phone.write(hexdump_a(byte));
  phone.write(hexdump_b(byte));
}

/***********************************************************
*                  convert Phone   (C.Oliveira)                        *
*this only works if your phone number has 12 digits, if not*
*use the old conversion method                             *
***********************************************************/
void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      phone.write(pho[y+1]);
      phone.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;

  phone.println("AT+CMGF=0");
  delay(1500);
  phone.print("AT+CMGS="); // Send SMS Comand
  //phone.print("AT+CMGW=");  //Send SMS to mobile draft folder (DEBUG)
  delay(1500);
  phone.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
  delay(1500);
 
/* Phone number is hardcoded if digits diferent from 12
   http://twit88.com/home/utility/sms-pdu-encode-decode
  use the utility to convert into pdu format, just fullfil
  the receiver number and press convert button.
  Hexadecimal PDU Message
  below the example for: 351987654321
  output:
  AT+CMGW=14  <--- size of, use above
  0011000C915391785634120000AA
  */
  // phone.print("0011000C915391785634120000AA"); // mobile: 351987654321 OLD METHOD for phones with digits !=12
 
  phone.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  phone.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
  phone.write(0x1A); // Ctrl+Z
  phone.write(0x0D); // CR
  phone.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 20:05
Para fazer esses testes basta este código:
Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
2 -RX (phone) 2
3 -TX (phone) 3
*/

#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3

#define ledPin 13 //Used for DEBUG

SoftwareSerial phone = SoftwareSerial(rxPin, txPin);

void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  //Serial -------------------------------------------------
  // Open serial communications and wait for port to open:
  Serial.begin(9600);  // DEBUG
  while (!Serial) {;
  // wait for serial port to connect.Needed for Leonardo only
  }
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  phone.begin(9600);
}

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

Mas não vai fazer diferença. Acho que o problema não está no código e sim no hardware.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 20:55
Pois sinceramente nao entendo o que possa estar a ocorrer ja montei a breadboard 4 vezes, podera ser que estas resistencias nao sejam indicadas ou que me falte ligar algum fio.

Ha pouca informacao sobre este equipamento, quis comprar um telemovel barato para nao comprar um gsm shield... para agora acontecer isto...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 21:34
Tens o sinal que vai do TX do telemóvel ligado diretamente ao arduino? Senão, tenta ligar diretamente. E põe o pino TX em HIGH e vê se a saída do divisor de voltagem tem 3.3v com um multímetro.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 21:59
O fio tx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

coloquei o pino do tx DO ARDUINO em high  e dame o valor 0.33                                                                                                                       
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 22:04
Ou mediste mal ou o divisor está mal feito.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 22:14
Quanto deveria medir?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 11 de Agosto de 2012, 22:44
3.3v
Mas deve estar certo. O milímetro divide por 10.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 22:52
Bom neste caso so me resta lhe dar mesmo com o Martelo. Pois nao tenho conhecimentos mais técnicos para saber como por isto a funcionar.

Ate ja cheguei ao ponto de pensar em abrir o telemovel e soldar os fios directamente nos pinos.

outra coisa que verifiquei no arduino 1.0 e que no codigo nesta linha:

#include <SoftwareSerial.h>

o softwareserial nao esta em cor de vinho...

e no arduino oo23 esta, mas no arduino 0023 nao da para compilar...

tera alguma coisa a ver?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 11 de Agosto de 2012, 23:16
O IDE do Arduino 1.0 já tem uma biblioteca de serial por software, até tem exemplos de como a usar.
Tens a massa do Arduino ligada á massa do telemovel?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 11 de Agosto de 2012, 23:22
Senso as minhas ligacoes estao assim:

(https://08289a60-a-62cb3a1a-s-sites.googlegroups.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino/friEsquema.png?attachauth=ANoY7cosNTm7goUTPBY5d39qwYC1bfbCrjEkGobuW7FzpjuopVg3001-LI93iLSpx-3brSrxHRtvmh9LiciX6lWb32zb2SivMjIMZ-2KaBQk0pcUqud9wAl77t7-ip0FogvxEB2ufxhcTNSemTuk2HevvTiRtF4NjKuCDtjYbowtJDybzhRz3WM1JIQmFMue7meSgpcG9qWVKUAWK_hBFrZGXeq_bKSDbqLX64i2klYBZhoIsI3KdvYr2LCzUUVLTws5ir2q8k0I3fB1kFWZhH2ZX8Jo2LR0sg%3D%3D&attredirects=0)




so que nessa linha lilás a resistencia que liga a massa é de 18k e a outra que ta na horinzontal e de 12k, estas sao as que uso mas tambem ja usei as que tao ai tal e qual no desenho.


agora nao sei se esse pin CTS tem que tar ligado a massa se nao , eu tenho, ja o liguei e ja o desliguei mas nao faz nada...

se a imagem nao abriu o esquema e este:

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


PS: so nao tenho o vcc do telemovel ligado a nada...nao e preciso pois nao?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 00:32
Eu acho que a biblioteca SoftwareSerial foi actualizada e agora se chama NewSoftSerial. E esta funciona com o arduino 1.0. Pelo menos também não consegui usar a SoftwareSerial e descobri a NewSoftSerial.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 16:00
Pois, mas ha outra coisa estranha que me esqueci de mencionar eu estou a usar um arduino mega2560, e tenho o tx e o rx no pino 2 e 3...

mas agora tou a olhar para o arduino e ele tem varias portas que diz tx e rx...
iso tera alguma coisa a ver'????
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 16:22
O arduino mega tem 4 portas Serial, por isso tens 8 pinos para a comunicação serial. Com essa biblioteca podes usar quase todos os pinos para comunicar via serial. Não percebi bem o que disseste, mas podes usar qualquer pino desde que com a biblioteca os identifiques como rx e tx.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 16:30
o que quis dizer foi que neste codigo aqui:

Código: [Seleccione]
HARDWARE SETUP

13 -Led pin Debug 13 (used for status)
A2 -Analog input A2 (Light Sensor LDR)
2 -RX (phone) 2
3 -TX (phone) 3
 
 */
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3

o rapaz usa o pino 2 e 3 mas no meu arduino mega o pino 2 e 3 nao tem la escrito tx nem tx, so tem no pino 14 15 16 17 18 0 1
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 16:48
Sim, foi o que disse, ele não utiliza os pinos reservados para a comunicação serial, provavelmente porque não usou um arduino mega, mas sim um uno. Como o uno só tem capacidade para 1 ligação serial que estava a ser utilizada para comunicar com o computador ele usou uma biblioteca que foi a tal que te disse para usar outros pinos para a comunicação e nesse caso ele escolheu o 2 e o 3, mas poderia ter escolhido outros. Como vais usar um mega nem precisas de usar a biblioteca visto que tens a possibilidade de ter 4 ligações serial, percebes?

Cumprimentos
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 16:54
Porque ele nao usou o pino 0 e o 1? o arduino uno tem la o RX e o TX nesses pinos.
Que raio de confusao.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 17:14
Porque nesse caso ele quer comunicar tanto com o computador como também com o telemóvel. Então utilizou outros 2 pinos para comunicar com o telemóvel e deixou os pinos 0 e 1 para a comunicação com o computador. Visto que o computador está ligado pelo cabo usb ao arduino não há cabos conectados aos pinos 0 e 1, mas os pinos são utilizados na mesma. O arduino uno tem 1 porta Serial (pinos 0 e 1) e o mega tem 4. Como o uno estava a usar a única porta que tem para comunicar com o computador (pelo cabo usb) ele usou a biblioteca para poder "criar" outra porta serial e assim poder comunicar com o telemóvel. Escolheu para o efeito os pinos 2 e 3, como podia ter escolhido outros (atenção que não dão todos).
Com o arduino mega podes apagar a linha em que ele declara a porta serial e podes usar os pinos rx3 e tx3 por exemplo para enviar os comandos AT para o telemóvel. Não há diferença nenhuma no código, simplesmente apagas aquela linha e substituis o nome que ele deu à ligação serial por Serial3. Caso uses os pinos rx2 e tx2 substituis por Serial2 e o mesmo acontece para os rx1 e rx2 (Serial1). Os pinos rx0 e tx0 não os podes utilizar pois estes estão a ser usados para comunicar com o computador.

Não sei se me expliquei bem.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 17:22
Sim explicaste ok liguei agora o tx do telemovel ao rx3 do arduino e o rx do telemovel ao tx3 do arduino..

agora falas aqui desta linha é:
SoftwareSerial phone=SoftwareSerial(rxPin, txPin);

ou qual sao as que tas a falar? para eu as modificar.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 17:31
Para fazer esses testes basta este código:
Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#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
  Serial3.begin(9600);
}

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

Mas não vai fazer diferença. Acho que o problema não está no código e sim no hardware.

Já alterei o código para usares no mega. Faz o upload do código para o arduino e através do serial monitor que vem com o arduino ou com outro qualquer envias os comandos AT para o arduino que por sua vez envia para o telemóvel. Experimenta e diz se conseguiste.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 12 de Agosto de 2012, 17:42
Se tens um Arduino Mega não uses serial emulado em software, usa uma das portas serial nativas, em vez de fazeres Serial.begin fazer Serial1.begin ou Serial2.begin, é que é muito mais fiavel que usar emulações por software.
No Arduino Duemilanove/Uno não se usa tipicamente a porta serial por hardware, porque o mais certo é que interfere com a programação que é feita por Serial, e porque deixas de ter maneira de ter debug por serial.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 17:43
Compilei bem , abri o serial monitor escrevi AT nao aconteceu nada.

Tenho o tx do telemovel ligado directamente ao rx arduino.

O rx do telemovel ligado com uma resistencia de 12k e 18k para lhe dar 3v onde tenho ligado ao tx do arduino.

tenho a massa ligada a massa do arduino.

olhei para este projecto deste rapaz
http://lusorobotica.com/index.php?topic=4445.0 (http://lusorobotica.com/index.php?topic=4445.0)

ele tem um c45 que usa os mesmos pinouts que eu e ele conseguio por a funcionar, mas usou um diodo de zener de 3.3...sera que é isso que ta a falhar???
que desespero.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 17:47
Ligaste ao rx3 e ao tx3 ou ao rx e ao tx?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 12 de Agosto de 2012, 17:47
O Zener serve para limitar a voltagem a 3.3v, faz o mesmo que o divisor resistivo.
Tens o telemovel ligado e estava funciona?
Já viste se o cabo de dados não está partido?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 17:59
o telemovel funciona,,,comprei em segunda mao.

ele so trazia carregador o que eu fiz foi abrir o conector onde tem la o fio da corrente e da massa,,, e depois artesanalmente pus la mais dois fios,,, o do tx e do rx... e fiz soldei la mais um da massa para ligar a massa do arduino.

posso tirar uma foto
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 18:08
repararem noutra coisa... o rapaz que usa o siemens c45 tem no codigo dele:
http://lusorobotica.com/index.php?topic=4445.15 (http://lusorobotica.com/index.php?topic=4445.15)

Código: [Seleccione]
#include <NewSoftSerial.h>

const int PIN_RX = 9;
const int PIN_TX =10;

NewSoftSerial com(PIN_RX, PIN_TX);

void setup() {
  [b]com.begin(19200);[/b]
  delay(3000);
com.println("ATD12045");
}
void loop() {
}


19200 enquanto eu 9600 tera alguma coisa a ver??
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 18:20
Experimenta, pode ser que seja esse o problema.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 18:28
ja exprimentei e nada...

Alias agora com o codigo que me deste so agora e que eu vi....

o led que diz TX ta sempre a acesso..

e quando abro o serial monitor.... aquela barra ca em baixo ta sempre a andar po lado direito...sozinha



Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 12 de Agosto de 2012, 18:31
É porque está sempre a enviar dados para a porta serial.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 12 de Agosto de 2012, 18:35
Vê se no monitor tens o baud rate certo selecionado
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 18:40
Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#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
  Serial3.begin(9600);
}

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


tenho bem seleccionado 9600...
mesmo sem o telemovel la ligado o tx ta sempre fixo.. como pode isto tar a enviar dados...
 :o :-\
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 12 de Agosto de 2012, 18:47
Provavelmente os fios do Serial3 estão a flutuar sem nenhuma voltagem definida e o hardware de serial está simplesmente a ler ruido.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 18:53
e como se resolve isso?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 12 de Agosto de 2012, 22:33
Liga o telemovel, para estarem com sinais lógicos definidos.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 22:45
ok senso obrigado ja voltei a fazer todas as ligacoes de novo e agora ja nao fica o tx sempre aceso, tou a subir um video para o youtube pra voces verem.. se algo ta errado.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 23:08
Fica aqui um video que fiz para voces verem:

http://youtu.be/UYS7Dq1KLSs (http://youtu.be/UYS7Dq1KLSs)

esqueci me de dizer no video que agora, quando escrevo AT no serial monitor so o pino RX pisca laranja
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 12 de Agosto de 2012, 23:31
esqueci me de dizer no video que agora, quando escrevo AT no serial monitor so o pino RX pisca laranja

O led RX pisca porque o arduino recebeu dados do PC (o "AT").
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 23:35
qualquer coisa que eu escreva la ele pisca...

quanto ao AT ele nao me da nenhum OK.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 12 de Agosto de 2012, 23:37
É normal, o RX quer dizer que está a receber dados do pc e o TX quer dizer que está a enviar dados para o pc.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 12 de Agosto de 2012, 23:45
Bom sendo assim nada a fazer nao é? acho que esta tudo bem ligado. e visto que esse codigo que me deram tambem esta certo, se nao ja alguem tinha corrigido. acho que este telemovel nao da.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: msaleiro em 13 de Agosto de 2012, 00:00
Não tens nenhum cabo USB-TTL para ligares directamente o PC ao telemovel e fazeres os primeiros testes com os comandos AT? Uma vez já tive que fazer o mesmo mas com um siemens c55 e comecei assim para primeiro estabelecer a ligação e ver k os comandos AT estavam a funcionar como esperado. Depois de testares assim, passas para o arduino..
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 13 de Agosto de 2012, 00:01
Pode sempre tirar o atmega do arduino e usar o arduino como um adaptador usb-serial.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 00:05
Pode sempre tirar o atmega do arduino e usar o arduino como um adaptador usb-serial.
Ele não consegue tirar o atmega do mega.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: senso em 13 de Agosto de 2012, 00:06
Então, é meter um programa sem nada, ou seja abrir o exemplo BareMinimum, meter isso no Arduino e pode usar directamente como se um cabo usb-serial se trate.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 00:07
Não tens nenhum cabo USB-TTL para ligares directamente o PC ao telemovel e fazeres os primeiros testes com os comandos AT? Uma vez já tive que fazer o mesmo mas com um siemens c55 e comecei assim para primeiro estabelecer a ligação e ver k os comandos AT estavam a funcionar como esperado. Depois de testares assim, passas para o arduino..

Infelizmente não tenho. Mas tu depois ligaste quais fios do telemovel ao arduino? so o gnd tx e rx ou mais algum? usaste alguma divisor ? diodo de zener?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 00:08
Então, é meter um programa sem nada, ou seja abrir o exemplo BareMinimum, meter isso no Arduino e pode usar directamente como se um cabo usb-serial se trate.


senso se mais explicito se faz favor para eu fazer isso agora. obrigado
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 00:16
Penso que o senso quis dizer para ligares os cabos rx e tx do telemovel ao tx0 e rx0 do arduino e fazeres o upload do código em branco. Assim a informação recebida pelo arduino vai diretamente para o telemóvel. Se o problema for do código isto resolve.
O código em branco é o que está em File>Examples>Basic>Bare Minimum no IDE do arduino. Experimenta e diz se conseguiste :)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: msaleiro em 13 de Agosto de 2012, 00:19
Não tens nenhum cabo USB-TTL para ligares directamente o PC ao telemovel e fazeres os primeiros testes com os comandos AT? Uma vez já tive que fazer o mesmo mas com um siemens c55 e comecei assim para primeiro estabelecer a ligação e ver k os comandos AT estavam a funcionar como esperado. Depois de testares assim, passas para o arduino..

Infelizmente não tenho. Mas tu depois ligaste quais fios do telemovel ao arduino? so o gnd tx e rx ou mais algum? usaste alguma divisor ? diodo de zener?

Só liguei o GND, Rx e Tx com ligações directas para testar. Mas o cabo que usei era USB - LVTTL (3.3V)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 00:26
fiz o que disseste liguei o tx do telemovel ao ao rx0 do arduino e o rx do telemovel ao tx do arduino... o que acontece neste caso e que o telemovel fica sem rede.....ou seja o divisor de tensao nao me fica a funcinar bem.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 00:30
Não tens nenhum cabo USB-TTL para ligares directamente o PC ao telemovel e fazeres os primeiros testes com os comandos AT? Uma vez já tive que fazer o mesmo mas com um siemens c55 e comecei assim para primeiro estabelecer a ligação e ver k os comandos AT estavam a funcionar como esperado. Depois de testares assim, passas para o arduino..

Infelizmente não tenho. Mas tu depois ligaste quais fios do telemovel ao arduino? so o gnd tx e rx ou mais algum? usaste alguma divisor ? diodo de zener?

Só liguei o GND, Rx e Tx com ligações directas para testar. Mas o cabo que usei era USB - LVTTL (3.3V)

Tou mesmo desconfiado que se eu ligar entre o tx do arduino e o rx do telemovel um diodo zener 3.3v que isto fica bem diferente deste divisor que eu fiz.  Porque segundo as contas que aqui fizeram no inicio..


Vout = R2 / (R1+R2) * Vin
Substituindo:
3 = 18000 / (12000 + 18000) * 5
3 = 3


este divisor resitivo que fiz usa uma resistencia de 12k e de 18k...que jogam contra os 5volts do arduino dá 3volts..

e ja li aqui em mais projectos que o pessoal usou um diodo de zener 3.3v
e agora tu tambem me falaste desse valor... sera que o problema é mesmo esse?????  de 3 para 3.3v faz assim tanta diferença??
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 00:34
Mas neste site que encontrei, também usaram essas resistências, para o mesmo telemóvel, e parece que resultou:
http://alumni.ipt.pt/~pmad/gsm_alarm.php (http://alumni.ipt.pt/~pmad/gsm_alarm.php)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 00:37
Mas neste site que encontrei, também usaram essas resistências, para o mesmo telemóvel, e parece que resultou:
http://alumni.ipt.pt/~pmad/gsm_alarm.php (http://alumni.ipt.pt/~pmad/gsm_alarm.php)

Sim eu ja tinha lido... mas ele nao usou o arduino, mas acho que tambem nao era um factor que importasse muito visto que o microcontrolador que ele usou tambem era de 5v... alias foi atraves desse site que eu comprei estas resistencias mas pelo que ves.. nao ta a funcionar...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: msaleiro em 13 de Agosto de 2012, 01:25
Não tens nenhum cabo USB-TTL para ligares directamente o PC ao telemovel e fazeres os primeiros testes com os comandos AT? Uma vez já tive que fazer o mesmo mas com um siemens c55 e comecei assim para primeiro estabelecer a ligação e ver k os comandos AT estavam a funcionar como esperado. Depois de testares assim, passas para o arduino..

Infelizmente não tenho. Mas tu depois ligaste quais fios do telemovel ao arduino? so o gnd tx e rx ou mais algum? usaste alguma divisor ? diodo de zener?

Só liguei o GND, Rx e Tx com ligações directas para testar. Mas o cabo que usei era USB - LVTTL (3.3V)

Tou mesmo desconfiado que se eu ligar entre o tx do arduino e o rx do telemovel um diodo zener 3.3v que isto fica bem diferente deste divisor que eu fiz.  Porque segundo as contas que aqui fizeram no inicio..


Vout = R2 / (R1+R2) * Vin
Substituindo:
3 = 18000 / (12000 + 18000) * 5
3 = 3


este divisor resitivo que fiz usa uma resistencia de 12k e de 18k...que jogam contra os 5volts do arduino dá 3volts..

e ja li aqui em mais projectos que o pessoal usou um diodo de zener 3.3v
e agora tu tambem me falaste desse valor... sera que o problema é mesmo esse?????  de 3 para 3.3v faz assim tanta diferença??


Tu estás a tentar estabelecer uma comunicação entre duas tecnologias diferentes:
- TTL, em que a gama de tensões varia entre 0 e 5V
- LVTTL, em que a gama de tensões varia entre 0 e 3.3V

Os dispositivos TTL conseguem são 100% compatíveis com os LVTTL. Já o contrário não é verdade, pelo que necessitas de reduzir as tensões dos níveis TTL para níveis LVTTL (5V -> 3.3V) e é para isso que servem as resistências.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 01:38
Eu antes disse para ligares o tx ao rx e vice-versa, mas agora que me pus a pensar, utilizando o código em branco o correto não seria ligar o tx ao tx e o rx ao rx? Porque quando o computador envia a informação supostamente o pino que fica "activo" é o rx, portanto a informação terá de sair do rx para o rx do telemóvel e o mesmo se passa com o tx. Ou estarei errado?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 12:34
Pelo que estive a ver, o baudrate do Siemens C35 é 19200.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 12:37



Eu antes disse para ligares o tx ao rx e vice-versa, mas agora que me pus a pensar, utilizando o código em branco o correto não seria ligar o tx ao tx e o rx ao rx? Porque quando o computador envia a informação supostamente o pino que fica "activo" é o rx, portanto a informação terá de sair do rx para o rx do telemóvel e o mesmo se passa com o tx. Ou estarei errado?


Isto e para fazer depois no serial monitor ou no hyperterminal.

Pedrorock visite onde isso do baundrate onde tava a info?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 12:42
Pedrorock visite onde isso do baundrate onde tava a info?
Procurei "siemens c35 baudrate" no google e aparecem vários sites a falar em 19200 para o siemens c35.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 12:51
Qnd chegar a casa já vou testar.obrigado
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 17:36
Bom rapazes,aos poucos vou la...
Hoje decidi, dessoldar tudo e voltar a soldar... e tenho progressos...

Agora quando escrevo AT com este codigo:

Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#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(19200);  // DEBUG
  Serial3.begin(19200);
}

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


Ele JA APARECE no serial monitor AT
mas nao aparece OK

quando ligo para o telemovel aparece RING

devo ja tar proximo do pretendido..OK
Alguma ideia??
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 17:47
Quando ligas para o telemóvel recebes RING no PC?

Sabes se o problema era das ligações ou apenas do baudrate?

Tenta enviar "AT" e depois "AT+CMGF?" (sem as aspas).
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 17:49
Pedro eu ontem tinha tentado o baudrate mas nao tinha dado por isso devia ser das ligacoes.. olha tentei agora outra vez so fazer AT e passado uns 10segundos diz ERROR.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 17:51
 
Pedro eu ontem tinha tentado o baudrate mas nao tinha dado por isso devia ser das ligacoes.. olha tentei agora outra vez so fazer AT e passado uns 10segundos diz ERROR.

Sim quando ligo para o telemovel recebo RING no serial monitor



Tenta enviar "AT" e depois "AT+CMGF?" (sem as aspas).


deu tambem error...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 17:52
Pedro eu ontem tinha tentado o baudrate mas nao tinha dado por isso devia ser das ligacoes.. olha tentei agora outra vez so fazer AT e passado uns 10segundos diz ERROR.
Tenta em 9600 para ver o que acontece.

Sim quando ligo para o telemovel recebo RING no serial monitor
Isso é bom sinal.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 17:57
o que nao e bom sinal é ele nao dar OK no AT, nao sei porque. sera que tenho que ligar o pino DATA a massa???

aqui neste site ele usa um nokia c75 tá certo que nao e igual:
https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino

mas ele diz:

 > Vbatt - Power Charging (used for charging).
 > Gnd - GND  (main ground).
 > Tx   connected to arduino RX (using a resistor to limit current ).
 > Rx  connected to arduino TX (using a voltage devider from 5v to ~2,75v).
 > CTS  need to be connected to ground in order to work
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 18:02
É uma questão de exprimentares. Pelo menos já estás mais perto.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 18:22
Infelizmente tambem nao , o problema nao devia ser dai...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 18:41
Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#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(19200);  // DEBUG
  Serial3.begin(19200);
  Serial3.println("AT");
}

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


Olá, experimenta este código e vê se ainda recebes a mensagem de erro. Faz o upload e abre o serial monitor. Não tens de enviar nada, vê só a mensagem que recebes.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 18:50
rglove
Acho melhor pôr um delay antes de enviar a mensagem para dar tempo para abrir o serial monitor.
Fica assim:
Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#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(19200);  // DEBUG
  Serial3.begin(19200);
  delay(2000);
  Serial3.println("AT");
}

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

Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 19:04
Sim sim, fizeste bem
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 19:13
 ;D ;D ;D ;D ;D     F U N C I O N A      ;D ;D ;D ;D ;D ;D ;D


agora para o comando AT+CMGF? tambem tenho o por no codigo?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 19:35
Então eu vou-te enviar outro código para poderes enviar as coisas pelo serial monitor.

Aqui vai:

Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#define ledPin 13 //Used for DEBUG
char info[200];
int index = 0;
char inChar;

void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        Serial3.println(String(info));
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}


Experimenta este código. Com este podes enviar os comandos pelo serial monitor. Não sei se vai funcionar porque não o testei
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 19:52
Então eu vou-te enviar outro código para poderes enviar as coisas pelo serial monitor.

Aqui vai:

Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#define ledPin 13 //Used for DEBUG
char info[200];
int index = 0;
char inChar;

void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        Serial3.println(String(info));
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}


Experimenta este código. Com este podes enviar os comandos pelo serial monitor. Não sei se vai funcionar porque não o testei

funciona lindamente, agora podemos passar para o assunto mais a serio da uma olhada neste codigo:

Código: [Seleccione]
//GSM Remote control  V 3.0
//Created by Antonis G. Kanaris, January 27, 2012.

#include <PulsesIR_Toyotomi.h>

PulsesIR_Toyotomi pulsesIR_Toyotomi(13);//Pin 13 Ir led pin
 
 //int IRledPin=13; //IR Led pin
 int indicatorPin=5; //Indicator Led pin
 String readString;
 String admin="xxxxxxxxxx"; //admin number pdu code example 30123456 -> 03214365

 //read http://www.dreamfabric.com/sms/

 char c;
 
 void delsms(){
    Serial.println("AT+CMGD=1");//Delete sms
    }
 void readsmsAT(){
   Serial.println("AT+CMGR=1");//Read sms AT command
   delay(3000);
   }
 
 
  void sendsms_temp(){//Return with sms temperature room degree celcius.
 
  int temp=int(analogRead(3)*0.488);//Read temperature sensor LM35
  //if (0<temp<99) {  }

  byte hightemp=byte(temp/10);//convert temp to pdu format
  byte lowtemp=byte(temp%10);
  byte lowtemp1=bitWrite(lowtemp,4,1);
  byte lowtemp2=bitWrite(lowtemp1,5,1);
  int lb1=bitRead(lowtemp,0);
  int newhightemp=bitWrite(hightemp,7,lb1);
  int newhightemp1=bitWrite(newhightemp,4,1);
  int newhightemp2=bitWrite(newhightemp1,5,1);
  int newlowtemp2=lowtemp2>>1;
   
   Serial.println("AT+CMGF=0");//Start send sms with temperature to pdu format
   delay(3000);
   Serial.println("AT+CMGS=16");//Maybe for you is 15 or 17 read http://www.dreamfabric.com/sms/
   delay(3000);
   Serial.print("0011000C91xxxxxxxxxxxx10000AA02");//pdu sms temp to admin,

//read http://www.dreamfabric.com/sms/
 

    Serial.print(newhightemp2,HEX);
   Serial.print(newlowtemp2,HEX);
   delay(3000);
   Serial.write(26);//Ctrl-z
   delay(20000);
  }
 
   void setup() {
         
  //pinMode(IRledPin,OUTPUT);
  pinMode(indicatorPin,OUTPUT);
  delay(12000);//first time connect cable arduino with phone...
  Serial.begin(9600);
  delay(3000);
  Serial.println("AT+CPMS=\"ME\",\"SM\"");//Set memory phone
  delay(3000);
  Serial.println("ATE=0");//Echo off
  delay(3000);
 
}

   void loop()
  {
       readString=0;//format readString...
       readsmsAT();
     
      // read phone reply if available
    while(Serial.available() > 0)
            {
                c=Serial.read(),BYTE;
                readString+=c;
            }
               delay(1000);
               
               Serial.println(readString);//serial monitor display sms pdu format
               
               delay(3000);
              if (readString.indexOf(admin)>0 && readString.indexOf("36F770C")>0)// admin number and     //pdu on1
              {
                 //digitalWrite(indicatorPin, HIGH);//only for test
                 pulsesIR_Toyotomi.SendACCodeOn();//AC Toyotomi on
                 delay(5000);
                 //sendsms_temp();//send sms to admin temperature room
                 //digitalWrite(indicatorPin, LOW);//only for test
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("44FA33106")>0)// admin number and //pdu OFF1
              {
                 
                 pulsesIR_Toyotomi.SendACCodeOff();//AC Toyotomi off
                 delay(3000);
                 
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("364791E")>0)// admin number and   //pdu dry
              {
               
                 pulsesIR_Toyotomi.SendACCode_modeDry();//AC Toyotomi Dry
                 delay(3000);
               
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("4E3F79B0D")>0)// admin number and //pdu cool
              {
               
                 pulsesIR_Toyotomi.SendACCode_modeCool();//AC Toyotomi cool
                 delay(3000);
               
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("4C13AFD0D")>0)// admin number and //pdu Auto
              {
               
                 pulsesIR_Toyotomi.SendACCode_modeAuto();//AC Toyotomi mode Auto
                 delay(3000);
               
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("3C6B01B")>0)// admin number and //pdu Fan
              {
                 
                 pulsesIR_Toyotomi.SendACCode_modeFan();//AC Toyotomi mode Fan
                 delay(3000);
               
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("4E872980E")>0)// admin number and //pdu heat
              {
               
                 pulsesIR_Toyotomi.SendACCode_modeHeat();//AC Toyotomi Heat
                 delay(3000);

              }
              if (readString.indexOf(admin)>0 && readString.indexOf("7C6B01BC47EDF01")>0)// admin //number and pdu Fan low
              {
             
                 pulsesIR_Toyotomi.SendACCode_modeFanspeedLow();//AC Toyotomi Fan speed low
                 delay(3000);
               
              }
            if (readString.indexOf(admin)>0 && readString.indexOf("AC6B01BD42E93D3F536")>0)// //admin number and pdu Fan medium
              {
               
                 pulsesIR_Toyotomi.SendACCode_modeFanspeedMedium();//AC Toyotomi Fan speed //medium
                 delay(3000);
             
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("8C6B01B844E9FD1")>0)// admin //number and pdu Fan high
              {
 
                 pulsesIR_Toyotomi.SendACCode_modeFanspeedHigh();//AC Toyotomi Fan speed high
                 delay(3000);

              }
              if (readString.indexOf(admin)>0 && readString.indexOf("8C6B01B14AED3DF")>0)// admin //number and pdu Fan auto
              {
                 pulsesIR_Toyotomi.SendACCode_modeFanspeedAuto();//AC Toyotomi Fan speed Auto
                 delay(3000);
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("7D4721B0E9AC100")>0)// admin //number and pdu Temp 30
              {

                 pulsesIR_Toyotomi.SendACCode_Temp_30();//AC Toyotomi Temp 30
                 delay(3000);

              }
              if (readString.indexOf(admin)>0 && readString.indexOf("7D4721B0E92D500")>0)// admin //number and pdu Temp 25
              {

                 pulsesIR_Toyotomi.SendACCode_Temp_25();//AC Toyotomi Temp 25
                 delay(3000);
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("7D4721B0E92C100")>0)// admin //number and pdu Temp 20
              {
                 pulsesIR_Toyotomi.SendACCode_Temp_20();//AC Toyotomi Temp 20
                 delay(3000);
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("7D4721B0E8AD900")>0)// admin //number and pdu Temp 16
              {
                 pulsesIR_Toyotomi.SendACCode_Temp_16();//AC Toyotomi Temp 16
                 delay(3000);
              }
              if (readString.indexOf(admin)>0 && readString.indexOf("F4721B0E")>0)// admin number and //pdu temp
              {
                 sendsms_temp();
                 delay(3000);
               }
              if (readString.length()>40)//delete sms if sms received
              {
              delsms();
          }
              delay(10000);//delay start loop again for check new sms...

  }

o que pretendia daqui era fazer uma modificacao, para quando eu mandasse uma mensagem do meu telemovel a dizer LIGAR LUZ codificado em pdu, como ele ai fez... que ligasse por exemplo o pino14, e depois ao fazer isso, que me enviasse uma mensagem para mim a dizer. luz ligada.

consegues intrepretar o codigo

toma o site do pdu encoder:
http://twit88.com/home/utility/sms-pdu-encode-decode (http://twit88.com/home/utility/sms-pdu-encode-decode)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 19:58
Já tentaste enviar uma mensagem para o telemóvel para ver o que recebes no PC?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 20:17
Hmm, mas com esse telemóvel a sms tem de estar codificada em PDU? E para enviar também a tens de enviar codificada?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 20:18
Já tentaste enviar uma mensagem para o telemóvel para ver o que recebes no PC?

sim ja mas nao recebo nada, eu acho que tem que se ter o codigo que pus acima... so que tenho pouco conhecimento de codigo, e nao tou a perceber bem como isso se faz.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 20:19
Hmm, mas com esse telemóvel a sms tem de estar codificada em PDU? E para enviar também a tens de enviar codificada?

sim com esse codigo que te mostrei da para entender que sim.

ou entao usar este :
https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 20:26
É suposto receberes alguma coisa.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 20:37
É suposto receberes alguma coisa.


eu com este codigo que voces me deram:
Código: [Seleccione]
/*
HARDWARE SETUP
13 -Led pin Debug 13 (used for status)
*/

#define ledPin 13 //Used for DEBUG
char info[200];
int index = 0;
char inChar;

void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        Serial3.println(String(info));
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}

nao recebi nada no serial monitor
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 20:42
Tenta enviar "AT+CMGR=0" ou "AT+CMGR=1". Serve para ler um determinado SMS. Vê se obtens alguma resposta.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 20:44
Tenta enviar "AT+CMGR=0" ou "AT+CMGR=1". Serve para ler um determinado SMS. Vê se obtens alguma resposta.


recebi isto


AT+CMGR=1

+CMGR: 1,,156
07915391260100000406D0D4A613390021802181057240A065EB530B2A4F9B53908C86D6819A65F73CCC4E93C3E432C81D7E83CCEF34885C16A7E9617218047FCB41E6309B1E0691CBA079984D7EBB40D0B03C0C1ABFDDF4B4BB1E9683C22073981D9683CAA0B2DB9E0ECB41D3E614749687E9E93908FE028541F232B90CA2B7DD2072D95E06D1CB72D03CCC26BF41EDB43BDD7E83C86550B12A95C15CA020BD0C52875D

OK
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 20:46
É esta mensagem:
eVOZ eSMS 24h: Mensalidade nao foi debitada por falta de saldo. Para continuar a falar e enviar SMS gratis p/ a rede tmn deve ter saldo minimo de EUR20. Ate ja.

O AT+CMGR=0 não funcionou? A minha dúvida é se isso corresponde à SMS mais recente ou há mais antiga.

EDIT:
Dá uma vista de olhos nisto:
http://www.developershome.com/sms/howToReceiveSMSUsingPC.asp (http://www.developershome.com/sms/howToReceiveSMSUsingPC.asp)
e nisto:
http://alumni.ipt.pt/~pmad/s35i_c35i_m35i_atc_commandset_v01.pdf (http://alumni.ipt.pt/~pmad/s35i_c35i_m35i_atc_commandset_v01.pdf)

Acho que se enviares "AT+CNMI" recebes as mensagens novas.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 21:00
Alterei o código desse link. Inicializa na mesma o telemóvel pelo serial monitor. Quando estiver pronto para enviar a sms envia pelo serial monitor o texto "sms". Dentro de uns segundos deves receber uma sms. Ah, altera também o número na variável numero (não apagues o 351).

Depois diz se funcionou.

Se funcionar passamos a próxima fase.

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
int index = 0;
char inChar;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        if (String(info) == "sms") {
          send_sms(numero,"teste");
        } else {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
        }
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Olha, experimenta isto:
AT+CMGL=0

Serve para ver o index das sms que ainda não leste. Experimenta e diz o que obteste.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 21:08
Alterei o código desse link. Inicializa na mesma o telemóvel pelo serial monitor. Quando estiver pronto para enviar a sms envia pelo serial monitor o texto "sms". Dentro de uns segundos deves receber uma sms. Ah, altera também o número na variável numero (não apagues o 351).

Depois diz se funcionou.

Se funcionar passamos a próxima fase.

Código: [Seleccione]

#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
int index = 0;
char inChar;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        if (String(info) == "sms") {
          send_sms(numero,"teste");
        } else {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
        }
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Olha, experimenta isto:
AT+CMGL=0

Serve para ver o index das sms que ainda não leste. Experimenta e diz o que obteste.


com esse codigo nada do que escrevo no serialmonitor retorna... nem o AT
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 21:13
Alterei o código desse link. Inicializa na mesma o telemóvel pelo serial monitor. Quando estiver pronto para enviar a sms envia pelo serial monitor o texto "sms". Dentro de uns segundos deves receber uma sms. Ah, altera também o número na variável numero (não apagues o 351).

Depois diz se funcionou.

Se funcionar passamos a próxima fase.

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
int index = 0;
char inChar;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        if (String(info) == "sms") {
          send_sms(numero,"teste");
        } else {
          Serial3.println(String(info));
        }
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Olha, experimenta isto:
AT+CMGL=0

Serve para ver o index das sms que ainda não leste. Experimenta e diz o que obteste.

Tinha-me enganado numa parte do código, experimenta agora com este.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 21:18
Acontece a mesma coisa,
Nao sei se te era melhor guiares por este codigo aqui:

http://webgsmremotecontrol.webs.com/arduinogsmcode.htm (http://webgsmremotecontrol.webs.com/arduinogsmcode.htm)

parece tar mais simplificado.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 21:22
atencao....

agora funcionou alterei o teu baundrate 9600 para o 19200 e retornou isto
at

OK
AT+CMGF=0

OK
AT+CMGS=19

> 0011000C915391460012670000AA05F4

e RECEBI A MSG
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 21:24
Ah, já não sabia o que fazer porque o código estava correto.

Experimenta isto e diz o que obtiveste:
AT+CMGF=0
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 21:29
Ah, já não sabia o que fazer porque o código estava correto.

Experimenta isto e diz o que obtiveste:
AT+CMGF=0


retorna me OK
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 21:30
Ups, enganei-me. Queria dizer para testares isto:
AT+CMGL=0
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 21:32
Ups, enganei-me. Queria dizer para testares isto:
AT+CMGL=0


AT+CMGL=0

+CMGL: 5,0,,146
079153912601000004008000002180319173114097206A91598426B5DA20C8F8940641C8A734380585CF6F79185476D3E5E573B8FD9E83CA6DD0383C0F83C2F432283C07C9686810FD4D7ECF41EF39889C0ECF41E430685E6E87DD61103B7DAE9741EA3068FC6EC3E565500C044FEBF56150BB4C4E8751B4B4FB9C2A83E4E571591C06BDEB747918749687E9E939885E66CB62B9180E07C3DD00

OK
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 21:40
079153912601000004008000002180319173114097206A91598426B5DA20C8F8940641C8A734380585CF6F79185476D3E5E573B8FD9E83CA6DD0383C0F83C2F432283C07C9686810FD4D7ECF41EF39889C0ECF41E430685E6E87DD61103B7DAE9741EA3068FC6EC3E565500C044FEBF56150BB4C4E8751B4B4FB9C2A83E4E571591C06BDEB747918749687E9E939885E66CB62B9180E07C3DD00
Corresponde a:
TELEPIZZA FORA HORAS agora entregamos em casa ate as 24h todos os dias da semana ligue ja compre 1 pizza media(4ing)e receba outra gratis tel219188087
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 21:41
Ups, enganei-me. Queria dizer para testares isto:
AT+CMGL=0


AT+CMGL=0

+CMGL: 5,0,,146
079153912601000004008000002180319173114097206A91598426B5DA20C8F8940641C8A734380585CF6F79185476D3E5E573B8FD9E83CA6DD0383C0F83C2F432283C07C9686810FD4D7ECF41EF39889C0ECF41E430685E6E87DD61103B7DAE9741EA3068FC6EC3E565500C044FEBF56150BB4C4E8751B4B4FB9C2A83E4E571591C06BDEB747918749687E9E939885E66CB62B9180E07C3DD00

OK


Ok, isso significa que a sms com index 5 está com o estado 0 (não lida) e tem 146 caracteres.
E isso que está por baixo é o código PDU da mensagem.

Experimenta outra vez o mesmo para ver se retorna alguma coisa, porque não sei se o telemóvel já classificou essa sms como lida.

Depois é ver o que retorna quando não há sms lidas e de x em x segundos por exemplo ir verificando se há sms novas. Caso haja lê-se.
Já agora, tu queres que qualquer número possa enviar a sms ou apenas o teu número?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 21:48
Ups, enganei-me. Queria dizer para testares isto:
AT+CMGL=0


AT+CMGL=0

+CMGL: 5,0,,146
079153912601000004008000002180319173114097206A91598426B5DA20C8F8940641C8A734380585CF6F79185476D3E5E573B8FD9E83CA6DD0383C0F83C2F432283C07C9686810FD4D7ECF41EF39889C0ECF41E430685E6E87DD61103B7DAE9741EA3068FC6EC3E565500C044FEBF56150BB4C4E8751B4B4FB9C2A83E4E571591C06BDEB747918749687E9E939885E66CB62B9180E07C3DD00

OK


Ok, isso significa que a sms com index 5 está com o estado 0 (não lida) e tem 146 caracteres.
E isso que está por baixo é o código PDU da mensagem.

Experimenta outra vez o mesmo para ver se retorna alguma coisa, porque não sei se o telemóvel já classificou essa sms como lida.

Depois é ver o que retorna quando não há sms lidas e de x em x segundos por exemplo ir verificando se há sms novas. Caso haja lê-se.
Já agora, tu queres que qualquer número possa enviar a sms ou apenas o teu número?

agora envie uma msg do meu telemovel para o siemens retornou
AT+CMGL=0

+CMGL: 1,0,,30
07915391131213F4040C915391460012670000218031125383400CCCFAFC2D7F8BDFF4F4380C

OK

se tu abrires o conversor pdu
http://twit88.com/home/utility/sms-pdu-encode-decode (http://twit88.com/home/utility/sms-pdu-encode-decode)

ele decifrou isto:


SMSC#+35193121314
Sender:+351964002176
TimeStamp:13/08/12 21:35:38
TP_PID:00
TP_DCS:00
TP_DCS-popis:Uncompressed Text
class:0
Alphabet:Default

Lusorobotica
Length:12

Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 22:01
Excelente, mas agora volta a fazer a mesma coisa, mas sem sms por ler. Para poder ver o que é que recebes se não houver sms para ler para poder programar para quando ler x acontecer y.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 22:09
Excelente, mas agora volta a fazer a mesma coisa, mas sem sms por ler. Para poder ver o que é que recebes se não houver sms para ler para poder programar para quando ler x acontecer y.

sem sms ele nao retorna nada...

mas se vires aqui neste no site  que abocado te tinha dado.
http://webgsmremotecontrol.webs.com/arduinogsmcode.htm (http://webgsmremotecontrol.webs.com/arduinogsmcode.htm)

ele tem assim:
if (readString.indexOf(admin)>0 && readString.indexOf("36F770C")>0)// admin number and     //pdu on1
              {
                 //digitalWrite(indicatorPin, HIGH);//only for test
                 pulsesIR_Toyotomi.SendACCodeOn();//AC Toyotomi on
                 delay(5000);
                 //sendsms_temp();//send sms to admin temperature room

ou seja o "Pdu on1" que esta a vermelho codificado da:
3C6F770

nós podiamos fazer semelhante nao?
quando ele receber 3C6F770 enviava aquela palavra sms que puseste que me enviaste a mensagem. que tal?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 22:12
Sim, a ideia era essa. Mas queres que ele receba de qualquer número a sms ou só de um?
Se for só de um é muito simples, se quiseres que ele receba de mais números já é mais complicado, mas nada que não se faça.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 22:14
Sim, a ideia era essa. Mas queres que ele receba de qualquer número a sms ou só de um?
Se for só de um é muito simples, se quiseres que ele receba de mais números já é mais complicado, mas nada que não se faça.

Para ja so do meu.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 22:37
Ok, então envia a sms com o texto que queres do teu telemóvel para o cartão do siemens e lê com o comando que te tinha dito antes.
Posta aqui os resultados.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 22:45
Ok, então envia a sms com o texto que queres do teu telemóvel para o cartão do siemens e lê com o comando que te tinha dito antes.
Posta aqui os resultados.


AT+CMGL=0

+CMGL: 1,0,,27
07915391131213F4040C9153914600126700002180312213114009ECF4392C07B1EB7A

OK


descodificado da isto:



SMSC#+35193121314
Sender:+351964002176
TimeStamp:13/08/12 22:31:11
TP_PID:00
TP_DCS:00
TP_DCS-popis:Uncompressed Text
class:0
Alphabet:Default

ligar luz
Length:9


Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:17
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info2).indexOf(String(info1))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Experimenta esse código. Mandas a tal sms (manda como mandaste antes, em minusculas) e vê se o led do arduino acende. Se não acender diz. Abre o serial monitor na mesma para ver se recebes a mensagem Led ligado.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 23:23
com esse codigo o serialmonitor nao retorna nada, nem o comando AT.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:26
Mas mandaste a sms? Com esse código não ves nada do que ele retorna, apenas recebes uma mensagem a dizer que o led acendeu quando ele receber a sms, experimenta.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 23:30
Mas mandaste a sms? Com esse código não ves nada do que ele retorna, apenas recebes uma mensagem a dizer que o led acendeu quando ele receber a sms, experimenta.

sim enviei a mensagem tal como tinha enviado anteriormente.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 23:33
rglove
Estive a ver o código e acho que não está bem.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:35
É preciso enviar algum comando para iniciar o telemóvel? Ou pode-se logo enviar o comando para ler as sms?

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info2).indexOf(String(info1))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Experimenta. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 23:35
ve la se a ti nao te era mais facil alterares este...pelo menos agora para a questao de acionar o pino 13 quando se recebe o texto.

apenas ai nesse codigo tens que por em pdu o meu numero de telemovel.
e depois ca na linha debaixo o texto ligar luz em pdu tambem.

nao achas este caminho mais facil?

Código: [Seleccione]
//int IRledPin=13; //IR Led pin
 int indicatorPin=13; //Indicator Led pin
 String readString;
 String admin="xxxxxxxxxx"; //admin number pdu code example 30123456 -> 03214365


 char c;
 
 void delsms(){
    Serial.println("AT+CMGD=1");//Delete sms
    }
 void readsmsAT(){
   Serial.println("AT+CMGR=1");//Read sms AT command
   delay(3000);
   }
 

   

    Serial.print(newhightemp2,HEX);

 
   void setup() {
         
  //pinMode(IRledPin,OUTPUT);
  pinMode(indicatorPin,OUTPUT);
  delay(12000);//first time connect cable arduino with phone...
  Serial.begin(9600);
  delay(3000);
  Serial.println("AT+CPMS=\"ME\",\"SM\"");//Set memory phone
  delay(3000);
  Serial.println("ATE=0");//Echo off
  delay(3000);
 
}

   void loop()
  {
       readString=0;//format readString...
       readsmsAT();
     
      // read phone reply if available
    while(Serial.available() > 0)
            {
                c=Serial.read(),BYTE;
                readString+=c;
            }
               delay(1000);
               
               Serial.println(readString);//serial monitor display sms pdu format
               
               delay(3000);
              if (readString.indexOf(admin)>0 && readString.indexOf("36F770C")>0)// admin number and     //pdu on1
              {
                 digitalWrite(indicatorPin, HIGH);//only for test
                 
                 delay(5000);
                 /
              }
             
              delsms();
          }
              delay(10000);//delay start loop again for check new sms...

  }


pelo o que vejo o codigo ta sempre a checar o loop le a mensagem faz o que tem a fazer e apaga logo a mensagem.. assim nao fico ca caixa cheia.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:36
rglove
Estive a ver o código e acho que não está bem.

Provavelmente, em que parte?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:38
Se não conseguires receber nada com esse que te enviei agora alteramos esse, mas experimenta o outro, já não falta tanto para acabar...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 23:42
Espera uns minutos que eu já ponho aqui o código. Vou editar o que puseste aqui.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 23:43
É preciso enviar algum comando para iniciar o telemóvel? Ou pode-se logo enviar o comando para ler as sms?

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info2).indexOf(String(info1))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Experimenta. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.

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


+CMGL: 1,0,,27
07915391131213F4040C9153914600126700002180313213744009ECF4392C07B1EB7A



OK
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:44
Ok, acho que já descobri o erro (pelo menos um deles).
Tinha trocado na função indexOf as 2 variáveis.

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

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(info2))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Experimenta. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:47
Realmente o outro código está mais simples, mas já que começámos com este, agora tentamos acabar, senão é trabalho deitado fora...

Edit: Com o último código que enviei ainda tens de enviar o comando pelo serial monitor. E só depois de enviares o comando é que o led acende e recebes a mensagem no serial monitor. Se estiver tudo bem com esse código metemos a ler a sms sozinho.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 23:49
rglove
Esse ainda tem um problema.
Estás a procurar o inicio do código PDU, que tem info como numero telemovel, data, etc, mas não estás a procurar o texto em si.
Vê este aqui:

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //ligar luz em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

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

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 23:50
Ok, acho que já descobri o erro (pelo menos um deles).
Tinha trocado na função indexOf as 2 variáveis.

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

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char info2[] = "07915391131213F4040C915391460012670000";
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(info2))>0) {
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Experimenta. Envia o tal comando para ler a sms e vê se recebes alguma coisa no serial monitor.


continua a nao acender o led
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 13 de Agosto de 2012, 23:54
r16
Tenta o meu.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 13 de Agosto de 2012, 23:55
É isso mesmo Pedrock. Pensava que a informação que vinha para trás se mantinha igual e só alterava a data da mensagem, mas afinal não  ;)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 13 de Agosto de 2012, 23:56
rglove
Esse ainda tem um problema.
Estás a procurar o inicio do código PDU, que tem info como numero telemovel, data, etc, mas não estás a procurar o texto em si.
Vê este aqui:

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //ligar luz em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

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

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}



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

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


de maneira a que eu nao tenha a caixa sempre cheia. estao a ver a ideia?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 14 de Agosto de 2012, 00:00
 :)
Agora é só adicionar o send_sms(numero, mensagem) abaixo do código para acender o LED e isso já fica a funcionar. Também se pode adicionar o delete.

EDIT:
Usa este código. Edita o número para o teu (mantém o 351).
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //ligar luz em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada")
            Serial.println("SMS Enviado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 00:04
:)
Agora é só adicionar o send_sms(numero, mensagem) abaixo do código para acender o LED e isso já fica a funcionar. Também se pode adicionar o delete.

EDIT:
Usa este código. Edita o número para o teu (mantém o 351).
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //ligar luz em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351999999999"; // por enquanto não serve para nada, todos os números são aceites
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(9600);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  Serial3.println("AT+CMGL=0");
  delay(10);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(13,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada")
            Serial.println("SMS Enviado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

fica assim:

send_sms(meunumero, luz ligada)

???
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 14 de Agosto de 2012, 00:06
Edita aqui:
char numero[13] = "351999999999"
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 00:07
Ia mandar o código, mas o Pedrock já respondeu :) Apaga primeiro as sms todas do telemóvel e depois adiciona então o código para fazer o delete da sms, mas muda o Serial para Serial3.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 00:17
lol que raio agora ja nao acende o led,exprimentei tambem o codigo primeiro do pedrorock a ver se era algum problema.. e tambem nao acende..

olha que isto hein
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 14 de Agosto de 2012, 00:19
Tenta reeniciar o telemóvel. Se calhar é preciso enviar um AT antes dos outros comandos.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 00:20
Mas recebes a sms a confirmar que o led foi aceso? E recebes a mensagem no serial monitor? Estranho...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 00:22
no outro codigo que eu abocado vos falei o gajo tem isto no setup

void setup() {
         
  //pinMode(IRledPin,OUTPUT);
  pinMode(indicatorPin,OUTPUT);
  delay(12000);//first time connect cable arduino with phone...
  Serial.begin(9600);
  delay(3000);
  Serial.println("AT+CPMS=\"ME\",\"SM\"");//Set memory phone
  delay(3000);
  Serial.println("ATE=0");//Echo off
  delay(3000);
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 14 de Agosto de 2012, 00:22
Se continuar sem funcionar, volta a meter aquele código para comunicar com o PC, e envia um AT e outros comandos para veres se recebes "OK".
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 00:29
pode parecer mentira mas agora so este codigo e que me esta a responder aos comandos at...



Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
int index = 0;
char inChar;
char numero[13] = "351964002176";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        if (String(info) == "sms") {
          send_sms(numero,"teste");
        } else {
          Serial3.println(String(info));
        }
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

pedrock o teu primeiro que me enviaste... funcionou,,, mas depois de ter enviado aquele segundo corrigido por ti nem esse nem o antigo funciona aos comandos at nem ligam o led..ha coisas do diabo
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 00:32
Mas recebes a sms a dizer que o led acendeu e a mensagem no serial monitor ou não?
É esquesito. Tentaste reiniciar o telemóvel?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 14 de Agosto de 2012, 00:35
O conteúdo da mensagem é "ligar luz"?

Se sim, então com esse código para comunicar através do PC, envia novamente a mensagem para o telemóvel e usa o AT+CMGL=0 para ler a mensagem e mete aqui o que recebes.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 00:36
ya e esquesito sim reincie o telemovel e apaguei todas as sms. fogo cum caneco
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 00:40
O conteúdo da mensagem é "ligar luz"?

Se sim, então com esse código para comunicar através do PC, envia novamente a mensagem para o telemóvel e usa o AT+CMGL=0 para ler a mensagem e mete aqui o que recebes.

sim o conteudo e ligar luz...

ja reinciei o telemovel...
enviei novamente agora o teu primeiro codigo que me funcionou...

ele agora nao ta aceitar nenhum comando
AT+CMGL=0
nem o AT
nem nada...

o unico agora que me esta a responder aos comandos é este:

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
int index = 0;
char inChar;
char numero[13] = "351964002176";
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
        if (String(info) == "sms") {
          send_sms(numero,"teste");
        } else {
          Serial3.println(String(info));
        }
        index = 0;
        memset( &info, 0, sizeof(info) );
        break;
      }
    }
  }
  if (Serial3.available()) Serial.write(Serial3.read());
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


ha coisas...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 14 de Agosto de 2012, 00:44
O meu não tem a parte para reencaminhar os comandos do PC.

EDIT:
Tenta este:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Abre o Serial Monitor. Envia a SMS e vê se a luz acende. Se não, copia o que aparece no Serial Monitor.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 01:00
O meu não tem a parte para reencaminhar os comandos do PC.

EDIT:
Tenta este:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Abre o Serial Monitor. Envia a SMS e vê se a luz acende. Se não, copia o que aparece no Serial Monitor.


esse ta sempre  a passar loops infinitos ... AT+CMGL=0 ERROR quando envio a msg. e o TX ta sempre a piscar
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 01:07
Sim, esse código está sempre a procura de sms novas, daí o tx estar sempre a piscar (de 100 em 100 ms).
Não envies nenhum comando pelo serial monitor. Envia só a sms do teu telemóvel e vê se há alguma mensagem no serial monitor.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 01:12
ok pessoal entao e assim aumentei o delay de 100 para 3000 para vos poder passar o que se passava.


AT+CMGL=0

OK

AT+CMGL=0

OK

AT+CMGL=0


QUANDO O TELEMOVEL RECEU A SMS APARECEU ISTO

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

OK


MAS O LED NAO ACENDEU
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 01:18
O problema está ai... Tenta enviar uma sms outra vez com outro texto qualquer. Esse código PDU não tem nenhuma mensagem. Posta depois o que obtiveste.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 01:22
ENVIEI TESTE


AT+CMGL=0

OK

AT+CMGL=0

OK

AT+CMGL=0

OK

AT+CMGL=0

OK

AT+CMGL=0

+CMGL: 1,0,,24
07915391131213F4040C915391460012670
AT+CMGL=0

OK

AT+CMGL=0

OK
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 01:33
O problema está no código PDU que não tem a mensagem lá. Se reparares independentemente da sms que envias o código PDU é o mesmo.

Experimenta este código. Envia a sms e diz o que obtens. (apaga todas as sms antes)

O meu não tem a parte para reencaminhar os comandos do PC.

EDIT:
Tenta este:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Abre o Serial Monitor. Envia a SMS e vê se a luz acende. Se não, copia o que aparece no Serial Monitor.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 01:39
4040C915391460012670000218041107+R


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF4390E



AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411074C1A

K
AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110728540C97B

K
AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072B7

O
AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF4392C07B1EB

O

AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110728540E30EA

A+R


+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF4392C07BB

O

AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110728540E3C1A

KATM1

+CMGR: 1,,27
07915391131213F4040C9153914600126700002180411072854009ECF432B7


AT+CMGR=1


+CMGR: 1,,27
07915391131213F4040C91539146001267000021804110720C97B

OATM=



ta tao rapido que nao consigo copiar tudo...agora SIM liga me e apaga me o led , e envia me infinitamente mensagens LOL
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 14 de Agosto de 2012, 01:46
rglove, e pedrock agredeço a vossa ajuda e paciencia por hoje, mas tenho que me ir deitar, quando regressar aqui leio as vossas alteracoes, e envio para o arduino, tenho que me ir deitar se nao a mulher mete me fora de casa. muito obrigado
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 01:55
Ok, se reparares a maioria desses códigos PDU não contém a mensagem completa, apenas parte.
Experimenta este:

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    delay(1000);
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            while (Serial3.available() >0) {}
          }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

Não sei se vai funcionar, mas experimenta. Apaga antes as sms todas. Só aumentei o tempo de espera entre a recepção e a leitura da sms, porque se calhar quando a lês ela não está completa ainda. Também já está a apagar automaticamente a sms quando a recebe.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 14 de Agosto de 2012, 02:00
rglove, e pedrock agredeço a vossa ajuda e paciencia por hoje, mas tenho que me ir deitar, quando regressar aqui leio as vossas alteracoes, e envio para o arduino, tenho que me ir deitar se nao a mulher mete me fora de casa. muito obrigado

Amanhã é outro dia... Depois diz como correu!
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 00:31
Código: [Seleccione]
[quote author=rglove link=topic=5212.msg57734#msg57734 date=1344906033]
[quote author=r16 link=topic=5212.msg57732#msg57732 date=1344905184]
rglove, e pedrock agredeço a vossa ajuda e paciencia por hoje, mas tenho que me ir deitar, quando regressar aqui leio as vossas alteracoes, e envio para o arduino, tenho que me ir deitar se nao a mulher mete me fora de casa. muito obrigado
[/quote]

Amanhã é outro dia... Depois diz como correu!
[/quote]

boas pessoal, bem isto ja ta a bombar ...mas agora ta aqui uma coisa mal..

o codigo que tenho a funcionar é:

[code#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}]


eu envio do meu telemovel "ligar luz"
ele liga a luz...
envia um sms de retorno para mim a dizer luz ligada...
apaga a sms do telemovel a dizer "ligar luz" so que depois para ai.....

se eu voltar a enviar outra mensagem "ligar luz" ele ja nao acende,, ou seja ta a parar de fazer o loop,, como resolvo isso??

obrigado
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 00:37
Substitui:
while (Serial3.available() >0) {}
Por:
while (Serial3.available() >0) {Serial3.read();}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 00:49
Substitui:
while (Serial3.available() >0) {}
Por:
while (Serial3.available() >0) {Serial3.read();}

obrigado , agora ja ta a fazer o loop.
Outra coisa Pedro, agora se quizer colocar outra mensagem por exemplo "ligar rega"

tenho que adicionar la em cima

char ligarrega[] = "AQUI O CODIGO PDU"; //"ligar lega" em PDU

e depois meto este codigo a onde:

Código: [Seleccione]
Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           //send_sms(numero, "REGA LIGADA");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

se puderes alterar ai envia-me sff.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 01:09
Basta meter um else if abaixo do if que verificava se tinha "ligar luz", mas desta vez com o "ligar rega".
Já meti o PDU para "ligar rega".
Aqui tens:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 16 de Agosto de 2012, 01:15
É melhor alterar também a linha que apaga a sms e metê-la a apagar qualquer sms, porque da forma que eu pus só apaga a sms quando ela traduzir algum "comando", caso não traduza comando nenhum o código não vai funcionar mais. É só meter essa linha mais em cima, dentro do if Serial3.available().
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 01:35
Basta meter um else if abaixo do if que verificava se tinha "ligar luz", mas desta vez com o "ligar rega".
Já meti o PDU para "ligar rega".
Aqui tens:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

funciona fixe...

testei agora uma coisa,,, se enviar uma sms teste.......ou se o tlm receber uma msg de alguem.. ele vai ocupar a posicao 1 ou seja
AT+CMGD=1

depois se eu enviar uma msg correcta a dizer "ligar luz" ou "ligar rega" ele ja nao faz nada.. porque tenho ali aquela mensagem desconhecida a ocupar espaço...

existe alguma maneira de contornar isso????ou seja apagar as mensagens desconhecidas..ou ele so accionar as mensagens correctas.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 16 de Agosto de 2012, 01:42
Existe... Lê o que postei antes de ti. Foi precisamente isso que disse, precisas de alterar o código que apaga as sms. Só está a apagar as sms que traduzem comandos, tens de colocar as linhas de código que apagam as sms no inicio dentro da condição if Serial3.available(). Mete logo na linha a seguir a isso e vai estar a funcionar direito.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 16 de Agosto de 2012, 01:47
Desculpa os posts seguidos, mas só agora é que reparei que estava a dizer mal, tens de colocar essas linhas a seguir ao if Serial3.available() <= 0 e não a seguir a if Serial3.available().

Fica assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


Experimenta e diz se está a funcionar
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 16:49
Desculpa os posts seguidos, mas só agora é que reparei que estava a dizer mal, tens de colocar essas linhas a seguir ao if Serial3.available() <= 0 e não a seguir a if Serial3.available().

Fica assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


Experimenta e diz se está a funcionar

Enviei uma mensagem a dizer "ligar luz"

e aparece isto

Código: [Seleccione]
91131213F4040C915391460012670000218061616AT+CMGR=1

Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C9153914600126700002180616161

Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616

Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616
Mensagem Apagada

+CMGR: 1,,27
07915391131213F4040C915391460012670000218061616MGR=1

Mensagem Apagada

+CMGR: 1,,27

e apaga logo a mensagem..
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 17:57
Faltava aí um delay. Tenta assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    delay(1000);
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove em 16 de Agosto de 2012, 17:58
Mete um delay antes de leres a sms.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 18:04
Faltava aí um delay. Tenta assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    delay(1000);
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
            Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

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

Código: [Seleccione]

OK

Mensagem Apagada
AT+CMGD=1

OK
AT+CMGR=1

+CMGR: 0,,0

OK

Mensagem Apagada
AT+CMGD=1

OK
AT+CMGR=1

+CMGR: 0,,0

OK

Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 18:39
Tirei a parte para apagar os SMS. Tenta assim:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    delay(1000);
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
              digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 19:01
Fiz umas alterações e usei outro comando, que serve para ler as mensagens novas. O outro lia a mensagem na posição 1, ou seja, a mais antiga, e por isso tinha-se que apagar sempre. Desta maneira, se resultar, é melhor.
Vê se funciona:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) { //Para debug - Reencaminha comandos do PC para o telemóvel
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(3);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0"); //read received unread messages
  delay(1000);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0)
          { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0)
         { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          Serial3.println("AT+CMGD=1");
          delay(1000);
          while (Serial3.available() >0) {Serial3.read();}
          Serial.println("Mensagem Apagada");
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 19:35
Fiz umas alterações e usei outro comando, que serve para ler as mensagens novas. O outro lia a mensagem na posição 1, ou seja, a mais antiga, e por isso tinha-se que apagar sempre. Desta maneira, se resultar, é melhor.
Vê se funciona:
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) { //Para debug - Reencaminha comandos do PC para o telemóvel
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(3);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0"); //read received unread messages
  delay(1000);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0)
          { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0)
         { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          Serial3.println("AT+CMGD=1");
          delay(1000);
          while (Serial3.available() >0) {Serial3.read();}
          Serial.println("Mensagem Apagada");
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


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

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

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
AT+CMGL=0

OK

Mensagem Apagada
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 19:39
Comentei a parte para apagar a mensagem. Testa e põe aqui o que aparece no serial monitor.
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) { //Para debug - Reencaminha comandos do PC para o telemóvel
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0"); //read received unread messages
  delay(1000);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(3);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0)
          { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0)
         { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          //Serial3.println("AT+CMGD=1");
          //delay(1000);
          //while (Serial3.available() >0) {Serial3.read();}
          //Serial.println("Mensagem Apagada");
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 19:45
Comentei a parte para apagar a mensagem. Testa e põe aqui o que aparece no serial monitor.
Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) { //Para debug - Reencaminha comandos do PC para o telemóvel
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGL=0"); //read received unread messages
  delay(1000);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(3);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0)
          { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0)
         { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
            send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
            digitalWrite(ledPin,LOW);
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          //Serial3.println("AT+CMGD=1");
          //delay(1000);
          //while (Serial3.available() >0) {Serial3.read();}
          //Serial.println("Mensagem Apagada");
          break;
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}

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

enviei a msg ligar luz apareceu:

AT+CMGL=0

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

OK


e fiquei com duas msg na pasta recebidas
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 19:52
Passa-se alguma coisa, porque as mensagens estão em branco. Tenta o código anterior que funcionava.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 20:33
o ultimo que eu tinha a funcionar bem a apagar as mensagens ,ligar luz e ligar rega era este:

Código: [Seleccione]
#define num_to_char(number)   ((number) < 10 ?                           \
                                               ('0' + (number)) :        \
                                               (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

int ledPin = 13; //Used for DEBUG
boolean flagLUZoff=false;
boolean flagSMS=false;
char info[200];
char info1[400];
char OnSMS[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
int index = 0;
char inChar;
char inChar1;
char numero[13] = "351964002176"; // por enquanto apenas serve para enviar SMS, todos os números são aceites para ligar a luz
void setup() 
{
  pinMode(ledPin,OUTPUT); // LED DEBUG
  Serial.begin(19200);  // DEBUG
  Serial3.begin(19200);
}

void loop() // run over and over
{
  if (Serial.available()>0) {
    while (1) {
      inChar = Serial.read();
      info[index] = inChar;
      index++;
      delay(2);
      if (Serial.available() <= 0) {
          Serial3.println(String(info));
          index = 0;
          memset( &info, 0, sizeof(info) );
          break;
      }
    }
  }
  Serial3.println("AT+CMGR=1");
  delay(100);
  if (Serial3.available()>0) {
    while (1) {
      inChar1 = Serial3.read();
      info1[index] = inChar1;
      index++;
      delay(2);
      if (Serial3.available() <= 0) {
          Serial.println(String(info1));
          if (String(info1).indexOf(String(OnSMS))>0) { //Se "ligar luz"(em PDU) está na mensagem recebida, ligar LED
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
         else if (String(info1).indexOf(String(ligarrega))>0) { //Se "ligar rega"(em PDU) está na mensagem recebida, ligar Led
            digitalWrite(ledPin,HIGH);
            Serial.println("Led ligado");
            delay(1000);
           send_sms(numero, "Luz ligada");
            Serial.println("SMS Enviado");
           Serial3.println("AT+CMGD=1");
            delay(1000);
            Serial.println("Mensagem Apagada");
            digitalWrite(ledPin,LOW);
           
            while (Serial3.available() >0) {Serial3.read();}
         }
          index = 0;
          memset( &info1, 0, sizeof(info1) );
          break;
 
      }
    }
  }
}

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


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

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


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

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




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

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

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

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

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

}






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

}
//_____________________________


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

return counter;
}

//_____________________________

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

}

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

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

}

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

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

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

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

}
//________________________________________________________________

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

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

}


Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 20:40
E já viste se esse ainda funciona?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 20:53
Sim funciona  se eu enviar uma msg ligar luz, ou ligar rega ele liga o led, envia sms para mim e apaga msg.

mas se eu enviar uma msg qualquer ANTES ...ja nao funciona.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 20:58
Ok. Estou a modificar o código.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 21:40
Ok. Estou a modificar o código.

Ok obrigado.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 22:10
Estive a melhorar o código e a organizá-lo. Espero que funcione... Testa-o bem e depois diz-me.
Aqui tens:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

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

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

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

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

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

#define num_to_char(number)   ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 22:26
Estive a melhorar o código e a organizá-lo. Espero que funcione... Testa-o bem e depois diz-me.
Aqui tens:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

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

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

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

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

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

#define num_to_char(number)   ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}


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

 
Código: [Seleccione]
OK

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

OK

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

OK

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

OK

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

OK

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

OK

Mensagem Apagada
AT+CMGD=1

OK

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

OK

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

OK

Mensagem Apagada

tipo isso ta sempre a passar de meio em meio segundo...
da ideia que assim que recebe a mensagem MESMO que seja certa
ligar luz ou ligar lampada que a apaga logo.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 22:42
Faltava um delay:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

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

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

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

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

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

#define num_to_char(number)   ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 22:50
Faltava um delay:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

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

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

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

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

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

#define num_to_char(number)   ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte)       (0x0F & (byte))
#define  last_four(byte)      ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte)  num_to_char( last_four(byte))
#define hexdump_b(byte)  num_to_char(first_four(byte))

void hexdump_byte(unsigned char byte)
{
  Serial3.write(hexdump_a(byte));
  Serial3.write(hexdump_b(byte));
}

void convertPhone(char *pho){
  size_t data_length,y;
  data_length = strlen(pho);
  for (y = 0; y < data_length; y=y+2)
    {
      Serial3.write(pho[y+1]);
      Serial3.write(pho[y]);
    }
}

void send_sms(char *recPhone, char *data)
{
  size_t data_length, x;
  char l;
  long i;
  long n;

  data_length = strlen(data);
  i = data_length * 7;

  /* Round i up to a multiple of 8 */
  if (i & 0x07) i = (i & ~0x07) + 0x08;

  /* Calculate the number of message octets */
  i = i / 8;

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

 
  Serial3.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
  convertPhone(recPhone);
  Serial3.print("0000AA");

  hexdump_byte(data_length & 0xFF);

  l = 0;
  n = 0;

  for (x = 0; x < data_length; x++)
  {
    if (data[x] == '$')  data[x] = 0x02;

    n |= (data[x] & 0x7F) << l;
    l += 7;

    if (l >= 8)
    {
      hexdump_byte(n & 0xFF);
      l -= 8;
      n >>= 8;
    }
  }

  if (l != 0)
  {
    hexdump_byte(n & 0xFF);
  }
  // Code changed for Arduino v1.0
  Serial3.write(0x1A); // Ctrl+Z
  Serial3.write(0x0D); // CR
  Serial3.write(0x0A); // LF
  delay(5000);
 
}



a mesma coisa, apaga logo tanto a mensagem errada como a certa..
fogo esta parte e mais dificil que o resto todo.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 16 de Agosto de 2012, 22:54
EDIT: Já sei porque é. Espera um pouco...

EDIT2: Acho que o problema é que estava a usar a função flush(), mas esta já não faz a mesma coisa no arduino 1.0
Aqui tens:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(1000);
  if (Serial3.available()>0) //Se há alguma coisa para ler...
  {
    int index = 0;
    while (Serial3.available()>0) //Enquanto há para ler...
    {
      info[index] = Serial3.read(); //Ler
      index++;
      delay(2);
    }
    //Acabou de ler tudo
    Serial.println(String(info)); //Envia string lida para o PC
    if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
      { LigarLuz(); }
    else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
      {LigarRega(); }
    Serial3.println("AT+CMGD=1"); //Apagar mensagem
    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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 16 de Agosto de 2012, 23:03
EDIT: Já sei porque é. Espera um pouco...

EDIT2: Acho que o problema é que estava a usar a função flush(), mas esta já não faz a mesma coisa no arduino 1.0
Aqui tens:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(1000);
  if (Serial3.available()>0) //Se há alguma coisa para ler...
  {
    int index = 0;
    while (Serial3.available()>0) //Enquanto há para ler...
    {
      info[index] = Serial3.read(); //Ler
      index++;
      delay(2);
    }
    //Acabou de ler tudo
    Serial.println(String(info)); //Envia string lida para o PC
    if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
      { LigarLuz(); }
    else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
      {LigarRega(); }
    Serial3.println("AT+CMGD=1"); //Apagar mensagem
    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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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


agora quando envio a mensagem ligar luz aparece...

Código: [Seleccione]
OK

Mensagem Apagada
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C91539146001267000
Mensagem Apagada
AT+CMGR=1

+CMGR: 0,,0

OK

Mensagem Apagada
AT+CMGR=1

+CMGR: 0,,0

OK


mas que raio
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 17 de Agosto de 2012, 01:28
Tenta assim:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(1000);
  if (Serial3.available()>0) //Se há alguma coisa para ler...
  {
    int index = 0;
    while (Serial3.available()>0) //Enquanto há para ler...
    {
      info[index] = Serial3.read(); //Ler
      index++;
      delay(2);
    }
    //Acabou de ler tudo
    if (index > 40) //Mensagens válidas têm mais de 40 caracteres
    {
        Serial.println(String(info)); //Envia string lida para o PC
        if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
          { LigarLuz(); }
        else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
          {LigarRega(); }
        Serial3.println("AT+CMGD=1"); //Apagar mensagem
        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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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);
 
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 17 de Agosto de 2012, 16:39
Tenta assim:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(1000);
  if (Serial3.available()>0) //Se há alguma coisa para ler...
  {
    int index = 0;
    while (Serial3.available()>0) //Enquanto há para ler...
    {
      info[index] = Serial3.read(); //Ler
      index++;
      delay(2);
    }
    //Acabou de ler tudo
    if (index > 40) //Mensagens válidas têm mais de 40 caracteres
    {
        Serial.println(String(info)); //Envia string lida para o PC
        if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
          { LigarLuz(); }
        else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
          {LigarRega(); }
        Serial3.println("AT+CMGD=1"); //Apagar mensagem
        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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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

ola ja testei aparece assim no serial monitorquando escrevo ligar rega:

SMS apagados
AT+CMGR=1

+CMGR: 0,,28
07915391131213F4040C91539146001267000
Mensagem Apagada




DEPOIS FIZ UMA ALTERACAO NESTA LINHA E ATRASEI O DELAY

Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);

no serial monitor aparece isto:

Código: [Seleccione]
SMS apagados

+CMGR: 0,,28
07915391131213F4040C915391460012670000218071615232400AECF4392C07C9CB3
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071615232400AECF42CE
O
Mensagem Apagada


DEPOIS FIZ MAIS UM TESTE E APAGUEI A LINHA QUE APAGA A SMS:
O RESULTADO FOI:

Código: [Seleccione]
SMS apagados

+CMGR: 0,,28
07915391131213F4040C9153914600126700002180716103104AF2CE
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610310400AECF4392C07C9CBE730

O
TG

Rega Ligada
SMS Enviado
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610310400AECF90C3



Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610

TG

Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610310400AECF4392C07C9CBE73
O
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610310400AECF4392C07C9CE

O
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C9153914600126700002180716103100C97B0
O

Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610OATM1
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C91539146001267000021807161031040A4C9E

O
Mensagem Apagada

+CMGR: 1,,28
07915391131213F4040C915391460012670000218071610310400AECF4392C07C9CBE7




ou seja aparece esses caracteres todos malucos.. mas ja ligou a rega e fez tudo......
no entanto se eu voltar a por a vista a linha que apaga a mensagem...
como o delay do comando da leitura de msg esta a 100 , ele nem deixa sequer a msg ler... apaga logo.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 17 de Agosto de 2012, 17:23
Testa este:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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++; }
  }
  //Passou 1s

  Serial.println("Mensagem Lida:");
  Serial.println(String(info)); //Envia string lida para o PC
  Serial.println("Fim da Mensagem Lida");
  if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
    { LigarLuz(); }
  else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
    {LigarRega(); }
  Serial3.println("AT+CMGD=1"); //Apagar mensagem
  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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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

Põe aqui o que aparece no Serial Monitor.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 01:25
Testa este:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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++; }
  }
  //Passou 1s

  Serial.println("Mensagem Lida:");
  Serial.println(String(info)); //Envia string lida para o PC
  Serial.println("Fim da Mensagem Lida");
  if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
    { LigarLuz(); }
  else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
    {LigarRega(); }
  Serial3.println("AT+CMGD=1"); //Apagar mensagem
  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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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

Põe aqui o que aparece no Serial Monitor.

desculpa so responder agora, pois bem testei enviei sms ligar luz e apareceu isto..MAS COM O COMANDO DE APAGAR A MENSAGEM ESCONDIDO //

E APARECEU ASSIM:

[codeSMS apagados
Mensagem Lida:

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C9153914600126700002180810085644009ECF4392C07B1EB7A

OK

Fim da Mensagem Lida
Led ligado
SMS Enviado
Mensagem Apagada
][/code]

depois da ultima coisa que aparece no serial monitor MENSAGEM APAGADA... o loop para as 6 repeticoes do mesmo. e ja nao continua mais..

se eu fizer aparecer no codigo o codigo para apagar a mensagem o que aparece e sempre isto:

Código: [Seleccione]
codeSMS apagados
Mensagem Lida:

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

+CMGR: 0,,0

OK

Fim da Mensagem Lida
Mensagem Apagada
Mensagem Lida:
AT+CMGR=1

ou seja apaga logo a mensagem...

ps: tinha enviado um email ao dono do codigo do site em que "nos" baseamos para melhorar este codigo e ele disse me isto:

"Olá Rodolfo,
como te disse estou de férias :)... mas já dei uma vista de olhos rápida e posso te dar alguns conselhos:
1-Nunca uses programação com while(1) , os while true , isto deve-se sempre evitar senão entras em loops até nunca mais, e usa algo do genero while(Serial.available()>0 ) e não os IFs:
2-tenta usar a maquina de estados do meu exemplo, assim sabes sempre em que estado ficas: exemplo;
   estado1=verifica a existencia de sms no telemovel, se houver sms faz estado=2, estado 2: valida e trata mensagem (activa led) ,estado 3 apaga mensagem e coloca estado=1 (volta a repetir) 
3-reparei que nunca usas o serial.flush(), então podes ficar preso, como se calhar acontece aqui:   While (Serial3.available() >0) {} ,  aqui se tiveres algo no buffer ficar preso forever... (ate pode ser este o problema)


...força, e desculpa não te ajudar muito.
"

Ve se esta informacao ajuda.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 01:37
Tinha aí informação útil. Espero que seja desta: ;D
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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,,")>0 && String(info).indexOf("+CMGR: 0,,0")<0)
  {
      Serial.println("//Mensagem Recebida:");
      Serial.println(String(info)); //Envia string lida para o PC
      Serial.println("//Fim da Mensagem\\");
      if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
        { LigarLuz(); }
      else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
        {LigarRega(); }
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 01:43
Tinha aí informação útil. Espero que seja desta: ;D
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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,,")>0 && String(info).indexOf("+CMGR: 0,,0")<0)
  {
      Serial.println("//Mensagem Recebida:");
      Serial.println(String(info)); //Envia string lida para o PC
      Serial.println("//Fim da Mensagem\\");
      if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
        { LigarLuz(); }
      else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
        {LigarRega(); }
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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

ainda nao foi desta,,
desta vez.. no serial monitor esta sempre a dizer:

sms apagados
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 01:46
Tenta assim:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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++; }
  }
  //Passou 1s

  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",0")<0)
  {
      Serial.println("//Mensagem Recebida:");
      Serial.println(String(info)); //Envia string lida para o PC
      Serial.println("//Fim da Mensagem\\");
      if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
        { LigarLuz(); }
      else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
        {LigarRega(); }
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 01:58
Tenta assim:
Código: [Seleccione]
int ledPin = 13; //Used for DEBUG
char info[400];

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

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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++; }
  }
  //Passou 1s

  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",0")<0)
  {
      Serial.println("//Mensagem Recebida:");
      Serial.println(String(info)); //Envia string lida para o PC
      Serial.println("//Fim da Mensagem\\");
      if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
        { LigarLuz(); }
      else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
        {LigarRega(); }
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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

estamos mais perto...

envie uma msg a dizer teste...
depois envie de seguida uma msg a dizer ligar luz

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

+CMGR: 0,,24
07915391131213F4040C9153914600126700002180811034944005D4F29C2E07

OK

//Fim da Mensagem\
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C9153914600126700002180811044234009ECF4392C07B1EB7A

OK

//Fim da Mensagem\
Led ligado
SMS Enviado
Mensagem Apagada

ainda com o serial monitor aberto mandei uma msg a dizer
ligar rega e nao fez nada....

mas se fechar o serial monitor e voltar a abrir ja da......
ou seja parece que o loop para as vezes da essa ideia.


EDIT:

fiz um segundo teste para tirar teimas..
envie msg a dizer ligar rega...
depois ligar luz
e depois mensagem indesejada..
e so apareceu isto:

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

+CMGR: 0,,28
07915391131213F4040C915391460012670000218081108434400AECF4392C07C9CBE730

OK

//Fim da Mensagem\
Rega Ligada
SMS Enviado
Mensagem Apagada
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 02:11
Usa este código 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 ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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("//Mensagem Recebida:");
  Serial.println(String(info)); //Envia string lida para o PC
  Serial.println("//Fim da Mensagem\\");
  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0)
  {
      //Serial.println("//Mensagem Recebida:");
      //Serial.println(String(info)); //Envia string lida para o PC
      //Serial.println("//Fim da Mensagem\\");
      if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
        { LigarLuz(); }
      else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
        {LigarRega(); }
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 02:21
Usa este código 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 ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU

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

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

void loop() // run over and over
{
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
 
  Serial3.println("AT+CMGR=1"); //ler mensagem na posição 1
  delay(100);
  int index = 0;
  int 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("//Mensagem Recebida:");
  Serial.println(String(info)); //Envia string lida para o PC
  Serial.println("//Fim da Mensagem\\");
  if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0)
  {
      //Serial.println("//Mensagem Recebida:");
      //Serial.println(String(info)); //Envia string lida para o PC
      //Serial.println("//Fim da Mensagem\\");
      if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
        { LigarLuz(); }
      else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
        {LigarRega(); }
      Serial3.println("AT+CMGD=1"); //Apagar mensagem
      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("Led ligado"); //Debug
    delay(1000); //Debug
    send_sms(numero, "Luz ligada"); //Enviar SMS
    Serial.println("SMS Enviado"); //Debug
    digitalWrite(ledPin,LOW); //LED apagado
}

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

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

void clear_SMS_Memory(){
  unsigned short i = 0;
  for(i=1;i<=30;i++){
    Serial3.print("AT+CMGD=");
    Serial3.println(i);
    delay(100);
  }
  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));
}

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

funciona , so que o loop para...

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

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C9153914600126700002180812090444009ECF4392C07B1EB7A

OK

//Fim da Mensagem\
Led ligado
SMS Enviado
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C9153914600126700002180812001124009ECF4392C07B1EB7A

OK

//Fim da Mensagem\
Led ligado
SMS Enviado
Mensagem Apagada

se eu quizer enviar outra msg ja nao da...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 02:29
Tenta comentar os send_sms.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 02:34
Tenta comentar os send_sms.

aqui tens um teste, sem eu enviar sms nenhuma o serial monitor para ai..

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

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\


sera que existe um limite maximo no serial monitor???
ps: mesmo com as msg comentadas para o loop mesmo la muito em baixo..
mas ta a funcionar bem...

so que para....so consigo enviar 3 mensagens nao da tempo para mais..


edit: testei sem serial monitor aberto o led tx pisca de segundo a segundo... mas quando chega ai aos 15 segundos deixa de piscar.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 02:56
Adiciona Serial.println("Loop"); no inicio do loop e vê se o loop pára mesmo.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 03:00
Adiciona Serial.println("Loop"); no inicio do loop e vê se o loop pára mesmo.

void loop() // run over and over

{
  Serial.println("Loop");
  CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel

pus assim e para tambem, nao sei como vamos descalçar esta bota.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 03:10
Substitui:
  int startTime = millis(); //Grava o tempo em que começou a ler
Por:
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 03:22
Substitui:
  int startTime = millis(); //Grava o tempo em que começou a ler
Por:
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler

Penso que podemos agora ir dormir :) FUNCIONA.
Sem a tua a tua ajuda, nada disto seria possivel.
Amanha irei fazer um video colocar no youtube para veres o funcionamento do mesmo ainda em breadboard.

Dizer um obrigado é pouco...
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 03:25
Substitui:
  int startTime = millis(); //Grava o tempo em que começou a ler
Por:
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler

Penso que podemos agora ir dormir :) FUNCIONA.
Sem a tua a tua ajuda, nada disto seria possivel.
Amanha irei fazer um video colocar no youtube para veres o funcionamento do mesmo ainda em breadboard.

Dizer um obrigado é pouco...
;)
Boa noite então.
Ainda falta a parte para só aceitar mensagens tuas. Trato disso amanhã.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 03:29
Substitui:
  int startTime = millis(); //Grava o tempo em que começou a ler
Por:
  unsigned long startTime = millis(); //Grava o tempo em que começou a ler

Penso que podemos agora ir dormir :) FUNCIONA.
Sem a tua a tua ajuda, nada disto seria possivel.
Amanha irei fazer um video colocar no youtube para veres o funcionamento do mesmo ainda em breadboard.

Dizer um obrigado é pouco...
;)
Boa noite então.
Ainda falta a parte para só aceitar mensagens tuas. Trato disso amanhã.

Sim, boa ideia assim fica mais aprimorado. ate amanha ou ate logo.... abraço e mais uma vez obrigado.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 03:43
De nada. :)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 18 de Agosto de 2012, 16:02
Aqui tens o código para só aceitar mensagens tuas. Vê se funciona sff.
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");
}

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
  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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 18 de Agosto de 2012, 17:54
Logo ja irei testar. Tou de saida agora mas obrigado ate logo.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 19 de Agosto de 2012, 15:38
Aqui tens o código para só aceitar mensagens tuas. Vê se funciona sff.
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");
}

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

com este codigo nao entra em loop..

so aparece SMS APAGADOS..

enquanto no codigo anterior que funciona esta sempre assim:

Código: [Seleccione]
//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
//Mensagem Recebida:
AT+CMGR=1

+CMGR: 0,,0

OK

//Fim da Mensagem\
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 19 de Agosto de 2012, 16:00
Ele agora só escreve quando recebe uma mensagem. Enviaste alguma?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 19 de Agosto de 2012, 16:17
Ele agora só escreve quando recebe uma mensagem. Enviaste alguma?

sim enviei do meu tlm...
a luz do tx nem pisca quando o tlm a recebe..

como te digo so aparece no serial monitor

sms apagados
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock em 19 de Agosto de 2012, 16:36
Testa assim:
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");
}

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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 19 de Agosto de 2012, 16:43
Testa assim:
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");
}

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

agora o loop ta a funcionar mas assim que eu envio a mensagem ligar luz e o tlm a recebe no serial monitor aparece a msg em pdu...
so que nao liga o led.. nao diz sms enviada, diz logo MENSAGEM DE OUTRA PESSOA... e continua o loop.


edit:

Código: [Seleccione]
//Recebido:
AT+CMGR=1

+CMGR: 0,,27
07915391131213F4040C9153914600126700002180916143124009ECF4392C07B1EB7A

OK

//Fim
Mensagem de outra pessoa
Mensagem Apagada
//Recebido:
AT+CMGR=1

+CMGR: 0,,0

OK

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

+CMGR: 0,,0

OK

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

+CMGR: 0,,0

OK

//Fim
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 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?
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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);
}
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 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.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 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
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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.
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 em 19 de Agosto de 2012, 22:19
Bem observado. ta a funcionar sim :) vou fazer agora o video pra por no youtube
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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 :-\
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 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:

http://youtu.be/R2tW8JVtEuE (http://youtu.be/R2tW8JVtEuE)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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.  :)
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: rglove 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
Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: r16 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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fdl.dropbox.com%2Fu%2F6916111%2Ftvoff.png&hash=5b8ae65d8a25a41fe00fb9cf612270bc5414328b)

imagem da tv apagada:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fdl.dropbox.com%2Fu%2F6916111%2Foff.png&hash=3d0db27b928965950b32f1a0ec4fb2b660f9c5ab)

imagem da tv acesa:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fdl.dropbox.com%2Fu%2F6916111%2Ftvon.png&hash=36561fa4b3a3fd22de261d1883749f75495ce819)

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

Título: Re: Ajuda Siemens C35i, como o ligar ao arduino, comandos AT.
Enviado por: Pedrock 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.