aiuto per codice visualizzazione variabile

salve dovrei visualizzare l'intensità del segnale di un gsm su un display

per il momento sono riuscito a visualizzarlo sul serial monitor con questo codice

#define gsm Serial1


void setup() 
{
  Serial.begin(9600);
  
  gsm.begin(9600);           
  delay(2000);
  gsm.println("AT+CMGF=1\r");           
  delay(1000);
  
  gsm.println("AT+CSQ");  //richiesta segnale

  while(1)
  {
     if (Serial1.available())
      { 
        Serial.write(Serial1.read());
      } 
  }
}

 void loop() 
{
  
}

e mi risponde sul monitor

+CSQ: 12,0

12 e il valore che devo estrarre dalla seriale e vorrei scriverla su una variabile per poi elaborarla per visualizzare su un lcd

mi potete dare una mano come fare?

grazie

con variabile = Serial1.read(); salvi il valore.
poi dipende da cosa vuoi fare con quel valore.

I singoli valori letti devi metterli dentro una stringa, meglio una stringa classica del C e NON una String.
Poi quando arriva una fine frase (si spera ci sia) allora analizzi la frase verificando se c'è' CSQ e se si leggi il valore successivo.

Ma devi visualizzare il valore una volta sola alla partenza del programma, oppure vorresti che sul display comparisse il valore tutte le volte che cambia?

Ciao,
P.

Scusa ma non ti bastava fare up qui:libreria SIM900 senza SoftwareSerial - #12 by birrohgt - Generale - Arduino Forum
Invece di aprire un'altra discussione ?

ho aperto un altra discussione perché mi sembrava che argomento era diverso la si parlava si softwareserial

pgiagno:
Ma devi visualizzare il valore una volta sola alla partenza del programma, oppure vorresti che sul display comparisse il valore tutte le volte che cambia?

Ciao,
P.

sono una volta

nid69ita:
I singoli valori letti devi metterli dentro una stringa, meglio una stringa classica del C e NON una String.
Poi quando arriva una fine frase (si spera ci sia) allora analizzi la frase verificando se c'è' CSQ e se si leggi il valore successivo.

grazie ma non sono molto esperto se riesci a spiegarmi meglio magari con esempi ti sarei grato

Prima di tutto bisogna sapere se la trasmissione ha un qualcosa che permette di sapere quando termina.
Cambia Serial.write(Serial1.read());
in Serial.println((int)Serial1.read(),HEX);

per vedere se dopo +CSQ: 12,0 c'e' qualche carattere di fine trasmissione

ok provo e ti faccio sapere grazie mille per l'aiuto sei gentilissimo

nid69ita:
per vedere se dopo +CSQ: 12,0 c'e' qualche carattere di fine trasmissione

Tutte le risposte dei SIM terminano con CR+LF ... è chiaramente indicato nell'Introduzione, paragrafo "AT Command Syntax", degli "AT Command Manual" relativi ai vari chip.

Guglielmo

Bene.
Puoi sfruttare la Serial.readBytesUntil(character, buffer, length)
Devi dichiarare una stringa classica del c (vettore di char) abbastanza grande. Diciamo char buf [ 20 ] ;
Poi

char buf[20];
...
while(1)
{ if (Serial1.available())          'CR='\r'=13   LF='\n'=10
  { if( Serial.readBytesUntil('\n', buf, 20)>0)         
     {  // letto fino a carattere ascii 10 dentro a buf  dovrei avere "+CSQ: 12,0"
         if( strncmp(buf,"+CSQ:",5)==0 )     //
         { // dentro a buf c'e' il messaggio aspettato
            // quindi dentro a buf, dal elemento 6 in poi, fino a virgola ho il numero
            int val=atoi(buf+6);
         }
     } 
 }
}

Non provato, da testare

cavolo un po complicato per me ci sono dei comandi che non so il loro significato sono un po agli inizi

quindi il mio valore è il val ???

il comando Serial.readBytesUntil io dove usare Serial1.readBytesUntil perché io uso la seriale 1 guisto?

Si il valore è poi in val (spero, non provato)
Se usi Mega e la seriale 1 allora si, Serial1 invece di Serial

Le stringhe classiche del C sono vettori/array di caratteri terminati da carattere speciale '\0' o null o valore 0.
Ci sono molte funzioni di libreria su questi vettori, strxxx()
Esempio strncmp che confronta due stringhe ma solo per enne caratteri. Ritorna 0 se uguali
Qui le funzioni già presenti in core Arduino (anzi nel Avr):

Qui help su C in generale: http://www.cplusplus.com/reference/cstring/strncmp/?kw=strncmp

>birrohgt: ... un consiglio ... ordina QUESTO libro e studialo ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

ti ringrazio dei consigli ma ho un libro simile gia letto ma faccio comunque fatica perché io non ho nessuna base di programmazione mai fatta neanche a livello scolastico (sono un tecnico hardware) quindi niente software ne tanto meno programmazione e linguaggi vari quindi sto cercando di imparare e capire per quello che riesco a fare

comunque se volessi visualizzare come controllo la mia variabile posso usare

Serial.write (val);

giusto?

Prova col Serial.parseint

paulus1969:
Prova col Serial.parseint

Scusa, ma che c'entra con la sua domanda ? Lui sta chiedendo come VISUALIZZARE una variabile, non come leggere in un intero ...

Guglielmo

birrohgt:
ti ringrazio dei consigli ma ho un libro simile gia letto ...

... dammi retta, è uno dei migliori in assoluto in lingua Italiana ... l'ha scritto il nostro "admin" Leo ... lo stesso di QUESTO sito. T'assicuro che vale la pena leggerlo ! :slight_smile:

birrohgt:
comunque se volessi visualizzare come controllo la mia variabile posso usare
Serial.write (val);

Che intendo visualizzare "come controllo" ? ? ? Che vuoi visualizzare il valore della variabile per avere un riscontro ? In tal caso leggiti bene la differenza tra il metodo write() e il metodo print() e segli quello che meglio si addice a come vuoi visualizzare la variabile.

Guglielmo

gpb01:
Scusa, ma che c'entra con la sua domanda ? Lui sta chiedendo come VISUALIZZARE una variabile, non come leggere in un intero ...

Guglielmo

Evidentemente ho interpretato male la sua frase:

12 e il valore che devo estrarre dalla seriale e vorrei scriverla su una variabile per poi elaborarla

ho fatto cosi ma non mi funziona sul monitor non vedo nulla :confused:

#define gsm Serial1
char buf[20];
int val;

void setup() 
{
  Serial.begin(9600);
  
  gsm.begin(9600);           
  delay(2000);
  gsm.println("AT+CMGF=1\r");           
  delay(1000);
  
  gsm.println("AT+CSQ");  //richiesta segnale

  
while(1)
{ if (Serial1.available())        
  { 
    if( Serial1.readBytesUntil('\n', buf, 20)>0)     // letto fino a carattere ascii 10 dentro a buf  dovrei avere "+CSQ: 12,0"    
     {  
      if( strncmp(buf,"+CSQ:",5)==0 )    // dentro a buf c'e' il messaggio aspettato
         { 
            val=atoi(buf+6);   // quindi dentro a buf, dal elemento 6 in poi, fino a virgola ho il numero
         } 
     } 
 }
}
  Serial.write (val);
    
  
  }

E fai un po' di "debug" ...
... spargi Serial.print() un po' ovunque e controlla tutte le varie fasi del codice così da scoprire dove è il problema.

Guglielmo