#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidMenu.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//ENCODER
#define outputB 4
#define outputA 3
#define sw 2
//buzzer
#define buzzer 9
//reles
#define rele1 10
#define rele2 11
#define rele3 12
int aState;
int aLastState;
int lleno = 8;
int medio = 7;
int cuarto = 6;
int vacio = 5;
int i = 0;
int rele = 0;
LiquidLine linea1(1, 0, "ZONA RIEGO 1");
LiquidLine linea2(1, 1, "ZONA RIEGO 2");
LiquidLine linea3(1, 0, "ZONA RIEGO 3");
LiquidLine linea4(1, 1, "TODAS LAS ZONAS");
LiquidLine linea5(1, 0, "NIVEL");
LiquidScreen pantalla1;
LiquidLine linea1_2(1, 0, "Encender");
LiquidLine linea2_2(1, 1, "Apagar");
LiquidLine linea3_2(1, 0, "Atras");
LiquidScreen pantalla2;
LiquidLine linea1_3(1, 0, "NIVEL TANQUE");
LiquidLine linea2_3(1, 1, "");
LiquidScreen pantalla3;
LiquidMenu menu(lcd, pantalla1, pantalla2 );
void setup() {
//Serial.begin(9600);
//Serial.print(i);
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(sw, INPUT_PULLUP);
pinMode(lleno, INPUT_PULLUP);
pinMode(medio, INPUT_PULLUP);
pinMode(cuarto, INPUT_PULLUP);
pinMode(vacio, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
lcd.init();
//lcd.begin();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("SATURNO V");
tone(buzzer, 1000, 100);
lcd.setCursor(2, 1);
lcd.print("iniciando...");
delay(2000);
lcd.clear();
while (digitalRead(sw) == 1) {
lcd.setCursor(0, 0);
lcd.print("NIVEL DE TANQUE");
nivel();
}
menu.init();
pantalla1.add_line(linea1);
pantalla1.add_line(linea2);
pantalla1.add_line(linea3);
pantalla1.add_line(linea4);
pantalla1.add_line(linea5);
pantalla2.add_line(linea1_2);
pantalla2.add_line(linea2_2);
pantalla2.add_line(linea3_2);
/*
pantalla3.add_line(linea1_3);
pantalla3.add_line(linea2_3);
*/
linea1.set_focusPosition(Position::LEFT);
linea2.set_focusPosition(Position::LEFT);
linea3.set_focusPosition(Position::LEFT);
linea4.set_focusPosition(Position::LEFT);
linea5.set_focusPosition(Position::LEFT);
linea1.attach_function(1, ZONA1);
linea2.attach_function(1, ZONA2);
linea3.attach_function(1, ZONA3);
linea4.attach_function(1, todos);
linea5.attach_function(1, setup);
menu.add_screen(pantalla1);
linea1_2.set_focusPosition(Position::LEFT);
linea2_2.set_focusPosition(Position::LEFT);
linea3_2.set_focusPosition(Position::LEFT);
linea1_2.attach_function(1, fn_on);
linea2_2.attach_function(1, fn_off);
linea3_2.attach_function(1, fn_atras);
menu.add_screen(pantalla2);
/*
linea1_3.set_focusPosition(Position::LEFT);
linea2_3.set_focusPosition(Position::LEFT);
linea1_3.attach_function(1, loop);
linea2_3.attach_function(1, tanque);
menu.add_screen(pantalla3);
*/
pantalla1.set_displayLineCount(2);
pantalla2.set_displayLineCount(2);
// pantalla3.set_displayLineCount(2);
menu.set_focusedLine(0);
menu.update();
}
void loop() {
selectOption();
aState = digitalRead(outputA);
if (aState != aLastState) {
if (digitalRead(outputB) != aState) {
menu.switch_focus(false);
} else {
menu.switch_focus(true);
}
menu.update();
aLastState = aState;
}
}
//Funciones:::::
void selectOption() {
if (digitalRead(sw) == LOW) {
menu.call_function(1);
delay(200);
}
}
void ZONA1() {
menu.change_screen(2);
menu.set_focusedLine(0);
rele = 1;
}
void ZONA2() {
menu.change_screen(2);
menu.set_focusedLine(0);
rele = 2;
}
void ZONA3() {
menu.change_screen(2);
menu.set_focusedLine(0);
rele = 3;
}
void todos() {
menu.change_screen(2);
menu.set_focusedLine(0);
rele = 0;
}
/*
void tanque(){
menu.change_screen(3);
menu.set_focusedLine(0);
}
*/
void fn_on() {
switch (rele) {
case 1:
digitalWrite(rele1, HIGH);
break;
case 2:
digitalWrite(rele2, HIGH);
break;
case 3:
digitalWrite(rele3, HIGH);
break;
case 0:
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
digitalWrite(rele3, HIGH);
break;
}
}
void fn_off() {
switch (rele) {
case 1:
digitalWrite(rele1, LOW);
break;
case 2:
digitalWrite(rele2, LOW);
break;
case 3:
digitalWrite(rele3, LOW);
break;
case 0:
digitalWrite(rele1, LOW);
digitalWrite(rele2, LOW);
digitalWrite(rele3, LOW);
break;
}
}
void fn_atras() {
menu.change_screen(1);
menu.set_focusedLine(0);
}
void nivel() {
//CONDICION 100
if (digitalRead(vacio) == LOW && digitalRead(cuarto) == LOW && digitalRead(medio) == LOW && digitalRead(lleno) == LOW) {
lcd.setCursor(0, 0);
lcd.print("NIVEL DE TANQUE");
lcd.setCursor(3, 1);
lcd.print(" 100");
lcd.print(" % ");
for ( i ; i < 3; i++) {
if (i == 3)break;
tone(buzzer, 400);
delay(200);
tone(buzzer, 600);
delay(200);
tone(buzzer, 800);
delay(200);
noTone(buzzer);
}
}
// CONDICION 75
if (digitalRead(vacio) == LOW && digitalRead(cuarto) == LOW && digitalRead(medio) == LOW && digitalRead(lleno) == HIGH) {
i = 0;
lcd.setCursor(0, 0);
lcd.print("NIVEL DE TANQUE");
lcd.setCursor(4, 1);
lcd.print(" 75");
lcd.print(" % ");
}
// CONDICION 50
if (digitalRead(vacio) == LOW && digitalRead(cuarto) == LOW && digitalRead(medio) == HIGH && digitalRead(lleno) == HIGH) {
i = 0;
lcd.setCursor(0, 0);
lcd.print("NIVEL DE TANQUE");
lcd.setCursor(4, 1);
lcd.print(" 50");
lcd.print(" % ");
}
//CONDICION 25
if (digitalRead(vacio) == LOW && digitalRead(cuarto) == HIGH && digitalRead(medio) == HIGH && digitalRead(lleno) == HIGH) {
lcd.setCursor(0, 0);
lcd.print("NIVEL DE TANQUE");
lcd.setCursor(4, 1);
lcd.print(" 25");
lcd.print(" % ");
for ( i ; i < 3; i++) {
if (i == 3)break;
tone(buzzer, 400);
delay(200);
tone(buzzer, 300);
delay(200);
tone(buzzer, 200);
delay(200);
noTone(buzzer);
}
}
//CONDICION reserva
if (digitalRead(vacio) == HIGH && digitalRead(cuarto) == HIGH && digitalRead(medio) == HIGH && digitalRead(lleno) == HIGH) {
i = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NIVEL DE TANQUE");
lcd.setCursor(4, 1);
lcd.print("RESERVA");
lcd.noBacklight();
delay(500);
lcd.backlight();
delay(500);
for ( i ; i < 3; i++) {
if ( i == 3)break;
tone(buzzer, 200);
delay(200);
noTone(buzzer);
}
}
}