Problema con LiquidLine

Estoy intentando hacer un codigo en el que utilizo un menu con liquidMenu y quiero ver la temperatura de varias habitaciones, aunque da error, aqui adjunto el codigo y el mensaje de error, ya no se que hacerle.


#include <LiquidCrystal_I2C.h>
#include <LiquidMenu.h>
#include <OneWire.h>
#include <DallasTemperature.h>

LiquidCrystal_I2C lcd(0x27, 16,2);

//Definimos sensores
  const int pinDatosDQ = 3;
  OneWire oneWireObjeto(pinDatosDQ);
  DallasTemperature sensorDS18B20(&oneWireObjeto);

//Definimos relees
  const int calefon = 8;
  const int electH1 = 9;
  const int electH2 = 10;
  const int electH3 = 11;
  const int electC = 12;
  const int bomba = 13;

//Nuestra forma de elegir relee
int relee_seleccionado=0;

//Defino Encoder
  #define outputA 6
  #define outputB 7
  #define sw 4
 
int aState;
int aLastState;  

// Defino Pantalla 1
LiquidLine linea1(0, 0); 
linea1.print("Hab.1: "); 
linea1.print(sensorDS18B20.getTempCByIndex(0));
linea1.print(" C."); 
LiquidLine linea2(0, 1);
linea2.print("Hab.2: ");
linea2.print(sensorDS18B20.getTempCByIndex(1));
linea2.print(" C."); 
LiquidLine linea3(0, 2);
linea3.print("Hab.3: "); 
linea3.print(sensorDS18B20.getTempCByIndex(2));
linea3.print(" C.");
LiquidLine linea4(0, 3); 
linea4.print("Living: "); 
linea4.print(sensorDS18B20.getTempCByIndex(3));
linea4.print(" C."); 
LiquidScreen pantalla1(linea1, linea2, linea3, linea4);


//Defino panalla que modifica la temperatura
  LiquidLine linea1_2(0,0 "Temp. deseada");
  LiquidLine linea2_2(1,1 fn_temp);
  LiquidLine linea3_2(1,0 "Atras");
  LiquidScreen pantallaModTemp(linea1_2,linea2_2,linea3_2);

LiquidMenu menu(lcd,pantalla1,pantallaModTemp);

void setup() {

  pinMode(sw.INPUT_PULLUP);

  lcd.begin(16,2);
  lcd.backlight();

  menu.init();
  //Indicador de posiscion
  linea1.set_focusPosition(Position::LEFT);
  linea2.set_focusPosition(Position::LEFT);
  linea3.set_focusPosition(Position::LEFT);
  linea4.set_focusPosition(Position::LEFT);
  //Funcion de cada linea
  linea1.attach_function(1, fn_H1);
  linea2.attach_function(1, fn_H2);
  linea3.attach_function(1, fn_H3);
  linea4.attach_function(1, fn_C);
  menu.add_screen(pantalla1);

  //Indicador de posiscion
  linea2_2.set_focusPosition(Position::LEFT);
  linea3_2.set_focusPosition(Position::LEFT);
  //Funcion de cada linea
  linea2_2.attach_function(1, fn_temp);
  linea3_2.attach_function(1, fn_atras);
  menu.add_screen(pantallaModTemp);

  //Se indicará la cantidad de lineas de cada pantalla
  pantalla1.set_displayLineCount(2);
  pantallaModTemp.set_displayLineCount(2);
  
  menu.set_focusedLine(0);

  Serial.begin(9600);
  sensorDS18B20.begin();

  pinMode(calefon, OUTPUT);
  pinMode(electH1, OUTPUT);
  pinMode(electH2, OUTPUT);
  pinMode(electH3, OUTPUT);
  pinMode(electC, OUTPUT);
  pinMode(bomba, OUTPUT);

  menu.update();
  
}

void loop(){
  sensorDS18B20.requestTemperatures();
  float tempH1 = sensorDS18B20.getTempCByIndex(0);
  float tempH2 = sensorDS18B20.getTempCByIndex(1);
  float tempH3 = sensorDS18B20.getTempCByIndex(2);
  float tempC = sensorDS18B20.getTempCByIndex(3);
  float agua = sensorDS18B20.getTempCByIndex(4);

  selectOption();

  aState=digitalRead(outputA);
    if (aState != aLastState){
      if (digitalRead(outputB) != aState){
        menu.switch_focus(false);
      } else{
        menu.switch_focus(true);
      }
      menu.update();
      aLastState=aState;
    }
  //Control de relee de habitación 1
    if (tempH1 < tempDeseadaH1 && tempAgua > 40) {
      // Enciende la electroválvula y la bomba de agua
      digitalWrite(pinReleElectrovalvula, LOW);
      digitalWrite(pinReleBombaAgua, LOW);
    } else if (tempH1 > tempDeseadaH1) {
      // Apaga la bomba de agua y cierra la electroválvula
      digitalWrite(pinReleBombaAgua, HIGH);
      digitalWrite(pinReleElectrovalvula, HIGH);
    }
  //Control de relee de habitación 2
    if (tempH2 < tempDeseadaH2 && tempAgua > 40) {
      // Enciende la electroválvula y la bomba de agua
      digitalWrite(pinReleElectrovalvula, LOW);
      digitalWrite(pinReleBombaAgua, LOW);
    } else if (tempH2 > tempDeseadaH2) {
      // Apaga la bomba de agua y cierra la electroválvula
      digitalWrite(pinReleBombaAgua, HIGH);
      digitalWrite(pinReleElectrovalvula, HIGH);
    }
  //Control de relee de habitación 3
    if (tempH3 < tempDeseadaH3 && tempAgua > 40) {
      // Enciende la electroválvula y la bomba de agua
      digitalWrite(pinReleElectrovalvula, LOW);
      digitalWrite(pinReleBombaAgua, LOW);
    } else if (tempH3 > tempDeseadaH3) {
      // Apaga la bomba de agua y cierra la electroválvula
      digitalWrite(pinReleBombaAgua, HIGH);
      digitalWrite(pinReleElectrovalvula, HIGH);
    }
  //Control de relee de comedor
    if (tempC < tempDeseadaC && tempAgua > 40) {
      // Enciende la electroválvula y la bomba de agua
      digitalWrite(pinReleElectrovalvula, LOW);
      digitalWrite(pinReleBombaAgua, LOW);
    } else if (tempC > tempDeseadaC) {
      // Apaga la bomba de agua y cierra la electroválvula
      digitalWrite(pinReleBombaAgua, HIGH);
      digitalWrite(pinReleElectrovalvula, HIGH);
    }  
  // Control del calefón
    if (tempAgua < 40) {
      // Enciende el calefón
      digitalWrite(pinReleCalefon, LOW);
    } else if (tempAgua > 50) {
      // Apaga el calefón
      digitalWrite(pinReleCalefon, HIGH);
    }

    delay(1000);

}
//Funciones
  //Selección de datos
    void selectOption(){
      if(digitalRead(sw) == LOW){
        Serial.print("boton");
        menu.call_function(1);
        delay(500);
      }
    }
  //Pantalla 1
    void fn_h1{
      menu.change_screen(2);
      menu.set_focusedLine(1);
      relee_seleccionado = 1;
    }
    void fn_h2{
      menu.change_screen(2);
      menu.set_focusedLine(1);
      relee_seleccionado = 2;  
    }
    void fn_h3{
      menu.change_screen(2);
      menu.set_focusedLine(1);
      relee_seleccionado = 3;
    }
    void fn_c{
      menu.change_screen(2);
      menu.set_focusedLine(1);
      relee_seleccionado = 4;
    }
  //Pantalla para modificar la temperatura
    void fn_temp{
      switch (relee_seleccionado){
        case 1:
          int tempDeseadaH1 = map(valorEncoder, 16, 32);
          }
          break;
        case 2:
          int tempDeseadaH2 = map(valorEncoder, 16, 32);
          break;
        case 3:
          int tempDeseadaH3 = map(valorEncoder, 16, 32);
          break;
        case 4:
          int tempDeseadaC = map(valorEncoder, 16, 32);
          break;
      }
    }
    void fn_atras{
      menu.change_screen(1);
      menu.set_focusedLine(0);
    }

Aquí el error


Moderador:
Postea el error usando etiquetas no uses capturas.
Agrega un nuevo post con los mensajes de error como si fueran código.

Esta plagado de errores de todo tipo.
Cosas puestas sin definir. Errores de sintaxis.
He corregido bastante pero quedan muchos mas.
Dejo hasta donde he hecho pero falta trabajo

#include <LiquidCrystal_I2C.h>
#include <LiquidMenu.h>
#include <OneWire.h>
#include <DallasTemperature.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

//Definimos sensores
const int pinDatosDQ = 3;
OneWire oneWireObjeto(pinDatosDQ);
DallasTemperature sensorDS18B20(&oneWireObjeto);

//Definimos relees
const int pinReleCalefon = 8;
const int pinReleElectH1 = 9;
const int pinReleElectH2 = 10;
const int pinReleElectH3 = 11;
const int pinReleElectrovalvula  = 12;
const int pinReleBombaAgua   = 13;

//Nuestra forma de elegir relee
int relee_seleccionado = 0;

//Defino Encoder
#define outputA 6
#define outputB 7
#define sw 4

int aState;
int aLastState;
void fn_atras();
void fn_temp();
void fn_H1();
void fn_H2();
void fn_H3();
void fn_C();

float temp0 = sensorDS18B20.getTempCByIndex(0);
float temp1 = sensorDS18B20.getTempCByIndex(1);
float temp2 = sensorDS18B20.getTempCByIndex(2);
float temp3 = sensorDS18B20.getTempCByIndex(3);
float tempDeseadaH1, tempDeseadaH2, tempDeseadaH3,
      tempDeseadaC, tempAgua;
unsigned long valorEncoder = 0;      

// Defino Pantalla 1
LiquidLine linea1(0, 0," Hab.1: ", temp0, " C");
LiquidLine linea2(0, 1," Hab.2: ", temp1, " C");
LiquidLine linea3(0, 2," Hab.3: ", temp2, " C");
LiquidLine linea4(0, 3,"Living: ", temp3, " C");

LiquidScreen pantalla1(linea1, linea2, linea3, linea4);

//Defino panalla que modifica la temperatura
LiquidLine linea1_2(0, 0, "Temp. deseada");
LiquidLine linea2_2(1, 1, fn_temp);
LiquidLine linea3_2(1, 0, "Atras");
LiquidScreen pantallaModTemp(linea1_2, linea2_2, linea3_2);

LiquidMenu menu(lcd, pantalla1, pantallaModTemp);



void setup() {

  pinMode(sw, INPUT_PULLUP);
  //lcd.begin(16, 2);
  lcd.backlight();

  menu.init();
  //Indicador de posiscion
  linea1.set_focusPosition(Position::LEFT);
  linea2.set_focusPosition(Position::LEFT);
  linea3.set_focusPosition(Position::LEFT);
  linea4.set_focusPosition(Position::LEFT);
  //Funcion de cada linea
  linea1.attach_function(1, fn_H1);
  linea2.attach_function(1, fn_H2);
  linea3.attach_function(1, fn_H3);
  linea4.attach_function(1, fn_C);
  menu.add_screen(pantalla1);

  //Indicador de posiscion
  linea2_2.set_focusPosition(Position::LEFT);
  linea3_2.set_focusPosition(Position::LEFT);
  //Funcion de cada linea
  linea2_2.attach_function(1, fn_temp);
  linea3_2.attach_function(1, fn_atras);
  menu.add_screen(pantallaModTemp);

  //Se indicará la cantidad de lineas de cada pantalla
  pantalla1.set_displayLineCount(2);
  pantallaModTemp.set_displayLineCount(2);

  menu.set_focusedLine(0);

  Serial.begin(9600);
  sensorDS18B20.begin();

  pinMode(pinReleCalefon, OUTPUT);
  pinMode(pinReleElectH1, OUTPUT);
  pinMode(pinReleElectH2, OUTPUT);
  pinMode(pinReleElectH3, OUTPUT);
  pinMode(pinReleElectrovalvula, OUTPUT);
  pinMode(pinReleBombaAgua, OUTPUT);

  menu.update();

}

// void setup() {
//   lcd.init();
//   lcd.backlight();
//   lcd.clear();
//   lcd.setCursor(0,0);
//   lcd.print(" FELIZ NAVIDAD ");  // Texto en LCD, linea 1
//   lcd.setCursor(0,1);
//   lcd.print("y PROSPERO 2050"); //  Texto en LCD, linea 2
//   delay(4000);                  // 4 Seg.
// }
void loop() {
  sensorDS18B20.requestTemperatures();
  float tempH1 = sensorDS18B20.getTempCByIndex(0);
  float tempH2 = sensorDS18B20.getTempCByIndex(1);
  float tempH3 = sensorDS18B20.getTempCByIndex(2);
  float tempC = sensorDS18B20.getTempCByIndex(3);
  float agua = sensorDS18B20.getTempCByIndex(4);

  selectOption();

  aState = digitalRead(outputA);
  if (aState != aLastState) {
    if (digitalRead(outputB) != aState) {
      menu.switch_focus(false);
    } else {
      menu.switch_focus(true);
    }
    menu.update();
    aLastState = aState;
  }
  //Control de relee de habitación 1
  if (tempH1 < tempDeseadaH1 && tempAgua > 40) {
    // Enciende la electroválvula y la bomba de agua
    digitalWrite(pinReleElectrovalvula, LOW);
    digitalWrite(pinReleBombaAgua, LOW);
  } else if (tempH1 > tempDeseadaH1) {
    // Apaga la bomba de agua y cierra la electroválvula
    digitalWrite(pinReleBombaAgua, HIGH);
    digitalWrite(pinReleElectrovalvula, HIGH);
  }
  //Control de relee de habitación 2
  if (tempH2 < tempDeseadaH2 && tempAgua > 40) {
    // Enciende la electroválvula y la bomba de agua
    digitalWrite(pinReleElectrovalvula, LOW);
    digitalWrite(pinReleBombaAgua, LOW);
  } else if (tempH2 > tempDeseadaH2) {
    // Apaga la bomba de agua y cierra la electroválvula
    digitalWrite(pinReleBombaAgua, HIGH);
    digitalWrite(pinReleElectrovalvula, HIGH);
  }
  //Control de relee de habitación 3
  if (tempH3 < tempDeseadaH3 && tempAgua > 40) {
    // Enciende la electroválvula y la bomba de agua
    digitalWrite(pinReleElectrovalvula, LOW);
    digitalWrite(pinReleBombaAgua, LOW);
  } else if (tempH3 > tempDeseadaH3) {
    // Apaga la bomba de agua y cierra la electroválvula
    digitalWrite(pinReleBombaAgua, HIGH);
    digitalWrite(pinReleElectrovalvula, HIGH);
  }
  //Control de relee de comedor
  if (tempC < tempDeseadaC && tempAgua > 40) {
    // Enciende la electroválvula y la bomba de agua
    digitalWrite(pinReleElectrovalvula, LOW);
    digitalWrite(pinReleBombaAgua, LOW);
  } else if (tempC > tempDeseadaC) {
    // Apaga la bomba de agua y cierra la electroválvula
    digitalWrite(pinReleBombaAgua, HIGH);
    digitalWrite(pinReleElectrovalvula, HIGH);
  }
  // Control del calefón
  if (tempAgua < 40) {
    // Enciende el calefón
    digitalWrite(pinReleCalefon, LOW);
  } else if (tempAgua > 50) {
    // Apaga el calefón
    digitalWrite(pinReleCalefon, HIGH);
  }

  delay(1000);

}
//Funciones
//Selección de datos
void selectOption() {
  if (digitalRead(sw) == LOW) {
    Serial.print("boton");
    menu.call_function(1);
    delay(500);
  }
}
//Pantalla 1
void fn_H1() {
  menu.change_screen(2);
  menu.set_focusedLine(1);
  relee_seleccionado = 1;
}
void fn_H2() {
  menu.change_screen(2);
  menu.set_focusedLine(1);
  relee_seleccionado = 2;
}
void fn_H3() {
  menu.change_screen(2);
  menu.set_focusedLine(1);
  relee_seleccionado = 3;
}
void fn_C () {
  menu.change_screen(2);
  menu.set_focusedLine(1);
  relee_seleccionado = 4;
}
//Pantalla para modificar la temperatura
void fn_temp() {
  switch (relee_seleccionado) {
    case 1:
      int tempDeseadaH1 = constrain(valorEncoder, 16, 32);
      break;
    case 2:
      int tempDeseadaH2 = constrain(valorEncoder, 16, 32);
      break;
    case 3:
      int tempDeseadaH3 = constrain(valorEncoder, 16, 32);
      break;
    case 4:
      int tempDeseadaC = constrain(valorEncoder, 16, 32);
      break;
  }
}

void fn_atras() {
  menu.change_screen(1);
  menu.set_focusedLine(0);
}

Errores aún

In file included from sketch.ino:2:0:
/libraries/LiquidMenu/src/LiquidMenu.h:52:123: note: #pragma message: LiquidMenu: Selected 'LiquidCrystal' (parallel) library. Edit 'LiquidMenu_config.h' file to change it.
 # pragma message ("LiquidMenu: Selected 'LiquidCrystal' (parallel) library. Edit 'LiquidMenu_config.h' file to change it.")
                                                                                                                           ^
sketch.ino:60:48: error: no matching function for call to 'LiquidMenu::LiquidMenu(LiquidCrystal_I2C&, LiquidScreen&, LiquidScreen&)'
 LiquidMenu menu(lcd, pantalla1, pantallaModTemp);
                                                ^
In file included from sketch.ino:2:0:
/libraries/LiquidMenu/src/LiquidMenu.h:847:3: note: candidate: LiquidMenu::LiquidMenu(LiquidCrystal&, LiquidScreen&, LiquidScreen&, LiquidScreen&, LiquidScreen&, uint8_t)
   LiquidMenu(DisplayClass &liquidCrystal, LiquidScreen &liquidScreen1,
   ^~~~~~~~~~
/libraries/LiquidMenu/src/LiquidMenu.h:847:3: note:   candidate expects 6 arguments, 3 provided
/libraries/LiquidMenu/src/LiquidMenu.h:833:3: note: candidate: LiquidMenu::LiquidMenu(LiquidCrystal&, LiquidScreen&, LiquidScreen&, LiquidScreen&, uint8_t)
   LiquidMenu(DisplayClass &liquidCrystal, LiquidScreen &liquidScreen1,
   ^~~~~~~~~~
/libraries/LiquidMenu/src/LiquidMenu.h:833:3: note:   candidate expects 5 arguments, 3 provided
/libraries/LiquidMenu/src/LiquidMenu.h:821:3: note: candidate: LiquidMenu::LiquidMenu(LiquidCrystal&, LiquidScreen&, LiquidScreen&, uint8_t)
   LiquidMenu(DisplayClass &liquidCrystal, LiquidScreen &liquidScreen1,
   ^~~~~~~~~~
/libraries/LiquidMenu/src/LiquidMenu.h:821:3: note:   no known conversion for argument 1 from 'LiquidCrystal_I2C' to 'LiquidCrystal&'
/libraries/LiquidMenu/src/LiquidMenu.h:810:3: note: candidate: LiquidMenu::LiquidMenu(LiquidCrystal&, LiquidScreen&, uint8_t)
   LiquidMenu(DisplayClass &liquidCrystal, LiquidScreen &liquidScreen,
   ^~~~~~~~~~
/libraries/LiquidMenu/src/LiquidMenu.h:810:3: note:   no known conversion for argument 1 from 'LiquidCrystal_I2C' to 'LiquidCrystal&'
/libraries/LiquidMenu/src/LiquidMenu.h:801:3: note: candidate: LiquidMenu::LiquidMenu(LiquidCrystal&, uint8_t)
   LiquidMenu(DisplayClass &liquidCrystal, uint8_t startingScreen = 1);
   ^~~~~~~~~~
/libraries/LiquidMenu/src/LiquidMenu.h:801:3: note:   candidate expects 2 arguments, 3 provided
/libraries/LiquidMenu/src/LiquidMenu.h:785:7: note: candidate: constexpr LiquidMenu::LiquidMenu(const LiquidMenu&)
 class LiquidMenu {
       ^~~~~~~~~~
/libraries/LiquidMenu/src/LiquidMenu.h:785:7: note:   candidate expects 1 argument, 3 provided
/libraries/LiquidMenu/src/LiquidMenu.h:785:7: note: candidate: constexpr LiquidMenu::LiquidMenu(LiquidMenu&&)
/libraries/LiquidMenu/src/LiquidMenu.h:785:7: note:   candidate expects 1 argument, 3 provided

Error during build: exit status 1

Aca tienes el trabajo simulado.

Creo que el Enconder esta mal simulado pero es cuestión de estudiarlo.

Bueno, lo que no funciona a continuación es problema de la librería asi que trabajo en vano.
Lo que no quita que tu código adolece de inumerables errores.
Nombre de variables equivocados o no definidos.
Pones Calefon como rele pin y luego llamas pinReleCalefon? Cómo no te diste cuenta.
Variables sin definir para controlar las temperaturas?

Lo primero que debes hacer siempre es poner un ejemplo d ela librería y ver si compila.
La librería no esta desactualizada. Debería funcionar.

Bueno encontré el problema. Es la librería I2C. No se cual debe usarse pero no es la que yo uso claramente.

Esta es la librería que debes usar

Sin embargo no logro que funcione.
Debo hacer otra cosa asi que lo dejo pendiente.

En resumen el ejemplo I2C de la librería LiquidMenu no compila, arroja los mismos errores que el código que te he corregido. Asi que x ahi debes seguir.

Muchas gracias, el error que estas teniendo es culpa de LiquidMenu, ya que para poder utilizarlo ay que configurarlo en base a los archivos internos de la librería (igualmente utilice la versión 1.5.1 para poder modificarlo). Luego de aplicar los cambios que me has dado compilo, con algunos errores (que no los pude sacar, ya que los tuve con la prueba de otro proyecto). Muchísimas gracias por la ayuda.

Yo lo probé con LCD paralelo y funcionaba por eso edité un comentario en que decia que la librería tenia un problema. Funciona. Con I2C no pude hacer que funcione.