Problema comando GOTO

Salve, sono di nuovo alla richiesta di un aiutino =).
Il mio problema è il mal funzionamento della funzione GOTO, cioè il salto incondizionato. Purtroppo mi è strettamente necessario per il continuo della mia stazione meteorologica.
Io scrivo dentro una if goto connessione; e poi apro un etichetta nel punto adatto del programma così: connessione: Tutto andava a gonfie vele fino a che non aggiungo altri goto connessione in altre parti del programma. Adesso mi segnala questo errore: Jump to label connessione. Dove sbaglio, e sopratutto è possibile che esista un altro comando per il salto incondizionato. Grazie in anticipo.

questi goto connessione devono andare tutti alla stessa label connessione? o ci sono più label con lo stesso nome? questo potrebbe essere un problema
poi comunque devi fare attenzione che il goto può mandare solo a label presenti nella funzione in cui è stato chiamato
es:

void loop()
{
 start:

 if(random(2)) 
    goto start; // funziona perchè la label è nella stessa funzione

 a();
}

void a()
{
 goto start; // non funziona
}

controlla che nel tuo codice non ci sia qualcosa del genere e magari postalo

Si vanno tutti al label connessione e sono tutti nel void loop.

prova a postare il codice, è difficile indovinare al primo colpo senza vedere il codice :slight_smile:
quando compili cosa ti da come errore?

E' molto lungo ma è da migliorare comunque è questo:

void loop(){
  // Acquisizione stato del pulsante 1 : 1/0
  val_puls1 = digitalRead(buttonPin);

  // Se val_puls1 = 1 Acquisisce i dati dai sensori e li stampa nel display 
  if(val_puls1 == 1 || statostampa < 1){
    lcd.backlight();
    lcd.clear(); 
    lcd.print("      MENU");
    delay(1000);
    {
      for( int a=0; a<100000; a++) {
        newPosition = myEnc.read();

        //fondo scala rotazione continua 
        while(newPosition < 0)
        {
          myEnc.write(15);
          newPosition = 15;
        }
        while(newPosition >15)
        {
          myEnc.write(0);
          newPosition = 0;
        }

        //lettura posizione encoder
inizio:

        newPosition = myEnc.read();

        if ( newPosition >= 0 && newPosition <=5 )
        {

          lcd.clear();
          delay(200);
          lcd.print("Visualizza Dati");

          while (newPosition >= 0 && newPosition <= 5)
          {
            for( int tempo=0; tempo <100000; tempo++){
              if(newPosition <0 || newPosition >5){
                goto inizio;
              } 
              if(val_connessione == 10000){
                goto connessione;
              }
              button = digitalRead(buttonPin);
              if (button == 1)
              {

                newPosition = 0;
                for(int stampa = 0; stampa < 100000; stampa ++)
                {

                  newPosition = myEnc.read();

                  //fondo scala rotazione continua 
                  while(newPosition < 0)
                  {
                    myEnc.write(26);
                    newPosition = 26;
                  }
                  while(newPosition > 26)
                  {
                    myEnc.write(0);
                    newPosition = 0;
                  }
                  delay(200);
dopo:
                  if (newPosition >=0 && newPosition <=5 )
                  {
                    lcd.clear();
                    lcd.print("Temperatura ");

                    while (newPosition >=0 && newPosition <=5)
                    {
                      for( int tempo=0; tempo <100000; tempo++){
                        if(newPosition <0 || newPosition >5){
                          goto dopo;
                        } 
                        if(val_connessione == 10000){
                          int due=1;
                          goto connessione;
                        }

                        button = digitalRead(buttonPin);
                        if (button == 1)
                        {
                          lcd.clear();
                          temperatura = dht.readTemperature();
                          lcd.print("Temp: ");
                          lcd.print(temperatura);
                          lcd.print(" *C"); 
                          delay(300);
                        } 
                        newPosition = myEnc.read();
                        oldPosition = newPosition; 
                        val_connessione = val_connessione + 1;  
                        delay(1); 
                      }  
                      newPosition = myEnc.read();
                      oldPosition = newPosition;     
                    }  
                  }

                  if ( newPosition >5 && newPosition <=10 )    
                  {
                    lcd.clear();
                    lcd.print("Umidita");

                    while (newPosition >5 &&  newPosition <=10)
                    {
                      for( int tempo=0; tempo <100000; tempo++){
                        if(newPosition <=5 || newPosition >10){
                          goto dopo;
                        }

                        if(val_connessione == 10000){
                          int due=1;
                          goto connessione;
                        }
                        button = digitalRead(buttonPin);
                        if (button == 1)
                        {
                          lcd.clear();
                          umidita = dht.readHumidity();
                          lcd.print("Umid: ");
                          lcd.print(umidita);
                          lcd.print(" %");
                          delay(300);
                        } 
                        newPosition = myEnc.read();
                        oldPosition = newPosition; 
                        val_connessione = val_connessione + 1;  
                        delay(1); 
                      }  
                      newPosition = myEnc.read();
                      oldPosition = newPosition; 
                    }  
                  }

                  if ( newPosition > 10 && newPosition <=15 )    
                  {
                    lcd.clear();
                    lcd.print("Luminosita");

                    while (newPosition > 8 && newPosition <= 15)
                    {

                      button = digitalRead(buttonPin);
                      if (button == 1)
                      {
                        lcd.clear();

                        luminosita_value = analogRead(luminosita);
                        luminosita_valore = ((luminosita_value / 1000) * 100);
                        lcd.print("Lum: ");
                        lcd.print(luminosita_valore);
                        lcd.print(" %");
                        delay(300);
                      } 
                      newPosition = myEnc.read();
                      oldPosition = newPosition;     
                    }  
                  }

                  if ( newPosition >15 && newPosition <=20 )    
                  {
                    lcd.clear();
                    lcd.print("Pres. Atmosferica");


                    while (newPosition >15 && newPosition <=20)
                    {

                      button = digitalRead(buttonPin);
                      if (button == 1)
                      {
                        lcd.clear();

                        pressione = mpl115a2.getPressure();  
                        controllo = mpl115a2.getTemperature();
                        lcd.print("P.A.= ");
                        lcd.print(pressione);
                        lcd.print(" kPa");
                        delay(1000);
                      } 
                      newPosition = myEnc.read();
                      oldPosition = newPosition;     
                    }   
                  }

                  if ( newPosition > 20 && newPosition <=25 )    
                  {
                    lcd.clear();
                    lcd.print("Precipitazione");


                    while (newPosition > 20 && newPosition <=25)
                    {

                      button = digitalRead(buttonPin);
                      if (button == 1)
                      {
                        lcd.clear();
                        lcd.setCursor(0, 0);
                        lcd.print("Precipitazioni");
                        lcd.setCursor(0, 16);
                        lcd.print(stringa1);
                        delay(1000);
                      } 
                      newPosition = myEnc.read();
                      oldPosition = newPosition;     
                    } 
                  } 

                  if ( newPosition > 25 && newPosition <=30 )    
                  {
                    lcd.clear();
                    lcd.print("Esci");


                    while (newPosition > 25 && newPosition <= 30)
                    {

                      button = digitalRead(buttonPin);
                      if (button == 1)
                      {
                        button=0;
                        newPosition=0;
                        goto inizio;
                      } 
                      newPosition = myEnc.read();
                      oldPosition = newPosition;     
                    } 
                  }
                  delay(1); 
                }
              } 
              newPosition = myEnc.read();
              oldPosition = newPosition; 
              val_connessione = val_connessione + 1;  
              delay(1); 
            }  

            newPosition = myEnc.read();
            oldPosition = newPosition; 
          }

        }
if ( newPosition > 5 && newPosition <=10 )
        {

          lcd.backlight();
          lcd.clear();
          lcd.print("Connetti");
          while (newPosition > 5 && newPosition <=10)
          {
            for(int tempo=0; tempo <99999; tempo++){
              if(newPosition <=5 || newPosition >10){
                goto inizio;
              } 
              if(val_connessione == 10000){
                goto connessione;
              }
              delay(200);
              button = digitalRead(buttonPin);
              if (button == 1)
              {
connessione:
                // Acquisizione dati di temperatura e umidità da sensore DHT22
                umidita = dht.readHumidity();
                temperatura = dht.readTemperature();

                // Acquisizione dati luminosità.
                luminosita_value = analogRead(luminosita);
                luminosita_valore = ((luminosita_value / 1000) * 100);

                //Acquisizone dati pressione atmosferica
                pressione = mpl115a2.getPressure();  
                controllo = mpl115a2.getTemperature();
                //Stampa la scritta "Connessione in corso  ..." sul Display LCD 16x2
                lcd.clear(); // Pulizia Display LCD 16x2
                lcd.setCursor(0, 0);
                lcd.print("Connessione in ");
                lcd.setCursor(0, 16);
                lcd.print("corso  ...");
                if (Ethernet.begin(mac) == 0) 
                {
                  lcd.clear(); // Pulizia Display LCD 16x2

                  //Stampa la scritta "Config. Eth. errata" sul Display LCD 16x2
                  lcd.setCursor(0, 0);
                  lcd.print("Config. Eth. ");
                  lcd.setCursor(0, 16);  
                  lcd.print("errata");
                }






                delay(2000); // Pausa 2 secondo

                // Connessione
                if (client.connect(server, 80)) 
                {
                  lcd.clear(); // Pulizia Display LCD 16x2
                  //Stampa la scritta "Connessione effettuata" sul Display LCD 16x2
                  lcd.setCursor(0, 0);
                  lcd.print("Connessione");
                  lcd.setCursor(0, 16);
                  lcd.print("effettuata");

                  delay(2000); // Pausa 2 secondo 

                  lcd.clear(); // Pulizia Display LCD 16x2 

                  //Stampa la scritta "Invio dei dati" sul Display LCD 16x2
                  lcd.setCursor(0, 0);
                  lcd.print("Invio dei ");
                  lcd.setCursor(0, 16);
                  lcd.print("dati");

                  // Invio dati al Database
                  if (isnan(temperatura) || isnan(umidita))
                  {
                    client.print("GET http://www.meteoiisavogadro.altervista.org/insert.php?Luminosita=");
                    client.print(luminosita_valore);
                    client.print("&Temperatura=");
                    client.print("ERR1");
                    client.print("&Umidita=");
                    client.print("ERR2");
                    client.print("&Pressione_atmosferica");
                    client.print(pressione);
                    client.print("&invia=cometipare/HTTP/1.1");
                    client.println();
                  }

                  if(controllo < 0){
                    client.print("GET http://www.meteoiisavogadro.altervista.org/insert.php?Luminosita=");
                    client.print(luminosita_valore);
                    client.print("&Temperatura=");
                    client.print(temperatura);
                    client.print("&Umidita=");
                    client.print(umidita);
                    client.print("&Pressione_atmosferica");
                    client.print("ERR3");
                    client.print("&invia=cometipare/HTTP/1.1");
                  }
                  if (isnan(temperatura) || isnan(umidita) && (controllo < 0))
                  {
                    client.print("GET http://www.meteoiisavogadro.altervista.org/insert.php?Luminosita=");
                    client.print(luminosita_valore);
                    client.print("&Temperatura=");
                    client.print("ERR1");
                    client.print("&Umidita=");
                    client.print("ERR2");
                    client.print("&Pressione");
                    client.print("ERR3");
                    client.print("&invia=cometipare/HTTP/1.1");
                    client.println();
                  }
                  else
                  {
                    client.print("GET http://www..altervista.org/insert.php?Luminosita=");
                    client.print(luminosita_valore);
                    client.print("&Temperatura=");
                    client.print(temperatura);
                    client.print("&Umidita=");
                    client.print(umidita);
                    client.print("&Pressione=");
                    client.print(pressione);
                    client.print("&invia=cometipare/HTTP/1.1");
                    client.println();
                  }


                  delay(2000);

                  lcd.clear(); // Pulizia Display LCD 16x2
                  // Stampa la scritta "Disconnessione in corso  ..." sul Dispkay LCD 16x2
                  lcd.setCursor(0, 0);
                  lcd.print("Disconnessione ");
                  lcd.setCursor(0, 16);
                  lcd.print("in corso  ...");

                  delay(2000); // Pausa 2 secondi

                  //Disconnessione
                  client.stop();

                  lcd.clear(); // Pulizia Display LCD 16x2
                  //Stampa la scritta "Disconnessione effettuata" sul Display LCD 16x2
                  lcd.setCursor(0, 0);
                  lcd.print("Disconnessione ");
                  lcd.setCursor(0, 16);
                  lcd.print("effettuata");

                  delay(2000); // Pausa 2 secondi
                  statoconnessione = 0;
                  luce = 0;
                  newPosition = 5;
                  goto inizio;
                } 
                else {
                  lcd.clear();
                  // Stampa la scritta "Connessione fallita" sul Display LCD 26x2
                  lcd.setCursor(0, 0);
                  lcd.print("Connessione ");
                  lcd.setCursor(0, 16);
                  lcd.print("fallita");
                  delay(2000); // Pausa 2 secondi
                  statoconnessione = 0;
                  luce = 0;
                  newPosition = 5;
                  goto inizio;
                }
              }
              newPosition = myEnc.read();
              oldPosition = newPosition; 
              val_connessione = val_connessione + 1;  
              delay(1); 
            }   
            newPosition = myEnc.read();
            oldPosition = newPosition; 
          }
        }            
        if ( newPosition > 11 && newPosition <=15 )    
        {
          lcd.clear();
          lcd.print("Spegni LCD");



          while (newPosition > 11 && newPosition <= 15)
          {
            for( int tempo=0; tempo <100000; tempo++){
              if(newPosition <=11 || newPosition >){
                goto inizio;
              } 
              if(val_connessione == 10000){
                goto connessione;
              }
              delay(200);
              button = digitalRead(buttonPin);
              if (button == 1)
              {
                button=0;
                newPosition = 0 ;
                oldPosition = newPosition; 
                goto fine;
              } 
              newPosition = myEnc.read();
              oldPosition = newPosition; 
              val_connessione = val_connessione + 1;  
              delay(1); 
            }  
            newPosition = myEnc.read();
            oldPosition = newPosition;     
          } 
        }
        delay(1);
      }

      val_connessione = val_connessione + 1;
      delay(1);
    }
  }



  else{
fine:
    delay(200);    
    lcd.noBacklight();
    lcd.clear();
  }


  statoconnessione = statoconnessione + 1;
  statostampa = 1;
  delay(1);

}

Finché il goto lo mantenevo nella prima grande IF non dava problemi. Al momento che l'ho integrata anche nella seconda e nella terza if principale del programma da questo errore.

Normalemte in C non é necessario usare goto. Ci sono rari casi dove é un vantaggio usarlo ma non é il Tuo caso.

Guardando il Tuo codice noto che usi troppo spesso dei Delay.
Non usi F() nei lcd.print e client.print. In questo modo consumi molta RAm che puó quando é terminata fare strane cose allo sketch.
usa per esempio al posto di:
client.print("&Umidita=");

client.print(F("&Umidita=")); Cosí il testo resta solo nella flesh e non viene copiata nella RAM.

Devi mettere il codice in funzioni e non scrivere tutto in un blocco ( in tedesco si chiama Spaghetticode, perché lungo come uno spaghetto) Quel codice é illegibile. Mancano le dichiarazioni delle variabili e il setup()

Allega tutto lo sketch come file allegato.

Ciao Uwe