[RISOLTO] MODULO GPRS con SIM900

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 :

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

e sul serial monitor stampa ad esempio

+CSQ: 27,0 

OK

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

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

Alla richiesta AT+CSQ=? il modulo risponde con la stringa +CSQ:, 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 ????.

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

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

Spero che ti sia sufficiente.

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

Ciao, prova ad aggiungere questo metodo nella classe SIM900

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

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

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 !

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

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

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

   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

semplicemente.. magnifico

grazie 1000

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

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 )

maxvetro:
semplicemente.. magnifico

grazie 1000

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

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! :grin:

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

una volta recuperato il valore del segnale come numero intero

BER = Z.toInt();

dovrei concatenarlo alla stringa da inviare alla pagina PHP

quindi creo

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 ?

:slight_smile:

o meglio..

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 :

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

!!!

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

questo il codice completo

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

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

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

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

Ok ho risolto tutto !!

Grazie mille BigByte !

siete stati tutti gentilissimi ....