LusoRobótica - Robótica em Português
Electrónica => Electrónica Geral => Tópico iniciado por: joaopedrocmp em 22 de Agosto de 2012, 12:56
-
Boas pessoal,
No seguimento de um topico com o arduino e um siemens c75, decidi tentar alguma coisa mas com um c72, pelo que vi,o pinout é igual, mas tenho um problema, eu tenho um Arduino Dumileanove, logo so tem uma porta serial.
ENtretanto encontrei isto: https://sites.google.com/site/carlosoliveiraprojects/home/arduino/gsm-and-arduino
Mas não estou a conseguir nenhum resultado.
Ajuda?
-
Olá, podes utilizar uma biblioteca que se chama NewSoftSerial para criar outra porta Serial.
-
O arduino 1.01 vem com uma "softwareSerial" serve, ou émelhor a ke disseste?
-
Não sei, experimenta. Eu tenho ideia que essa já não funciona e foi alterado o nome para NewSoftSerial, mas experimenta.
-
No Arduino 1.0, o SoftwareSerial foi substituído pelo NewSoftSerial.
Por isso, usa-se o SoftwareSerial.
-
Por coincidencia tenho um Siemens C72 com a mesma intencao.
Tive a sorte de encontrar um conector perfeito aqui, que e uma autentica breakout-board do conector (num gadget de carregar telemoveis mais antigos, com varios conectores tipo universal).
Mas ter tempo e que e de gesso.lol
Mantem o pessoal informado, sff.
-
Boas,
Eu nas ranhuras do carregador, meti fiador, entretanto meto foto.
Vou experimentar o newserial ;)
-
Boas pessoal,
Usei este codigo, no 1.0 e no 0.23 e não respondeu nada. as ligações sao as seguintes:
Pin 1: vcc
Pin2:Gnd
Pin3:---------- 2.7K----------------- Pino 2 do arduino
Pin4------------2.7k------------------Pino3 do arduino
|
|--------- 3.3k----------Gnd
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2, 3);
/***********************************************************
* Setup *
***********************************************************/
void setup()
{
pinMode(13,OUTPUT); // LED DEBUG
//Serial -------------------------------------------------
// Open serial communications and wait for port to open:
Serial.begin(9600); // DEBUG
mySerial.begin(19200);
}
/***********************************************************
* LOOP *
***********************************************************/
void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
delay(2000);
}
Não apareceu nada.
Apenas o tlm liga a luz sempre que reinicio o programa
-
Há uns tempos houve outra pessoa com o mesmo problema e este código funcionou. Experimenta:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
char info[200];
int index = 0;
char inChar;
void setup()
{
Serial.begin(9600);
mySerial.begin(19200);
}
void loop() // run over and over
{
if (Serial.available()>0) {
while (1) {
inChar = Serial.read();
info[index] = inChar;
index++;
delay(2);
if (Serial.available() <= 0) {
mySerial.println(String(info));
index = 0;
memset( &info, 0, sizeof(info) );
break;
}
}
}
if (mySerial.available()) Serial.write(mySerial.read());
}
Eu alterei para a biblioteca SoftwareSerial porque ao testar o código deu erro por causa da outra biblioteca (NewSoftSerial). Se calhar confundi as 2 e induzi em erro. De qualquer forma se não conseguires com a softwareSerial é só alterar.
-
A NewSoftSerial não vêm incluída na IDE, foi feita por alguém de fora, e foi introduzida no 1.0.
-
nada :(
-
Usei este:
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3); // RX, TX
#define ledPin 13 //Used for DEBUG
void setup()
{
pinMode(ledPin,OUTPUT); // LED DEBUG
//Serial -------------------------------------------------
// Open serial communications and wait for port to open:
Serial.begin(9600); // DEBUG
my.begin(19200);
delay(2000);
my.println("AT");
}
void loop() // run over and over
{
if (my.available()) Serial.write(my.read());
}
Aparece:
AT
OK
:)
-
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
char info[200];
int index = 0;
char inChar;
void setup()
{
Serial.begin(9600);
mySerial.begin(19200);
}
void loop() // run over and over
{
if (Serial.available()>0) {
while (1) {
inChar = Serial.read();
info[index] = inChar;
index++;
delay(2);
if (Serial.available() <= 0) {
mySerial.println(String(info));
index = 0;
memset( &info, 0, sizeof(info) );
break;
}
}
}
if (mySerial.available()) Serial.write(mySerial.read());
}
Se esse funcionou este que está em cima também devia funcionar. Tenta, abre o Serial Monitor e envia algum comando.
-
yaa, ta brutal. :P
Vou explorar os comandos :)
Obrigadão
-
Nova duvida:
Copiei o codigo do outro topico para o c35 e adicionei o emulador da 2ª porta serial:
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);
int ledPin = 13; //Used for DEBUG
char info[400];
char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU
char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS
void setup()
{
pinMode(ledPin,OUTPUT); // LED DEBUG
Serial.begin(9600); // DEBUG
my.begin(19200);
clear_SMS_Memory(); //Apagar SMS 1-30
Serial.println("SMS apagados"); //DEBUG
Serial.println("Inicio do Loop"); //DEBUG
}
void loop() // run over and over
{
CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
my.println("AT+CMGR=1"); //ler mensagem na posição 1
int index = 0;
unsigned long startTime = millis(); //Grava o tempo em que começou a ler
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
//Passou 1s
if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
{
Serial.println("//Mensagem Recebida:"); //DEBUG
Serial.println(String(info)); //DEBUG
Serial.println("//Fim da Mensagem\\"); //DEBUG
if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
{
Serial.println("Mensagem do admin");
if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
{ LigarLuz();}
else if (String(info).indexOf(String(desligarluz))>0)
{ DesligarLuz();}
else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
{LigarRega(); }
else if (String(info).indexOf(String(desligarrega))>0)
{DesligarRega();}
}
else Serial.println("Mensagem de outra pessoa"); //DEBUG
my.println("AT+CMGD=1"); //Apagar mensagem
delay(1000);
while (my.available()>0) my.read(); //Limpar resposta
Serial.println("Mensagem Apagada");
memset( &info, 0, sizeof(info) ); //Limpar array info
}
}
void LigarLuz()
{
digitalWrite(12,HIGH); //LED aceso
Serial.println("Luz ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
// digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarLuz()
{
digitalWrite(12,LOW); //LED aceso
Serial.println("Luz desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
//digitalWrite(ledPin,LOW); //LED apagado
}
void LigarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void CheckPCserial()
{
int index = 0;
if (Serial.available()>0) {
while (1) {
info[index] = Serial.read();
index++;
delay(2);
if (Serial.available() <= 0) {
my.println(String(info));
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
void clear_SMS_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
my.print("AT+CMGD=");
my.println(i);
delay(100);
}
while (my.available()>0) my.read(); //Limpar resposta
}
#define num_to_char(number) ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
void hexdump_byte(unsigned char byte)
{
my.write(hexdump_a(byte));
my.write(hexdump_b(byte));
}
String converterNumero(char *pho){
char num[13];
int data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
num[y]=(pho[y+1]);
num[y+1]=(pho[y]);
}
num[y] = '\0';
return num;
}
void convertPhone(char *pho){
size_t data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
my.write(pho[y+1]);
my.write(pho[y]);
}
}
void send_sms(char *recPhone, char *data)
{
size_t data_length, x;
char l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
/* Round i up to a multiple of 8 */
if (i & 0x07) i = (i & ~0x07) + 0x08;
/* Calculate the number of message octets */
i = i / 8;
my.println("AT+CMGF=0");
delay(1500);
my.print("AT+CMGS="); // Send SMS Comand
//phone.print("AT+CMGW="); //Send SMS to mobile draft folder (DEBUG)
delay(1500);
my.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
delay(1500);
my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
convertPhone(recPhone);
my.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
// Code changed for Arduino v1.0
my.write(0x1A); // Ctrl+Z
my.write(0x0D); // CR
my.write(0x0A); // LF
delay(5000);
}
Entretanto, ao enviar sms para la, recebo isto:
SMS apagados
Inicio do Loop
//Mensagem Recebida:
+CMGR: 0,,27
0791539111161616240C9153913141428500002180520045014009E27
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1
+CMGR: 1,,27
0791539111161616240C9153913141428500002180520045014009EFB
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
E o Led 12, não fica aceso.
-
ola seu copião :D
tenta isto
no void setup
pinMode(12,OUTPUT);
-
Penso que o problema não é só esse porque as mensagens que recebeste estão incompletas. Não sei se o fiz da melhor forma, mas supostamente com o código que está em baixo se houver uma sms ele faz um delay de 2 segundos antes de a ler. Não sei se vai resolver, mas experimenta.
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);
int ledPin = 13; //Used for DEBUG
char info[400];
char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU
char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS
void setup()
{
pinMode(12,OUTPUT);
pinMode(ledPin,OUTPUT); // LED DEBUG
Serial.begin(9600); // DEBUG
my.begin(19200);
clear_SMS_Memory(); //Apagar SMS 1-30
Serial.println("SMS apagados"); //DEBUG
Serial.println("Inicio do Loop"); //DEBUG
}
void loop() // run over and over
{
CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
my.println("AT+CMGR=1"); //ler mensagem na posição 1
int index = 0;
unsigned long startTime = millis(); //Grava o tempo em que começou a ler
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
//Passou 1s
if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
{
delay(2000);
my.println("AT+CMGR=1");
index=0;
startTime = millis();
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
Serial.println("//Mensagem Recebida:"); //DEBUG
Serial.println(String(info)); //DEBUG
Serial.println("//Fim da Mensagem\\"); //DEBUG
if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
{
Serial.println("Mensagem do admin");
if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
{ LigarLuz();}
else if (String(info).indexOf(String(desligarluz))>0)
{ DesligarLuz();}
else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
{LigarRega(); }
else if (String(info).indexOf(String(desligarrega))>0)
{DesligarRega();}
}
else Serial.println("Mensagem de outra pessoa"); //DEBUG
my.println("AT+CMGD=1"); //Apagar mensagem
delay(1000);
while (my.available()>0) my.read(); //Limpar resposta
Serial.println("Mensagem Apagada");
memset( &info, 0, sizeof(info) ); //Limpar array info
}
}
void LigarLuz()
{
digitalWrite(12,HIGH); //LED aceso
Serial.println("Luz ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
// digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarLuz()
{
digitalWrite(12,LOW); //LED aceso
Serial.println("Luz desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
//digitalWrite(ledPin,LOW); //LED apagado
}
void LigarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void CheckPCserial()
{
int index = 0;
if (Serial.available()>0) {
while (1) {
info[index] = Serial.read();
index++;
delay(2);
if (Serial.available() <= 0) {
my.println(String(info));
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
void clear_SMS_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
my.print("AT+CMGD=");
my.println(i);
delay(100);
}
while (my.available()>0) my.read(); //Limpar resposta
}
#define num_to_char(number) ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
void hexdump_byte(unsigned char byte)
{
my.write(hexdump_a(byte));
my.write(hexdump_b(byte));
}
String converterNumero(char *pho){
char num[13];
int data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
num[y]=(pho[y+1]);
num[y+1]=(pho[y]);
}
num[y] = '\0';
return num;
}
void convertPhone(char *pho){
size_t data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
my.write(pho[y+1]);
my.write(pho[y]);
}
}
void send_sms(char *recPhone, char *data)
{
size_t data_length, x;
char l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
/* Round i up to a multiple of 8 */
if (i & 0x07) i = (i & ~0x07) + 0x08;
/* Calculate the number of message octets */
i = i / 8;
my.println("AT+CMGF=0");
delay(1500);
my.print("AT+CMGS="); // Send SMS Comand
//phone.print("AT+CMGW="); //Send SMS to mobile draft folder (DEBUG)
delay(1500);
my.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
delay(1500);
my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
convertPhone(recPhone);
my.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
// Code changed for Arduino v1.0
my.write(0x1A); // Ctrl+Z
my.write(0x0D); // CR
my.write(0x0A); // LF
delay(5000);
}
-
Penso que o problema não é só esse porque as mensagens que recebeste estão incompletas. Não sei se o fiz da melhor forma, mas supostamente com o código que está em baixo se houver uma sms ele faz um delay de 2 segundos antes de a ler. Não sei se vai resolver, mas experimenta.
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);
int ledPin = 13; //Used for DEBUG
char info[400];
char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU
char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS
void setup()
{
pinMode(12,OUTPUT);
pinMode(ledPin,OUTPUT); // LED DEBUG
Serial.begin(9600); // DEBUG
my.begin(19200);
clear_SMS_Memory(); //Apagar SMS 1-30
Serial.println("SMS apagados"); //DEBUG
Serial.println("Inicio do Loop"); //DEBUG
}
void loop() // run over and over
{
CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
my.println("AT+CMGR=1"); //ler mensagem na posição 1
int index = 0;
unsigned long startTime = millis(); //Grava o tempo em que começou a ler
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
//Passou 1s
if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
{
delay(2000);
my.println("AT+CMGR=1");
index=0;
startTime = millis();
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
Serial.println("//Mensagem Recebida:"); //DEBUG
Serial.println(String(info)); //DEBUG
Serial.println("//Fim da Mensagem\\"); //DEBUG
if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
{
Serial.println("Mensagem do admin");
if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
{ LigarLuz();}
else if (String(info).indexOf(String(desligarluz))>0)
{ DesligarLuz();}
else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
{LigarRega(); }
else if (String(info).indexOf(String(desligarrega))>0)
{DesligarRega();}
}
else Serial.println("Mensagem de outra pessoa"); //DEBUG
my.println("AT+CMGD=1"); //Apagar mensagem
delay(1000);
while (my.available()>0) my.read(); //Limpar resposta
Serial.println("Mensagem Apagada");
memset( &info, 0, sizeof(info) ); //Limpar array info
}
}
void LigarLuz()
{
digitalWrite(12,HIGH); //LED aceso
Serial.println("Luz ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
// digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarLuz()
{
digitalWrite(12,LOW); //LED aceso
Serial.println("Luz desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
//digitalWrite(ledPin,LOW); //LED apagado
}
void LigarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void CheckPCserial()
{
int index = 0;
if (Serial.available()>0) {
while (1) {
info[index] = Serial.read();
index++;
delay(2);
if (Serial.available() <= 0) {
my.println(String(info));
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
void clear_SMS_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
my.print("AT+CMGD=");
my.println(i);
delay(100);
}
while (my.available()>0) my.read(); //Limpar resposta
}
#define num_to_char(number) ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
void hexdump_byte(unsigned char byte)
{
my.write(hexdump_a(byte));
my.write(hexdump_b(byte));
}
String converterNumero(char *pho){
char num[13];
int data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
num[y]=(pho[y+1]);
num[y+1]=(pho[y]);
}
num[y] = '\0';
return num;
}
void convertPhone(char *pho){
size_t data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
my.write(pho[y+1]);
my.write(pho[y]);
}
}
void send_sms(char *recPhone, char *data)
{
size_t data_length, x;
char l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
/* Round i up to a multiple of 8 */
if (i & 0x07) i = (i & ~0x07) + 0x08;
/* Calculate the number of message octets */
i = i / 8;
my.println("AT+CMGF=0");
delay(1500);
my.print("AT+CMGS="); // Send SMS Comand
//phone.print("AT+CMGW="); //Send SMS to mobile draft folder (DEBUG)
delay(1500);
my.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
delay(1500);
my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
convertPhone(recPhone);
my.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
// Code changed for Arduino v1.0
my.write(0x1A); // Ctrl+Z
my.write(0x0D); // CR
my.write(0x0A); // LF
delay(5000);
}
eu não tive problema quando testei com o meu siemens. mas e uma questao de ele testar... agora faltava lhe la por o pin12 em output no void setup
-
Pois, mas as sms que o telemóvel envia para o arduino estão incompletas, se calhar por não terem sido ainda recebidas por inteiro e o arduino já as estar a ler (?). Daí ter posto o delay de 2 segundos se recebesse uma sms para a voltar a ler novamente passado 2 segundos. Assim se o problema for esse fica resolvido porque em 2 segundos a mensagem já é recebida completamente.
-
rglove
Puseste o comando de ler a SMS duas vezes.
EDIT: Só agora vi o outro post. Ele pode testar das duas maneiras.
Talvez se possa resolver o problema aumentando o timeout. Aumentei de 1000 para 2000.
E pus o pino 12 como output.
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);
int ledPin = 13; //Used for DEBUG
char info[400];
char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU
char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS
void setup()
{
pinMode(ledPin,OUTPUT); // LED DEBUG
pinMode(12,OUTPUT); // LED DEBUG
Serial.begin(9600); // DEBUG
my.begin(19200);
clear_SMS_Memory(); //Apagar SMS 1-30
Serial.println("SMS apagados"); //DEBUG
Serial.println("Inicio do Loop"); //DEBUG
}
void loop() // run over and over
{
CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
my.println("AT+CMGR=1"); //ler mensagem na posição 1
int index = 0;
unsigned long startTime = millis(); //Grava o tempo em que começou a ler
while (millis() < (startTime+2000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
//Passou 1s
if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
{
Serial.println("//Mensagem Recebida:"); //DEBUG
Serial.println(String(info)); //DEBUG
Serial.println("//Fim da Mensagem\\"); //DEBUG
if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
{
Serial.println("Mensagem do admin");
if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
{ LigarLuz();}
else if (String(info).indexOf(String(desligarluz))>0)
{ DesligarLuz();}
else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
{LigarRega(); }
else if (String(info).indexOf(String(desligarrega))>0)
{DesligarRega();}
}
else Serial.println("Mensagem de outra pessoa"); //DEBUG
my.println("AT+CMGD=1"); //Apagar mensagem
delay(1000);
while (my.available()>0) my.read(); //Limpar resposta
Serial.println("Mensagem Apagada");
memset( &info, 0, sizeof(info) ); //Limpar array info
}
}
void LigarLuz()
{
digitalWrite(12,HIGH); //LED aceso
Serial.println("Luz ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
// digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarLuz()
{
digitalWrite(12,LOW); //LED aceso
Serial.println("Luz desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
//digitalWrite(ledPin,LOW); //LED apagado
}
void LigarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void CheckPCserial()
{
int index = 0;
if (Serial.available()>0) {
while (1) {
info[index] = Serial.read();
index++;
delay(2);
if (Serial.available() <= 0) {
my.println(String(info));
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
void clear_SMS_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
my.print("AT+CMGD=");
my.println(i);
delay(100);
}
while (my.available()>0) my.read(); //Limpar resposta
}
#define num_to_char(number) ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
void hexdump_byte(unsigned char byte)
{
my.write(hexdump_a(byte));
my.write(hexdump_b(byte));
}
String converterNumero(char *pho){
char num[13];
int data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
num[y]=(pho[y+1]);
num[y+1]=(pho[y]);
}
num[y] = '\0';
return num;
}
void convertPhone(char *pho){
size_t data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
my.write(pho[y+1]);
my.write(pho[y]);
}
}
void send_sms(char *recPhone, char *data)
{
size_t data_length, x;
char l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
/* Round i up to a multiple of 8 */
if (i & 0x07) i = (i & ~0x07) + 0x08;
/* Calculate the number of message octets */
i = i / 8;
my.println("AT+CMGF=0");
delay(1500);
my.print("AT+CMGS="); // Send SMS Comand
//phone.print("AT+CMGW="); //Send SMS to mobile draft folder (DEBUG)
delay(1500);
my.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
delay(1500);
my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
convertPhone(recPhone);
my.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
// Code changed for Arduino v1.0
my.write(0x1A); // Ctrl+Z
my.write(0x0D); // CR
my.write(0x0A); // LF
delay(5000);
}
Põe aqui o que te aparece no serial monitor.
-
Hmm, não tinha pensado dessa forma. Pensei que o problema é que o telemóvel estava a enviar a sms incompleta porque na altura em que o arduino pedia para ler ela estava incompleta. Então meti a ler 2 vezes, na primeira vez ele vê se recebe alguma sms e caso receba espera 2 segundos e volta a ler novamente. Assim se ela estivesse incompleta agora já está completa.
-
Hmm, não tinha pensado dessa forma. Pensei que o problema é que o telemóvel estava a enviar a sms incompleta porque na altura em que o arduino pedia para ler ela estava incompleta. Então meti a ler 2 vezes, na primeira vez ele vê se recebe alguma sms e caso receba espera 2 segundos e volta a ler novamente. Assim se ela estivesse incompleta agora já está completa.
Não sei, até pode ser isso...
O estranho é que as duas mensagens ficaram cortadas no mesmo sítio, por isso desconfiei do timeout. Este telemóvel deve demorar mais tempo a enviar a resposta.
-
Sim, se calhar tens razão e como funcionou com o r16 provavelmente o problema deve ser esse.
-
obrigado pessoal, quanto ao copiar, xD lol, depois acertamos "contas" xD
Entretanto, testo o programa amanha, que hoje não tenho saldo, a minha namorada nao deixa mandar porque diz que estas coisas são inúteis e so ando a gastar tempo ... mulheres...
-
Led nao acende
resultado:
SMS apagados
Inicio do Loop
//Mensagem Recebida:
AT+CMGR=1
+CMGR: 0,,27
0791539126010000040C9153911614075600002180623222534009E97
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1
+CMGR: 1,,27
0791539126010000040C9153911614075600002180623222534009E9B
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
-
Led nao acende
resultado:
SMS apagados
Inicio do Loop
//Mensagem Recebida:
AT+CMGR=1
+CMGR: 0,,27
0791539126010000040C9153911614075600002180623222534009E97
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1
+CMGR: 1,,27
0791539126010000040C9153911614075600002180623222534009E9B
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
tas a enviar a msg "ligar luz" com letras pequenas?
-
tas a enviar a msg "ligar luz" com letras pequenas?
O problema não é esse.
Tentaste a minha solução ou a do rglove? Testa as duas se não o fizeste.
-
Usei o codigo que o pedro postou
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);
int ledPin = 13; //Used for DEBUG
char info[400];
char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU
char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS
void setup()
{
pinMode(ledPin,OUTPUT); // LED DEBUG
pinMode(12,OUTPUT); // LED DEBUG
Serial.begin(9600); // DEBUG
my.begin(19200);
clear_SMS_Memory(); //Apagar SMS 1-30
Serial.println("SMS apagados"); //DEBUG
Serial.println("Inicio do Loop"); //DEBUG
}
void loop() // run over and over
{
CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
my.println("AT+CMGR=1"); //ler mensagem na posição 1
int index = 0;
unsigned long startTime = millis(); //Grava o tempo em que começou a ler
while (millis() < (startTime+2000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
//Passou 1s
if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
{
Serial.println("//Mensagem Recebida:"); //DEBUG
Serial.println(String(info)); //DEBUG
Serial.println("//Fim da Mensagem\\"); //DEBUG
if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
{
Serial.println("Mensagem do admin");
if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
{ LigarLuz();}
else if (String(info).indexOf(String(desligarluz))>0)
{ DesligarLuz();}
else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
{LigarRega(); }
else if (String(info).indexOf(String(desligarrega))>0)
{DesligarRega();}
}
else Serial.println("Mensagem de outra pessoa"); //DEBUG
my.println("AT+CMGD=1"); //Apagar mensagem
delay(1000);
while (my.available()>0) my.read(); //Limpar resposta
Serial.println("Mensagem Apagada");
memset( &info, 0, sizeof(info) ); //Limpar array info
}
}
void LigarLuz()
{
digitalWrite(12,HIGH); //LED aceso
Serial.println("Luz ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
// digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarLuz()
{
digitalWrite(12,LOW); //LED aceso
Serial.println("Luz desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
//digitalWrite(ledPin,LOW); //LED apagado
}
void LigarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void CheckPCserial()
{
int index = 0;
if (Serial.available()>0) {
while (1) {
info[index] = Serial.read();
index++;
delay(2);
if (Serial.available() <= 0) {
my.println(String(info));
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
void clear_SMS_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
my.print("AT+CMGD=");
my.println(i);
delay(100);
}
while (my.available()>0) my.read(); //Limpar resposta
}
#define num_to_char(number) ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
void hexdump_byte(unsigned char byte)
{
my.write(hexdump_a(byte));
my.write(hexdump_b(byte));
}
String converterNumero(char *pho){
char num[13];
int data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
num[y]=(pho[y+1]);
num[y+1]=(pho[y]);
}
num[y] = '\0';
return num;
}
void convertPhone(char *pho){
size_t data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
my.write(pho[y+1]);
my.write(pho[y]);
}
}
void send_sms(char *recPhone, char *data)
{
size_t data_length, x;
char l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
/* Round i up to a multiple of 8 */
if (i & 0x07) i = (i & ~0x07) + 0x08;
/* Calculate the number of message octets */
i = i / 8;
my.println("AT+CMGF=0");
delay(1500);
my.print("AT+CMGS="); // Send SMS Comand
//phone.print("AT+CMGW="); //Send SMS to mobile draft folder (DEBUG)
delay(1500);
my.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
delay(1500);
my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
convertPhone(recPhone);
my.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
// Code changed for Arduino v1.0
my.write(0x1A); // Ctrl+Z
my.write(0x0D); // CR
my.write(0x0A); // LF
delay(5000);
}
-
E o que apareceu no serial monitor foi o que postaste?
Se sim usa o meu e experimenta também.
-
com o teu, recebo isto:
SMS apagados
Inicio do Loop
//Mensagem Recebida:
ERROR
AT+CMGR=1
39126010000040C9153911614075600002180720023554009E2A
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
//Mensagem Recebida:
AT+CMGR=1
+CMGR: 1,,27
0791539126010000040C9153911614075600002180720023554009E3BK
//Fim da Mensagem\
Mensagem do admin
Mensagem Apagada
-
Aumentei o delay, experimenta, mas acho que não tem nada haver com isso.
Experimenta também aumentar mais um bocado o timeout no código do Pedrorock. Já experimentaste meter aquele primeiro código e ler as mensagens com o código só para confirmar que as lês como deve ser?
#include <SoftwareSerial.h>
SoftwareSerial my(2, 3);
int ledPin = 13; //Used for DEBUG
char info[400];
char ligarluz[] = "ECF4392C07B1EB7A"; //"ligar luz" em PDU
char desligarluz[] = "E4F29C9D3E87E520765D0F"; //"desligar luz" em PDU
char ligarrega[] = "ECF4392C07C9CBE730"; //"ligar rega" em PDU
char desligarrega[] = "E4F29C9D3E87E52079F91C06"; //"desligar rega" em PDU
char numero[13] = "351913142458"; //Numero que recebe e envia SMS
String adminPDU = converterNumero(numero); //Para verificação de remetente das SMS
void setup()
{
pinMode(12,OUTPUT);
pinMode(ledPin,OUTPUT); // LED DEBUG
Serial.begin(9600); // DEBUG
my.begin(19200);
clear_SMS_Memory(); //Apagar SMS 1-30
Serial.println("SMS apagados"); //DEBUG
Serial.println("Inicio do Loop"); //DEBUG
}
void loop() // run over and over
{
CheckPCserial(); //Para Debug - Reencaminha comandos do PC para o telemóvel
my.println("AT+CMGR=1"); //ler mensagem na posição 1
int index = 0;
unsigned long startTime = millis(); //Grava o tempo em que começou a ler
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
//Passou 1s
if (String(info).indexOf("+CMGR:")>0 && String(info).indexOf(",,0")<0) //Vê se existe uma mensagem
{
delay(5000);
my.println("AT+CMGR=1");
index=0;
startTime = millis();
while (millis() < (startTime+1000)) //Timeout de 1s
{
if (my.available()>0){
info[index] = my.read(); //Ler
index++; }
//if (String(info).indexOf("OK")>0) break;
}
Serial.println("//Mensagem Recebida:"); //DEBUG
Serial.println(String(info)); //DEBUG
Serial.println("//Fim da Mensagem\\"); //DEBUG
if (String(info).indexOf(adminPDU)>0) //Verifica se o número do "admin" está no início da mensagem PDU
{
Serial.println("Mensagem do admin");
if (String(info).indexOf(String(ligarluz))>0) //Se "ligar luz" (em PDU) está na mensagem recebida, ligar luz
{ LigarLuz();}
else if (String(info).indexOf(String(desligarluz))>0)
{ DesligarLuz();}
else if (String(info).indexOf(String(ligarrega))>0) //Senão, Se "ligar rega" (em PDU) está na mensagem recebida, ligar rega
{LigarRega(); }
else if (String(info).indexOf(String(desligarrega))>0)
{DesligarRega();}
}
else Serial.println("Mensagem de outra pessoa"); //DEBUG
my.println("AT+CMGD=1"); //Apagar mensagem
delay(1000);
while (my.available()>0) my.read(); //Limpar resposta
Serial.println("Mensagem Apagada");
memset( &info, 0, sizeof(info) ); //Limpar array info
}
}
void LigarLuz()
{
digitalWrite(12,HIGH); //LED aceso
Serial.println("Luz ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
// digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarLuz()
{
digitalWrite(12,LOW); //LED aceso
Serial.println("Luz desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Luz desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
//digitalWrite(ledPin,LOW); //LED apagado
}
void LigarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Ligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Ligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void DesligarRega()
{
digitalWrite(ledPin,HIGH); //LED aceso
Serial.println("Rega Desligada"); //Debug
delay(1000); //Debug
send_sms(numero, "Rega Desligada"); //Enviar SMS
Serial.println("SMS Enviado"); //Debug
digitalWrite(ledPin,LOW); //LED apagado
}
void CheckPCserial()
{
int index = 0;
if (Serial.available()>0) {
while (1) {
info[index] = Serial.read();
index++;
delay(2);
if (Serial.available() <= 0) {
my.println(String(info));
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
void clear_SMS_Memory(){
unsigned short i = 0;
for(i=1;i<=30;i++){
my.print("AT+CMGD=");
my.println(i);
delay(100);
}
while (my.available()>0) my.read(); //Limpar resposta
}
#define num_to_char(number) ((number) < 10 ? ('0' + (number)) : (('A' - 10) + (number)) )
#define first_four(byte) (0x0F & (byte))
#define last_four(byte) ((0xF0 & (byte)) >> 4)
#define hexdump_a(byte) num_to_char( last_four(byte))
#define hexdump_b(byte) num_to_char(first_four(byte))
void hexdump_byte(unsigned char byte)
{
my.write(hexdump_a(byte));
my.write(hexdump_b(byte));
}
String converterNumero(char *pho){
char num[13];
int data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
num[y]=(pho[y+1]);
num[y+1]=(pho[y]);
}
num[y] = '\0';
return num;
}
void convertPhone(char *pho){
size_t data_length,y;
data_length = strlen(pho);
for (y = 0; y < data_length; y=y+2)
{
my.write(pho[y+1]);
my.write(pho[y]);
}
}
void send_sms(char *recPhone, char *data)
{
size_t data_length, x;
char l;
long i;
long n;
data_length = strlen(data);
i = data_length * 7;
/* Round i up to a multiple of 8 */
if (i & 0x07) i = (i & ~0x07) + 0x08;
/* Calculate the number of message octets */
i = i / 8;
my.println("AT+CMGF=0");
delay(1500);
my.print("AT+CMGS="); // Send SMS Comand
//phone.print("AT+CMGW="); //Send SMS to mobile draft folder (DEBUG)
delay(1500);
my.println(i + 14); //change it if necessary (see example below) Fixed number for 12 digits phone.
delay(1500);
my.print("0011000C91"); // using the convertPhone function , for phones # with digits =12, like all numbers in Portugal.
convertPhone(recPhone);
my.print("0000AA");
hexdump_byte(data_length & 0xFF);
l = 0;
n = 0;
for (x = 0; x < data_length; x++)
{
if (data[x] == '$') data[x] = 0x02;
n |= (data[x] & 0x7F) << l;
l += 7;
if (l >= 8)
{
hexdump_byte(n & 0xFF);
l -= 8;
n >>= 8;
}
}
if (l != 0)
{
hexdump_byte(n & 0xFF);
}
// Code changed for Arduino v1.0
my.write(0x1A); // Ctrl+Z
my.write(0x0D); // CR
my.write(0x0A); // LF
delay(5000);
}
-
experimentei um codigo que espera por comandos via serial...
fiz AT, e respondeu ok. ler sms não experimentei.
Amanha ja faço isso, e ja experimento esse codigo, quanto ao outro, ja pus 5000 de timeout e nada.
-
Quando puderes experimenta ler uma sms pelo serial monitor com os comandos AT e vê se a mensagem é lida assim.
-
Ja agora, um PDF com comandos AT especificos da siemens... Espero que ajude alguem !!
http://abs.misto.cz/_MAIL_/kabely/siemensat.pdf (http://abs.misto.cz/_MAIL_/kabely/siemensat.pdf)
Nokia at comandos
http://nds1.nokia.com/phones/files/guides/Nokia_AThelp.pdf (http://nds1.nokia.com/phones/files/guides/Nokia_AThelp.pdf)
Modems com sms compatibilidade
http://www.developershome.com/sms/checkCommandSupport.asp (http://www.developershome.com/sms/checkCommandSupport.asp)
SMS em formato PDU
http://www.blogelectronica.com/sms-pdu/ (http://www.blogelectronica.com/sms-pdu/)
http://www.gsm-modem.de/sms-pdu-mode.html (http://www.gsm-modem.de/sms-pdu-mode.html)
gprs
http://www.alsitel.com/tecnico/gprs/protocolo.htm (http://www.alsitel.com/tecnico/gprs/protocolo.htm)
-
Boas,
Enviei um comando para ler a 2º sms da memoria, e apareceu isto:
OK
AT+CMGR=2
+CMGR: 0,,27
0791539126010000040C9153914270806300002180829095044C
>:(
Fogo...
-
A mensagem está em branco. Era isso que tinhas enviado?
Se não era isso acho que o problema está no telemóvel...
-
não, a sms guardada diz: ligar luz
ja experimentei com outro remetente e outra posição na memoria, mas da sempre igual, o corpo da mensagem vazio
configurações do tlm, ou é problema de junta?
-
Já viste se os comandos para esse telemóvel são os mesmos? É esquesito isso.
-
Não, mas testei outros comandos da lista que saquei, e estavam todos a resp "OK"
-
No telemóvel a mensagem aparece certa?
-
Sim,
Vou experimentar enviar sms por comandos, para ver o ke aparece
-
Ill try get some time to solder the conector and try it as well... Im curious now !!
PS- DEsculpem..O habito de escrever e falar em ingles e tao grande que me confundo as veze lol
-
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.
cumps
-
É capaz de ser isso, Tyran.
No 35 não era preciso mas talvez seja preciso neste.
Podes tentar também AT+CMGF=0.
-
ou seja, antes de ler a mensagem mudo para o modo de texto?
-
Sim,experimenta.
-
Antes ou caso não uses esse comando para mais nada, podes fazer isso no "setup". Já agora, já alguem usou gprs?
-
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.
cumps
Boas, este comando da erro, possivelmente nao suporta
-
É capaz de ser isso, Tyran.
No 35 não era preciso mas talvez seja preciso neste.
Podes tentar também AT+CMGF=0.
Este comando, responde OK, mas ao ler a sms, lê incompleta na msm
-
Então lê o at command guide para esse módulo...
-
Então lê o at command guide para esse módulo...
Modulo?
-
para o TLM que tenho, encontrei uma lista, (igual a uma postada na pag 3 acho)
-
Então lê o at command guide para esse módulo...
Modulo?
sim... módulo gsm
-
Então lê o at command guide para esse módulo...
Modulo?
sim... módulo gsm
mas ele nao ta a usar nenhum modulo, esta a usar um telemovel siemens.
-
Que deve ter lá dentro algum módulo gsm...
-
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.
cumps
Boas, este comando da erro, possivelmente nao suporta
Olá Joao, conseguil resolver o problema?
Acabo de comprar uma shild sim900 e estou tendo o mesmo problema.
Ao ler a mensagem (comando AT) ela vem apenas parte do texto.
Troquei de softwareserial para hardwareserial e funcinou bem.
Penso que seja algum problema com a libery SoftwareSerial.h (ou similar).
Se tiver novidades e puder me ajuda...agradeço.
Abraços a todos.
-
trocaste a library utilizada e funcionou bem? leu a sms toda?
-
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.
cumps
Boas, este comando da erro, possivelmente nao suporta
Olá Joao, conseguil resolver o problema?
Acabo de comprar uma shild sim900 e estou tendo o mesmo problema.
Ao ler a mensagem (comando AT) ela vem apenas parte do texto.
Troquei de softwareserial para hardwareserial e funcinou bem.
Penso que seja algum problema com a libery SoftwareSerial.h (ou similar).
Se tiver novidades e puder me ajuda...agradeço.
Abraços a todos.
Amigos, tudo perfeito, bastou eu baixar o baute rate para 4800 e tudo ok.
Abraços.
-
Por favor, estou começando a brincar com sms agora e esse código está me ajudando muito.
Obrigado.
Mas eu gostaria de saber qual é a vantagem ou necessidade de utilizar mensagens em PDU, porque não texto direto?
Obrigado
Sérgio
-
Os telemoveis recebem as mensagens PDU, porque serve para as operadoras terem de enviar e receber menos dados, como a mensagem está no telemovel em PDU, tens de a receber em PDU, mas é relativamente facil de converter para ASCII.
-
Muito obrigado.
-
Tens de mudar para modo de texto, AT+CMGF=1 salvo erro.
cumps
Boas, este comando da erro, possivelmente nao suporta
Olá Joao, conseguil resolver o problema?
Acabo de comprar uma shild sim900 e estou tendo o mesmo problema.
Ao ler a mensagem (comando AT) ela vem apenas parte do texto.
Troquei de softwareserial para hardwareserial e funcinou bem.
Penso que seja algum problema com a libery SoftwareSerial.h (ou similar).
Se tiver novidades e puder me ajuda...agradeço.
Abraços a todos.
Amigos, tudo perfeito, bastou eu baixar o baute rate para 4800 e tudo ok.
Abraços.
Boas, podes deixar um link para o download da library?
e que versão do ambiente de trabalho do arduino estas a usar?
-
Boa noite,
Acabei de comprar o siemens c62 e queria por a trabalhar com arduino. Uma vez que o c45 nao apanha rede.
Esquema:
telemovel pino 4 rx --- 2.7k --- pino 2 arduino
| - 3.3K --- GND
telemovel pino 3 tx --- 2.7k-----pino 3 arduino
Depois fiz upload deste codigo http://lusorobotica.com/index.php?topic=5258.msg58381#msg58381
(http://lusorobotica.com/index.php?topic=5258.msg58381#msg58381)
Depois quando abro o serial monitor não aparece nada. O que está mal?
-
resolvi o problema.
Acontece que o meu antigo c45 era por controlo fluxo Hardware.
Ao que parece o c 62 controlo de fluxo hardware tem de estar desligado.
agora vou tentar repor o codigo segurança, o senhor que vendeu nao sabe.
-
Boas, alguem sabe como posso identificar e guardar numa variavel o numero de um remetente de uma sms?