desktop

Tengo problemas con LiquidLine y LiquidMenu

Estoy intentando hacer un código en el que utilizo un menú con liquidMenu y quiero ver la temperatura de varias habitaciones, aunque da error.
Aquí adjunto el código y el mensaje de error, ya no sé qué hacerle.
C++:
#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...
2024-03-04.png
Si me podieran ayudar, se los agradecería muchísimo.
 
Última edición por un moderador:
Si ya estás atascado con la escritura de los textos de la primera pantalla, no me quiero imaginar el resto.

Yo no se programar en eso, pero ya he visto lo que está pasando y te aseguro que no es difícil de resolver.

Pero no te voy a dar la solución, ni hacerte los deberes. Lo que tienes que hacer es leer más la documentación y los ejemplos y hacer pruebas hasta conseguir salir del atasco.

La programación es una ciencia exacta. Si una función necesita tres variables para funcionar, nunca funcionará si sólo le das dos.
 
Un indentado prolijo de tu código lo hace mas comprensible y ayuda a las posibles intenciones de colaborar en la resolución del inconveniente. ;) ;)
 
Si ya estás atascado con la escritura de los textos de la primera pantalla, no me quiero imaginar el resto.

Yo no se programar en eso, pero ya he visto lo que está pasando y te aseguro que no es difícil de resolver.

Pero no te voy a dar la solución, ni hacerte los deberes. Lo que tienes que hacer es leer más la documentación y los ejemplos y hacer pruebas hasta conseguir salir del atasco.

La programación es una ciencia exacta. Si una función necesita tres variables para funcionar, nunca funcionará si sólo le das dos.
Es que los ejemplos que estuve revisando no tienen mucho que ver con lo que necesito, pero igualmente voy a seguir leyendo documentación. Gracias(y)
 
Solo puedes hacer declaraciones fuera de las funciones, el error te da por que estás intentando "ejecutar" código fuera de una función y el compilador lo confunde con una declaración que le falta el tipo de variable.
 
Atrás
Arriba