Uscire dal menù

salve a tutti, io ho un problema con il seguente programma.

#include<SimpleDHT.h> //libreria del DHT22
//librerie per l' I2C e lo schermo lcd
#include<Wire.h>
#include<LiquidCrystal_I2C.h>

//PIN LCD
#define I2C_ADDR 0x27 //indica la porta del dispositivo i2c
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7




float hum_iniziale;    //umidità interna iniziale (incubatrice spenta)
float t_iniziale;  //temperatura interna iniziale (incubatrice spenta)
int piastra_riscaldante = 6;   //pin del rele per la piastra riscaldante
int pin_macanza_acqua = 4;   //LED di sengalazione mancanza acqua
int pindht22 = 5;   //pin del DHT22
int bottone_encoder = A0;  //pressione encoder
int A_encoder = 9;    //pin A dell'encoder rotativo
int B_encoder = 10; //pin B dell'encoder rotativo
int letturaPrecedente = HIGH;   //valore per la lettura di stato dell'encoder
int valore; //valore encoder rotativo
bool state; //stato del funzionamento del menu
bool i; //stato del funzionamento dei secondi sottomenu


LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
SimpleDHT22 dht22(pindht22);





//controllo temperatura & controllo umidità
float tmp() {
  delay(1000);
  float tmp = 0;
  float hum = 0;
  dht22.read2(&tmp, &hum, NULL); //leggo il valore dell'umidità e della temperatura e l'associo alle variabili precedentemente create
  if (hum <= hum_iniziale) {
    digitalWrite(pin_macanza_acqua, HIGH);
  } else {
    digitalWrite(pin_macanza_acqua, LOW);
    lcd.clear();
  }
  Serial.print("Temp: ");
  Serial.print(tmp);
  Serial.println("°C");
  Serial.print("L'umidità è al: ");
  Serial.print(hum);
  Serial.println("%");
  return tmp;
}






//funzione per il valore dell'encoder rotativo
int freccia() {
  int n = digitalRead(A_encoder);
  if ((letturaPrecedente == HIGH) && (n == LOW)) {
    if (digitalRead(B_encoder) == HIGH) {
      valore--;
    } else {
      valore++;
    }

  }
  letturaPrecedente = n;
  Serial.println(valore);
  return valore;
}



int  menu() {
  int posizione;
  int x = freccia();
  lcd.setCursor(2, 0);
  lcd.print("Settings");
  lcd.setCursor(2, 1);
  lcd.print("Start");
  if (x >= 1) {
    posizione = 1;
  } else {
    posizione = 0;
  }
  int s = posizione - 1;
  lcd.setCursor(1, posizione);
  lcd.print(">");
  lcd.setCursor(1, s);
  lcd.print(" ");
  return posizione;
}

int  settings() {
  if (digitalRead(bottone_encoder) == HIGH) {
    int posizione;
    int x = freccia();
    lcd.setCursor(2, 0);
    lcd.print("Temperature");
    lcd.setCursor(2, 1);
    lcd.print("Days");
    if (x >= 1) {
      posizione = 1;
    } else {
      posizione = 0;
    }
    int s = posizione - 1;
    lcd.setCursor(1, posizione);
    lcd.print(">");
    lcd.setCursor(1, s);
    lcd.print(" ");
    if (digitalRead(bottone_encoder) == LOW) {
      switch (posizione) {
        case 0:
          i = true;
          state = false;
          lcd.clear();
          while (i = true) {
            temperature();
          }
          break;
        case 1:
          i = true;
          state = false;
          lcd.clear();
          while (i = true) {
            day();
          }
          break;
      }
    }
  }

}


int temperature() {
  if (digitalRead(bottone_encoder) == HIGH) {
    int x = freccia();
    lcd.setCursor(0, 0);
    lcd.print("Temperaure:");
    lcd.setCursor(0, 1);
    lcd.print(x);
    lcd.setCursor(2, 1);
    lcd.print(".");
    if (digitalRead(bottone_encoder) == LOW) {
      while (i = true) {
        if (digitalRead(bottone_encoder) == HIGH) {
          int y = freccia();
          lcd.setCursor(3, 1);
          lcd.print(y);
          if (digitalRead(bottone_encoder) == LOW) {
            Serial.println("fin qui ci arriva");
          }
        }
      }
    }
  }
}


int day() {
  int x = freccia();
  lcd.setCursor(0, 0);
  lcd.print("Days:");
  lcd.setCursor(0, 1);
  lcd.print(x);

}


void setup()
{
  Serial.begin(9600);//pin seriale
  //PIN DELLO SCHERMO LCD
  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home();
  //*****************************************
  pinMode(piastra_riscaldante, OUTPUT); //pin relè piastra
  pinMode(pin_macanza_acqua, OUTPUT);   // pin led segnalazione mancanza d'acqua
  pinMode(bottone_encoder, INPUT_PULLUP); //pin funzione bottone dell'encoder
  pinMode(A_encoder, INPUT_PULLUP);   //pin funzione s.orario encoder
  pinMode(B_encoder, INPUT_PULLUP);   //pin funzione s.antiorario del motore
  dht22.read2(&t_iniziale, &hum_iniziale, NULL); //salvo nella v.g. il valore iniziale dell'umidità dell'incubatrice
  valore = 0;
  i = false;
  state = false;
}










void loop() {
  menu();
  if (digitalRead(bottone_encoder) == LOW) {
    Serial.println("Click");
    switch (valore) {
      case 0:
        state = true;
        lcd.clear();
        while (state = true) {
          settings();
        }
        break;
      case 1:
        //start();
        break;
    }
  }
}

il problema è che nella funzione temperature() mi viene visualizzato l’ultimo click (che sarebbe quello per uscire dalla funzione temperature e rientrare in setting) ma nn riesco a tornare alla funzione settings()

P.S. lasciate stare il fatto che devo salvare x e y per dopo ma quello so già come risolverlo

Cioè ti stampa "fino qui ci arriva" ? Ok, ma arrivato li, o metti un break; o metti i=false; altrimenti il while continua a scorrere... o non ho capito il problema?

Ciao, Ale.

ilguargua:
Cioè ti stampa "fino qui ci arriva" ? Ok, ma arrivato li, o metti un break; o metti i=false; altrimenti il while continua a scorrere... o non ho capito il problema?

Hm, veramente è tutto il codice che andrebbe rivisto, generalmente queste cose si fanno con una "macchina a stati finiti" o quantomeno con una variabile che indica lo stato, e fare tutto nel loop(), invece quando vedo funzioni con dei while() interni (durante i quali Arduino non può fare assolutamente nulla di diverso) mi si "intreccia" il cervello.. :wink:
E soprattutto quando vedo "while ( i = true)" capisco che c'è qualcosa che l'autore non ha ancora ben appreso. Il linguaggio C. :wink: Ora mi spiego:

ilPanzer:
salve a tutti, io ho un problema con il seguente programma.

Il problema di quella funzione è, appunto, che tu hai scritto:

      while (i = true) {

Due considerazioni:

  1. se la variabile "i" è booleana, basta fare "while (i) {"
  2. e questo è il grosso problema, "i = true" in C non è una condizione ma una assegnazione. Stai assegnando ad "i" il valore "true" e quindi questa assegnazione valendo sempre "true" non ti farà mai uscire dal while()! Devi usare l'operatore"==" non "=".

Nel prossimo post magari se ho tempo ti do' anche qualche altro consiglio...