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