Go Down

Topic: SIM800L problemi invio SMS memorizzato nella SIM (Read 497 times) previous topic - next topic

RedFox63

Ciao a tutti,
sto riprendendo un vecchio progetto che prevede l'invio di SMS utilizzando un modulo GSM SIM800L.
premetto che il progetto prevede che il modulo GSM sia alimentato solo quando necessario (per risparmiare energia) per questo motivo nello script troverete SIMPOWERON.

Ho 2 problemi:

1) accendendo il modulo e inviando subito un SMS (senza delay) non parte, ho risolto il problema inserendo un comando di GSM.reset() che passa all'istruzione successiva quando il modulo e' registrato. nello script ho inserito un calcolo dei tempi di reset (sono circa10sec).

avete qualche idea per gestire in modo migliore qs problema? in pratica deve inviare l'SMS solo quando il Modulo GSM e' registrato in rete.

2) la libreria che utilizzo (Sim800L_Library_Revised di Vittorio Esposito)  non permette di inviare SMS utilizzando il numero di cellulare registrato nella SIM (posizione 1). Questa funzione serve per non dover modificare lo script: nel caso volessi cambiare il numero di cellulare a cui inviare l'SMS basta farlo direttamente sulla SIM...

Ho visto che nella libreria SIM900 la funzione GetPhoneNumber (che dovrebbe essere quella giusta) e' presente  ma non riesco a copiarla in quella che utilizzo  (a cui gia' ho apportato alcune modifiche).

L'alternativa e' quella di utilizzare il comando AT+CPBR=1 x leggere il numero registrato nella SIM ma con gli array sono "deboluccio".

Avete librerie per la SIM800L piu' complete da consigliarmi?

Grazie per la collaborazione
Roberto

Code: [Select]
/*
 *  This library was written by Vittorio Esposito
 *    https://github.com/VittorioEsposito
 *
 *  Edited on:  December 24, 2016
 *  Editor:   Vittorio Esposito
 *   
 *  Original version by:   Cristian Steib
 *       
 *
*/

#include <Sim800L.h>
#include <SoftwareSerial.h>               

#define RX  2
#define TX  3

unsigned long tempo_prec;
unsigned long  tempo;


Sim800L GSM(RX, TX);

const int SIMPOWERON = 8;// A LOW ACCENDE LA SIM A HIGH LA SPEGNE

void setup(){
  pinMode(SIMPOWERON, OUTPUT);
  digitalWrite(SIMPOWERON, HIGH);
  Serial.begin(9600);
  Serial.println("spengo GSM");
 
delay (10000);

digitalWrite(SIMPOWERON, LOW);

Serial.println("accendo GSM");


 
GSM.begin(9600);  // circa 3 secondi per accendere il modulo


tempo= millis();

GSM.reset();

//calcolo il tempo di reset del modulo GSM
Serial.print("Modulo GSM resettato in ");
Serial.print((tempo - tempo_prec));
Serial.println(" millisecondi.");
Serial.println("Modulo GSM pronto a inviare SMS");

GSM.sendSms(1, "invio SMS di prova");

}
void loop(){

}

RedFox63

buon pomeriggio a tutti,
ho cercato in rete varie soluzioni per inviare un SMS utilizzando un numero precedentemente registrato nella SIM ma non funziona.
Premetto che ho letto pareri discordanti sull'utilizzo delle stringhe al posto degli array di caratteri di cui pero' non ho capito molto (se mi indicate dei link inizio a studiare...)

Sono quindi passato alla  manipolazione delle stringhe per estrarre dalla Seriale in numero di telefono registrato nella posizione 1 (AT+CPBR=1)
la riposta e' corretta +CPBR: 1,"+393357875823",145,"Test"
non riesco pero ad estrapolare nella variabile CELL  solo il numero di telefono.

Altro Problema: quello che vedo sul monito seriale non e' coerente con quello che invio al modulo GSM:
invio GSM.println ("AT+CPBR=1""\r"); e visualizzo  16:33:56.488 -> ⸮AP+CPBR=1 (non capisco da dove esce qs P...)


infine, sempre sul monitor seriale visualizzo una serie di caratteri strani (come se ci fossero disturbi di TX)
16:33:56.558 -> ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮

qualcuno riesci a dirmi cosa sbaglio ed indicarmi la strada da percorrere?


grazie
R





Code: [Select]
#include <Sim800L.h>
//#include <Gsm.h>
#include "sms.h"
#include <SoftwareSerial.h>  
#include <string.h>            

#define MAX_STRING_LEN  160
#define RX  2
#define TX  3
Sim800L GSM(RX, TX);

String  RISPOSTA;
String  CELL;

void setup(){
Serial.begin(9600);
GSM.begin(9600);  
GSM.reset(); // in questo modo sono sicuro che il modulo sia registrato in rete prima di inviare SMS
RISPOSTA ="";
GSM.println ("AT+CPBR=1""\r");
delay(3000);

RISPOSTA = GSM.readString();
delay(3000);
Serial.println ("stampa  RISPOSTA");
Serial.println (RISPOSTA);

CELL = RISPOSTA.substring(10,25);
Serial.println ("stampa  CELL");
delay(2000);
Serial.println (CELL);

}

void loop(){

}


risposte sul monitor seriale
Code: [Select]
16:33:56.488 -> stampa  RISPOSTA
16:33:56.488 -> ⸮AP+CPBR=1
16:33:56.488 -> +CPBR: 1,"+393357875823",145,"Test"
16:33:56.558 ->
16:33:56.558 -> OK
16:33:56.558 -> ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
16:33:56.628 -> ⸮AP+CPBR=1
16:33:56.628 -> +CPBR: 1,"+39335781111",145,"Test"
16:33:56.697 ->
16:33:56.697 -> OK
16:33:56.697 -> ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
16:33:56.730 -> stampa  CELL
16:33:58.688 -> ⸮AP+CPBR=1
16:33:58.723 -> +CPBR: 1,"+






RedFox63

ho finalmente trovato l'articolo di Futura Elettronica (http://www.futuraelettronica.net/pdf_ita/8190-GSMGPRSSHIELDV2.pdf) da cui avevo preso spunto inizialmente.

ora funziona tutto!!!

allego lo sketch utilizzato che ha le seguenti funzioni:
1) all'accensione invia un SMS al numero memorizzato nella SIM nella posizione 1, per cambiare posizione inserire 2, 3 etc
2) attende una chiamata dal un numero inserito nella SIM nella posizione da 1 a 3 stat=call.CallStatusWithAuth(number, 1,3); , in caso di numero autorizzato abbatte la call e invia SMS al chiamante.

se volete che invece risponda alla chiamata utilizzare call.PickUp();

spero di essere stato utile al forum.

RF
Code: [Select]
// FONTE http://www.futuraelettronica.net/pdf_ita/8190-GSMGPRSSHIELDV2.pdf

#include "SIM900.h"
#include <SoftwareSerial.h>
//carichamo i file necessari allo sketch
#include "sms.h"
#include "call.h"
CallGSM call ; // instanzia un oggetto per le chiamate
SMSGSM sms ; // instanzia un oggetto per gli SMS
char number[20];
byte stat=0 ;
int value=0 ;
int pin=7;
char value_str[5] ;

void setup()
{
pinMode(pin, INPUT);
Serial.begin (9600) ;
Serial.println("GSM GPRS Shield");

delay(2000);
  
// inizializziamo il modulo e configuriamo il baud rate IMPORTANTE IMPOSTARE A 4800
if (gsm.begin(4800)){
Serial.println("\nstatus=READY");

sms.SendSMS(1,"SMS AL 1 NUMERO MEMORIZZATO NELLA SIM"); // invia SMS al numero inserito nella  prima (1)  posizione della SIM
 
delay (3000);
Serial.println("SMS INVIATO");
}
else Serial.println("\nstatus=IDLE");
  
};
void loop ()
{
  stat=call.CallStatusWithAuth(number, 1,3);

// invia SMS se il mittente della chiamata in arrivo rientra tra quelli autorizzati (salvati sulla SIM tra la posizione numero 1 e la 3 )

if (stat==CALL_INCOM_VOICE_AUTH){
    call.HangUp(); // rifiuta 1a chiamata
    //call.PickUp(); // risponde alla chiamata
delay (10000);

value=digitalRead (1); // leggi lo stato dell'input

// converti il valore in stringa
itoa (value, value_str, 10); // converti il valore in stringa
 

sms.SendSMS(number, value_str);  // invia un SMS al mittente della telefonata salvato in precedenza

}
// eseguiamo questa operazione con un tempo di attesa di un secondo ( 1000 ) ;
}

Go Up