Pages: [1]   Go Down
Author Topic: Problema comando GOTO  (Read 409 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E' molto lungo ma è da migliorare comunque è questo:
Code:
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;
          }

        }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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);

}
« Last Edit: June 04, 2013, 03:04:42 am by leo72 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Pages: [1]   Go Up
Jump to: