Buen dia gente, ando queriendo armar un proyecto de un riego que tiene luces, etc. cuestion. Hice un menu en el lcd de 16x2, todo bien ni un problema para prender/apagar luces/leds de encendido/reles...
Mi problema surgio cuando quise agregar un dht; Al tener un encoder con click para el menu, el loop se centra en eso, y cuando quiero agregar un delay y lectura tengo problemas, supongo que va con la funcion millis pero la verdad no soy tan avanzado y se me complico. Ruego ayuda. gracias!
PD: Me gustaria agregar el dht en la primera pagina, que abajo de inicio, de temperatura y humedad.
2*PD: Si alguien me ayudaria a agregar al sistema un zs-042(en el menu automatico) y poder darle a que horas encender y etc seria de muchiisima ayuda.
Desde ya muchisimas gracias. Adjunto a continuación el código hasta donde llegue.
#include <Wire.h> // libreria de comunicacion por I2C
#include <LCD.h> // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h>
#include <LiquidMenu.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
//ENCODER
#define outputA 6
#define outputB 7
#define sw 4
int aState;
int aLastState;
//RELES
#define rele1 22
#define rele2 23
#define rele3 24
#define rele4 25
//LEDS
#define led1 51
#define led2 52
#define led3 53
#define led4 50
//VARIABLES
int incremento=0;
int rele = 0;
//Pantalla 0
LiquidLine linea1_pant0(5, 0, "INICIO");
//Pantalla 1
LiquidLine linea1_pant1(1, 0, "Menu");
LiquidLine linea2_pant1(1, 1, "Ajustes");
LiquidLine linea3_pant1(1, 0, "Atras");
//Pantalla 2
LiquidLine linea1_pant2(1, 1, "Automatico");
LiquidLine linea2_pant2(1, 0, "Manual");
LiquidLine linea3_pant2(1, 1, "Atras");
//Pantalla 3
LiquidLine linea1_pant3(1, 0, "*PROXIMAMENTE*");
LiquidLine linea2_pant3(1, 1, "Atras");
//Pantalla 4
LiquidLine linea1_pant4(1, 0, "Iluminacion");
LiquidLine linea2_pant4(1, 1, "Riegos");
LiquidLine linea3_pant4(1, 0, "Ventilacion");
LiquidLine linea4_pant4(1, 1, "Atras");
//Pantalla 5
LiquidLine linea1_pant5(1, 0, "Prender");
LiquidLine linea2_pant5(1, 1, "Apagar");
LiquidLine linea3_pant5(1, 0, "Atras");
//Declaracion de pantallas
LiquidScreen pantalla0;
LiquidScreen pantalla1;
LiquidScreen pantalla2;
LiquidScreen pantalla3;
LiquidScreen pantalla4;
LiquidScreen pantalla5;
LiquidMenu menu(lcd);
//////////////////////////////////////SETUP/////////////////////////////////////////////////////
void setup() {
pinMode(sw,INPUT_PULLUP);
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
digitalWrite(rele1,HIGH);
digitalWrite(rele2,HIGH);
digitalWrite(rele3,HIGH);
digitalWrite(rele4,HIGH);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.begin(16, 2);
///////////añadir lineas a las pantallas//////////
pantalla0.add_line(linea1_pant0);
pantalla1.add_line(linea1_pant1);
pantalla1.add_line(linea2_pant1);
pantalla1.add_line(linea3_pant1);
pantalla2.add_line(linea1_pant2);
pantalla2.add_line(linea2_pant2);
pantalla2.add_line(linea3_pant2);
pantalla3.add_line(linea1_pant3);
pantalla3.add_line(linea2_pant3);
pantalla4.add_line(linea1_pant4);
pantalla4.add_line(linea2_pant4);
pantalla4.add_line(linea3_pant4);
pantalla4.add_line(linea4_pant4);
pantalla5.add_line(linea1_pant5);
pantalla5.add_line(linea2_pant5);
pantalla5.add_line(linea3_pant5);
linea1_pant0.set_focusPosition(Position::LEFT);
linea1_pant1.set_focusPosition(Position::LEFT);
linea2_pant1.set_focusPosition(Position::LEFT);
linea3_pant1.set_focusPosition(Position::LEFT);
linea1_pant2.set_focusPosition(Position::LEFT);
linea2_pant2.set_focusPosition(Position::LEFT);
linea3_pant2.set_focusPosition(Position::LEFT);
linea1_pant3.set_focusPosition(Position::LEFT);
linea2_pant3.set_focusPosition(Position::LEFT);
linea1_pant4.set_focusPosition(Position::LEFT);
linea2_pant4.set_focusPosition(Position::LEFT);
linea3_pant4.set_focusPosition(Position::LEFT);
linea4_pant4.set_focusPosition(Position::LEFT);
linea1_pant5.set_focusPosition(Position::LEFT);
linea2_pant5.set_focusPosition(Position::LEFT);
linea3_pant5.set_focusPosition(Position::LEFT);
linea1_pant0.attach_function(1, fn_ir_a_pantalla1);
linea1_pant1.attach_function(1, fn_menu);
linea2_pant1.attach_function(1, fn_ajustes);
linea3_pant1.attach_function(1, fn_atras1);
linea1_pant2.attach_function(1, fn_automatico);
linea2_pant2.attach_function(1, fn_manual);
linea3_pant2.attach_function(1, fn_atras2);
linea1_pant3.attach_function(1, fn_vacio);
linea2_pant3.attach_function(1, fn_atras3);
linea1_pant4.attach_function(1, fn_iluminacion);
linea2_pant4.attach_function(1, fn_riegos);
linea3_pant4.attach_function(1, fn_ventilacion);
linea4_pant4.attach_function(1, fn_atras4);
linea1_pant5.attach_function(1, fn_prender);
linea2_pant5.attach_function(1, fn_apagar);
linea3_pant5.attach_function(1, fn_atras5);
menu.add_screen(pantalla0);
menu.add_screen(pantalla1);
menu.add_screen(pantalla2);
menu.add_screen(pantalla3);
menu.add_screen(pantalla4);
menu.add_screen(pantalla5);
pantalla0.set_displayLineCount(2);
pantalla1.set_displayLineCount(2);
pantalla2.set_displayLineCount(2);
pantalla3.set_displayLineCount(2);
pantalla4.set_displayLineCount(2);
pantalla5.set_displayLineCount(2);
menu.init();
menu.set_focusedLine(0);
menu.update();
}
//////////////////////////////////////LOOP/////////////////////////////////////////////////////
void loop() {
selectOption();
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
incremento++;
if(incremento>1){
incremento = 0;
menu.switch_focus(false);
}
} else {
incremento++;
if(incremento>1){
incremento = 0;
menu.switch_focus(true);
}
}
menu.update();
aLastState = aState;
}
}
void selectOption(){
if(digitalRead(sw) == LOW){
menu.call_function(1);
delay(500);
}
}
void fn_ir_a_pantalla1(){
menu.change_screen(2);
menu.set_focusedLine(0);
}
void fn_menu(){
menu.change_screen(3);
menu.set_focusedLine(0);
}
void fn_ajustes(){
menu.change_screen(1);
menu.set_focusedLine(0);
}
void fn_atras1(){
menu.change_screen(1);
menu.set_focusedLine(0);
}
void fn_automatico(){
menu.change_screen(4);
menu.set_focusedLine(0);
}
void fn_manual(){
menu.change_screen(5);
menu.set_focusedLine(0);
}
void fn_atras2(){
menu.change_screen(2);
menu.set_focusedLine(0);
}
void fn_atras3(){
menu.change_screen(3);
menu.set_focusedLine(0);
}
void fn_iluminacion(){
menu.change_screen(6);
menu.set_focusedLine(0);
rele = 1;
}
void fn_riegos(){
menu.change_screen(6);
menu.set_focusedLine(0);
rele = 2;
}
void fn_ventilacion(){
menu.change_screen(6);
menu.set_focusedLine(0);
rele = 3;
}
void fn_atras4(){
menu.change_screen(3);
menu.set_focusedLine(0);
}
void fn_prender(){
switch(rele){
case 1:
digitalWrite(rele1,LOW);
digitalWrite(led1,HIGH);
break;
case 2:
digitalWrite(rele2,LOW);
digitalWrite(led2,HIGH);
break;
case 3:
digitalWrite(rele3,LOW);
digitalWrite(led3,HIGH);
break;
}
}
void fn_apagar(){
switch(rele){
case 1:
digitalWrite(rele1,HIGH);
digitalWrite(led1,LOW);
break;
case 2:
digitalWrite(rele2,HIGH);
digitalWrite(led2,LOW);
break;
case 3:
digitalWrite(rele3,HIGH);
digitalWrite(led3,LOW);
break;
}
}
void fn_atras5(){
menu.change_screen(5);
menu.set_focusedLine(0);
}
void fn_vacio(){
}