Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« on: October 09, 2012, 04:34:54 pm » |
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
|
|
|
|
« Last Edit: October 15, 2012, 05:20:45 pm by maxvetro »
|
Logged
|
|
|
|
|
Selvazzano Dentro - Padova
Offline
God Member
Karma: 17
Posts: 526
"Chi sa fa, chi non sa insegna"
|
 |
« Reply #1 on: October 09, 2012, 08:15:54 pm » |
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
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #2 on: October 10, 2012, 12:56:57 am » |
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
God Member
Karma: 17
Posts: 526
"Chi sa fa, chi non sa insegna"
|
 |
« Reply #3 on: October 10, 2012, 04:49:20 am » |
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(); ...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 1
Posts: 23
|
 |
« Reply #4 on: October 10, 2012, 09:55:28 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #5 on: October 10, 2012, 11:56:00 am » |
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
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #6 on: October 11, 2012, 02:17:24 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 1
Posts: 23
|
 |
« Reply #7 on: October 11, 2012, 04:46:44 am » |
devo aver fatto un po di pasticci... credevo di aver risposto ma non vedo il mio post  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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #8 on: October 11, 2012, 05:43:42 am » |
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 )
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 16
Posts: 1801
|
 |
« Reply #9 on: October 11, 2012, 05:50:47 am » |
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! 
|
|
|
|
|
Logged
|
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #10 on: October 11, 2012, 07:31:22 am » |
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 ? :-)
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #11 on: October 11, 2012, 07:53:35 am » |
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 !!!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #12 on: October 11, 2012, 10:52:46 am » |
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); };
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 1
Posts: 23
|
 |
« Reply #13 on: October 12, 2012, 12:44:15 am » |
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);
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 93
|
 |
« Reply #14 on: October 15, 2012, 05:18:58 pm » |
Scusate se rispondo tardi ma sono stato fuori casa per lavoro !
Ok ho risolto tutto !!
Grazie mille BigByte !
siete stati tutti gentilissimi ....
|
|
|
|
|
Logged
|
|
|
|
|
|