prendere dati da seriale

Ciao a tutti. Volevo una cortesia. Capire come fare a prelevare 3 dati dalla seriale e inserire un azione
per ogni dato rilevato. Il programma è semplice ma non riesco a capire come fare.

String readString;
void setup(){
  Serial.begin(9600);
  Serial2.begin(9600);
}

void loop(){
  
  while (Serial2.available()) {
    delay(3);  
    char c = Serial2.read();
    readString += c; 
  }
  if (readString.length() >0) {
    Serial.println(readString);
    }
    readString="";
  }

questi sono i dati

G
8.7

E
82%

Z
Clear

A me servono i dati 8.7-82%-Clear
Grazie mille.

if dato == 8.6 fai qualcosa
Else qualcaltra cosa :slight_smile:
Cerca If Else

Anzi devi
Se dato >0 fai qualcosa
Così a prescindere dal valore fai qualcosa ma se la variabile é vuota non fai niente o mandi un messaggio di errore

non ci crederai ma le sto provando tutte. adesso ho fatto cosi

String readString;
String temperatura;
String icona;
String umidita;
String mess =" ";

void setup(){
  Serial.begin(9600);
  Serial2.begin(9600);
}

void loop(){
  
  while (Serial2.available()) {
    delay(3);  
    char c = Serial2.read();
    readString += c; 
  }
  if (readString.length() >0) {
    mess=readString;
    //Serial.println(readString);
    if (mess == "G")     
    {
      Serial.println("ho ricevuto la G");
 while (Serial2.available()) {
   Serial.println("attendo la seriale");
    delay(3);  
    char c = Serial2.read();
    readString += c; 
  }
     temperatura=readString;
     Serial.println(temperatura);
      
    }

    else if (mess == "E")     
    {
 Serial.println("ho ricevuto la E");
     while (Serial2.available()) {
       Serial.println("attendo la seriale");
    delay(3);  
    char c = Serial2.read();
    readString += c; 
  }
     umidita=readString;
      Serial.println(umidita);
      
    }

    else if (mess == "Z")     
    {
 Serial.println("ho ricevuto la Z");
     while (Serial2.available()) {
       Serial.println("attendo la seriale");
    delay(3);  
    char c = Serial2.read();
    readString += c; 
  }
     icona=readString;
      Serial.println(icona);
      
    }
    readString="";
    mess=" ";
  }
  
  }

ma al monitor non mi compare nulla. non riesco a capire il motivo

forse ho capito il motivo. i dati che mi arrivano alla serial2 non entrano una alla volta ma entra come un pacchetto dati intero. miii che casino. adesso mi devo studiare come fare. Spero solo che sia cosi. Grazie comunque

Qualcuno mi può indicare come fare per leggere questi dati ? io non riesco UN AIUTO!!!

Scusa Gugliemo, ti spiace spiegarmi queste due istruzioni ? le ho viste in un tuo post.

if (Serial1.available() > 0) Serial.write(Serial1.read());
 if (Serial.available() > 0) Serial1.write(Serial.read());

non si usano le virgolette, ma gli apici

if (mess == 'G')     
    {
      Serial.println("ho ricevuto la G");

Ti ringrazio tanto per la correzione, ma io mi ritrovo adesso questa situazione. se invio i dati sul Serial, al monitor Seriale non visualizzo nulla. Però sono sicuro che i dati sono stati trasmessi.
Se tolgo il commento :

//Serial.println(readString);

Visualizzo i miei dati, ma non ottengo le altre funzioni. G-E-Z.
Non so se può aiutare ma i dati mi vengono dati da un ESP su un arduino Mega.
i dati sono temperatura, umidità e icona meteo.
Grazie

Prova questo

G8.2
E82%
Zclear

/*
  Modified Example of processing incoming serial data without blocking.
  Author:   Nick Gammon
*/

const unsigned int MAX_INPUT = 10; // how much serial data we expect before a newline
char temperatura[6];
char umidita[6];
char icona[6];

void setup ()  {
  Serial.begin (9600);
  Serial1.begin (9600);
}

void process_data (const char * data)
{
  char valore = data[0];
  switch (valore) {
    case 'G':
      for ( int i = 0; i < 6; i++ ) {
        temperatura[i] = data[i + 1];
      }
      break;
    case 'E':
      for ( int i = 0; i < 6; i++ ) {
        umidita[i] = data[i + 1];
      }
      break;
    case 'Z':
      for ( int i = 0; i < 6; i++ ) {
        icona[i] = data[i + 1];
      }
      break;
  }
}

void processIncomingByte (const byte inByte)
{
  static char input_line [MAX_INPUT];
  static unsigned int input_pos = 0;

  switch (inByte)
  {
    case '\n':   // end of text
      input_line [input_pos] = 0;  // terminating null byte
      process_data (input_line); // terminator reached! process input_line here
      input_pos = 0;  // reset buffer for next time
      break;
    case '\r':   // discard carriage return
      break;
    default:
      // keep adding if not full ... allow for terminating null byte
      if (input_pos < (MAX_INPUT - 1))
        input_line [input_pos++] = inByte;
      break;
  }  // end of switch
} // end of processIncomingByte

void loop()  {

  if (Serial1.available () > 0)
    processIncomingByte (Serial1.read ());

  Serial.print ("temperatura= ");
  Serial.print (temperatura);
  Serial.print ("    umidita= ");
  Serial.print (umidita);
  Serial.print ("    icona= ");
  Serial.println (icona);

}

Ciao Brunello, ti ringrazio tantissimo per l'aiuto, adesso va benissimo. Mi trovo questa situazione nel monitor seriale.
Ho sistemato l'icona meteto, perchè li mi esce scritto la condizione meteo, quindi ho tipo Fog, Clear,
Mostly Cloudy ecc. Adesso funziona, vedovo la parola a metà con attaccato il valore dell'umidità. adesso vorrei capire come fare per farlo aggiornare solo quando mi arriva il dato dall'ESP, non avere un loop continuo. Laggiornamento dal ESP mi arriva ogni 5 minuti.

temperatura= umidita= icona=
temperatura= umidita= icona=
temperatura= umidita= icona=
temperatura= umidita= icona=
temperatura= umidita= icona=
temperatura= umidita= icona=
temperatura= umidita= icona=
temperatura= 4.2 umidita= icona=
temperatura= 4.2 umidita= icona=
temperatura= 4.2 umidita= icona=
temperatura= 4.2 umidita= icona=
temperatura= 4.2 umidita= icona=
temperatura= 4.2 umidita= icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona=
temperatura= 4.2 umidita= 92% icona= Mostly92%
temperatura= 4.2 umidita= 92% icona= Mostly92%
temperatura= 4.2 umidita= 92% icona= Mostly92%
temperatura= 4.2 umidita= 92% icona= Mostly92%

Il dato corretto adesso lo vedo cosi

temperatura= 4.2 umidita= 92% icona= Mostly Cloudy

ma sempre in loop continuo.

Scusa se mi permetto, Alzarsi la mattina e trovare un programma rifatto e come alzarsi il 25/dicembre e trovare i regali sotto l'albero :slight_smile: . Grazie ancora

Per il loop continuo ...o metti un Delay alla fine o metti tutto in una funzione che chiami sempre con un ritardo o quando ti serve