Pages: [1]   Go Down
Author Topic: [RISOLTO] MODULO GPRS con SIM900  (Read 1339 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti , mi sono imbattuto in un problema e non riesco ad uscirne ( dovuto alla non eccellente conoscenza del linguaggio di programmazione C )

Ho uno SHIELD GSM/GPRS con il quale effettuo una connessione dati

tutto funziona alla perfezione ma ho necessita a clicli regolari di inviare l'intensità del segnale GSM al una pagina PHP in ascolto

utilizzo :

Code:
gsm.SimpleWriteIn("AT+CSQ");
delay(5000);
gsm.WhileSimpleRead();

e sul serial monitor stampa ad esempio

Code:
+CSQ: 27,0

OK



la parte di codice che si occupa di inviare i dati alla pagina PHP è

Code:
int.httpGET("www.mioserver.it",80,"/pagina.php?segnale=????",msg,50);

ora non ho idea di come fare ad inserire al posto dei punti di domanda del segnale l'informazione letta dal comando AT+CSQ



Grazie 1000 a tutti
« Last Edit: October 15, 2012, 05:20:45 pm by maxvetro » Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 931
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Alla richiesta AT+CSQ=? il modulo risponde con la stringa +CSQ:<n>,<m> ove n è un numero da 0 a 31 (99 = non disponibile) che rappresenta i dBm, mentre m è un numero da 0 a 7 (99 = non disponibile) che rappresenta una percentuale.

Decodificati i numeri di risposta (ad esempio n = 2 = -110dBm) li puoi inserire al posto dei tuoi ????. 
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate ma forse mi sono spiegato male

I comandi AT li conosco , il problema e che non so come "TRASFORMARLI" in una stringa da poter passare alla pagina PHP in ascolto

grazie
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 931
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho simulato la ricezione di una stringa comprensiva di CR e LF iniziali e finali.

Spero che ti sia sufficiente.

Code:

const String CR = String(char(13));
const String LF = String(char(10));

//                           012345678
String Risposta = CR + LF + "+CSQ:31,5" + CR + LF;
String Z;
int RSSI;
int BER;
int I;
int J;

...

I = Risposta.indexOf("+CSQ");  // posizione primo carattere stringa risposta

if (I < 0) ...              // gestione errore (+CME ERROR:<err>)

I = Risposta.indexOf(":");  // posizione ":"
J = Risposta.indexOf(",");  // posizione ","

Z = Risposta.substring(I, J);  // estrai stringa "31"
RSSI = Z.toInt();

Z = Risposta.substring(J - 2);  // estrai stringa "5" eliminando CR ed LF finali
BER = Z.toInt();
...
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, prova ad aggiungere questo metodo nella classe SIM900

Code:
void SIMCOM900::WhileSimpleRead(char *res)
{
char datain;
while(_cell.available()>0){
datain=_cell.read();
if(datain>0){
*res = datain;
res++;
Serial.print(datain);
}
}
}


non so se esiste già un metodo di simile nella classe SIM900, cosi la risposta AT la metti nel buffer char che gli passi, poi lo leggi selezionando quello che ti serve come ha detto cyberhs
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

innanzitutto grazie per le info.. ma scusate se sono un po "tonto"

per manipolare la stringa e recuperare solo la parte che mi serve preferirei farlo fare al SERVER

Cio che ARDUINO dovrebbe fare è "semplicemente" comunicarmi l'intero contenuto della richiesta AT+CSQ ( quindi esempio +CSQ: 27,0 )

quindi detto in termini poco tecnici creare una STRINGA da passare alla mia pagina PHP in ascolto


int.httpGET("www.mioserver.it",80,"/pagina.php?segnale=STRINGA",msg,50);




ancora grazie
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate se concateno 2 messaggi .. ( in alcuni forum so che non è cosa gradita )

per rendere piu chiara la mia richiesta , vorrei fare un altro esempio :

ipotizziamo di collegare 2 LED alle uscite digitali D5 e D6

vorrei che se il segnale dovesse superare la soglia XX si accenda il led D5 , se dovesse superare la soglia YY si accenda il led D6

devo quindi leggere il contenuto del comando AT+CSQ , interpretarlo e creare 2 condizioni !

Code:
if ( level1 > 10 ) --> accendo il LED 1
if ( level1 > 20 ) --> accendo il LED 2

come faccio a far diventare level1 il valore letto dal comando AT+CSQ ?

grazie
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

devo aver fatto un po di pasticci... credevo di aver risposto ma non vedo il mio post  smiley-razz

allora il metodo che ti ho scritto prima lo devi mettere nella libreria, e come ti dicevo magari esiste già un metodo simile cmq... dopo nel tuo sketch dovresti scrivere una cosa del genere

Code:
   char res[30];

   ...
   gsm.SimpleWriteIn("AT+CSQ");
   delay(5000);
   gsm.WhileSimpleRead(res); //nella res trovi la stringa di risposta
   

dopo puoi cercare nel array "res" quello che ti serve, come ha detto cyberhs, il volore trovato puoi costruirti una nuova stringa e inviarla ("/pagina.php?segnale="+valore trovato) oppure usarlo nelle condizioni che dicevi prima.

ah dimenticavo magari nel metodo che aggiungi alla classe metti il fine stringa '\0' a ogni assegnazione
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

semplicemente.. magnifico

grazie 1000

solo per chi ne avesse bisogno bisogna anche andare nella classe SIM900.h e dichiarare

Code:
public:
void WhileSimpleRead(char *res);

grazie veramente perche oltre ad aver risolto il mio problema ho capito anche qualcosa in piu

alla prossima...

P.S.
non so come si chiudono le discussioni...( SOLVED )
Logged

Offline Offline
Edison Member
*
Karma: 24
Posts: 2032
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

semplicemente.. magnifico

grazie 1000

solo per chi ne avesse bisogno bisogna anche andare nella classe SIM900.h e dichiarare

Code:
public:
void WhileSimpleRead(char *res);

grazie veramente perche oltre ad aver risolto il mio problema ho capito anche qualcosa in piu

alla prossima...

P.S.
non so come si chiudono le discussioni...( SOLVED )

non chiudere la discussione può sempre servire fai modifica topi e cambia il titolo aggiungendo [RISOLTO] all'inizio! smiley-mr-green
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok perfetto... si in effetti ancora una cosa vorrei chiedere;

una volta recuperato il valore del segnale come numero intero

Code:
BER = Z.toInt();

dovrei concatenarlo alla stringa da inviare alla pagina PHP

quindi creo

Code:
char *stringa_php = strcat("/pagina.php?segnale=",BER);

ma naturalmente ottengo un errore di compatibilità tra CHAR e INT

è possibile convertire il numero intero BER in CHAR da poter concatenare alla stringa_php ?

:-)
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

o meglio..

Code:
String segnale = String(BER);
char signal[5];
segnale.toCharArray(signal,5);

char *dati = strcat("pagina.php?segnale=",signal);

Serial.println(dati);

inet.httpGET("www.miosito.it",80,dati,msg,50);

ed in effetti a video vedo pagina.php?segnale=26 ma al mio server non arriva la richiesta


allora faccio questa prova :

Code:

char *signal = "33";

char *dati = strcat("pagina.php?segnale=",signal);

Serial.println(dati);

inet.httpGET("www.miosito.it",80,dati,msg,50);


e sul mio server leggo il numero 33

!!!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusate se posto come un pazzo... ma avanzando con le prove vorrei aggiornarvi

questo il codice completo

Code:
void loop {
 send_data();
 delay(60000);
}

void send_data() {
 
    if(started){

    if (inet.attachGPRS("internet.wind", "", "")) {
       digitalWrite(ledtx,HIGH);
      // accendo il LED
    }
   
    delay(1000);
   

    // GRAZIE A Madwriter

   
    gsm.SimpleWriteln("AT+CSQ");
    delay(500);
    gsm.WhileSimpleRead(risultato);
   
    String Risposta = String(risultato);
   
   
    // GRAZIE A cyberhs

    String Z;
    int RSSI;
    int BER;
    int I;
    int J;
    I = Risposta.indexOf("+CSQ");
    I = Risposta.indexOf(":");
    J = Risposta.indexOf(",");
    Z = Risposta.substring(I,J);
    RSSI = Z.toInt();
    Z = Risposta.substring(J -2);
    BER = Z.toInt();


    Serial.println(BER);


    VALORE_SEGNALE = ????BER????
   
   
    char *mychar = strcat("/data_rx/ricezione_data.php?seriale=98890211&campo=",VALORE_SEGNALE);
   
   
    Serial.println(mychar);

    inet.httpGET("www.miosito.it",80,mychar,msg,50);



  }
 
 
  digitalWrite(ledtx,LOW);
 
};


Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usa direttamente la Stringa per creare un array char cosi puoi accodarlo alla stringa di invio

Code:
   
    ....
     char cVal[6];
     Z.toCharArray(cVal, 6) ;
   
      char *mychar = strcat("/data_rx/ricezione_data.php?seriale=98890211&campo=",cVal);
   
   
    Serial.println(mychar);

    inet.httpGET("www.miosito.it",80,mychar,msg,50);
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate se rispondo tardi ma sono stato fuori casa per lavoro !

Ok ho risolto tutto !!

Grazie mille BigByte !

siete stati tutti gentilissimi ....

Logged

Pages: [1]   Go Up
Jump to: