Go Down

Topic: [RISOLTO] MODULO GPRS con SIM900 (Read 2011 times) previous topic - next topic

maxvetro

Oct 09, 2012, 11:34 pm Last Edit: Oct 16, 2012, 12:20 am by maxvetro Reason: 1
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: [Select]

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


e sul serial monitor stampa ad esempio

Code: [Select]

+CSQ: 27,0

OK




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

Code: [Select]

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

cyberhs

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 ????. 

maxvetro

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

cyberhs

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

Spero che ti sia sufficiente.

Code: [Select]


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();
...

BigByte

Ciao, prova ad aggiungere questo metodo nella classe SIM900

Code: [Select]

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

maxvetro

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

maxvetro

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: [Select]

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

BigByte

devo aver fatto un po di pasticci... credevo di aver risposto ma non vedo il mio post  :P

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: [Select]

   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

maxvetro

semplicemente.. magnifico

grazie 1000

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

Code: [Select]

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 )

Madwriter


semplicemente.. magnifico

grazie 1000

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

Code: [Select]

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:
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

maxvetro

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

una volta recuperato il valore del segnale come numero intero

Code: [Select]

BER = Z.toInt();


dovrei concatenarlo alla stringa da inviare alla pagina PHP

quindi creo

Code: [Select]

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 ?

:-)

maxvetro

o meglio..

Code: [Select]

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: [Select]


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

!!!

maxvetro

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

questo il codice completo

Code: [Select]

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




BigByte

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

Code: [Select]

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

maxvetro

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

Ok ho risolto tutto !!

Grazie mille BigByte !

siete stati tutti gentilissimi ....


Go Up