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.
Aquí el error...
Si me podieran ayudar, se los agradecería muchísimo.
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);
}
Si me podieran ayudar, se los agradecería muchísimo.
Última edición por un moderador: