Hola ArduMyth, yo lo que tengo es un interruptor de esos que tienen una palanca que la puedes subir o bajar... y cuando la palanca está abajo, se muestra la pantalla principal con los datos de los sensores, pero cuando subo la palanca quiero que entre en un menú, el cual tiene submenús... y como explicaba antes, el if(palancaestaarriba = HIGH) lo tengo en el loop, por lo que cuando subo la palanca me va al menú, pero al seleccionar una opción para entrar en los submenús, me vuelve al menú principal en todo momento....
Eso que me dices de debounce usando millis() y guardar el estado en un booleano no sé cómo hacerlo... podrías echarme una mano??
dejo el código completo "aunque el problema lo tengo en el loop que me lleva al menu() y de ahí a los submenus"
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
int botonestado = 0;
int viejoestado = 0;
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {26, 24, 22, 28}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {27, 25, 23, 29}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
const int sensorPin = A0;
const int relePin = 4;
const int buttonPin = 5;
const int buttonPin2 = 6;
const int botonmenu = 3;
int comienzoriego = 600;
int finriego = 500;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(botonmenu, INPUT_PULLUP);
pinMode(sensorPin, INPUT);
pinMode(relePin, OUTPUT);
lcd.begin(20, 4);
digitalWrite(relePin, HIGH);
lcd.setCursor(9,1);
lcd.write("NO");
setSyncProvider(RTC.get);
if (timeStatus() != timeSet)
Serial.println("Fallo de RTC");
else
Serial.println("Sincronizado con RTC");
// Crear las alarmas y configurar las funciones correspondientes a cada una
Alarm.alarmRepeat(8, 30, 0, aperturaelectrovalvula);
Alarm.alarmRepeat(20, 30, 0, aperturaelectrovalvula);
///// Fin del sistema de riego /////
}
void loop(){
// Creamos el objeto key, para el keypad
char key = keypad.getKey();
// String caracterpresionado(key);
if (digitalRead(botonmenu) == LOW) {
menu();
}else{
// Si el valor del pin del pulsador es HIGH es que esta pulsado
if (digitalRead(buttonPin) == LOW) {
// Se enciende el riego:
Serial.println("Palanca Arriba encender electroválvula de manera manual");
// llamamos a la función humedadporcentaje, pasándole el valorHumedad en porcentaje, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
// Cogemos la información del sensor de humedad por segunda vez.
int humedad2 = analogRead(sensorPin);
// Mostrar el reloj en el monitor serial
Serial.print("Hora: ");
digitalClockDisplay();
// Imprimimos por pantalla los valores de humedad y su porcentaje tanto en LCD como en Serial Monitor.
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad2);
lcd.setCursor(9,2);
lcd.print(humedad2);
// Ponemos el relé en LOW por lo que se abrirá la electroválvula.
digitalWrite(relePin, LOW);
// Imprimimos en el LCD la palabra SI donde pone regando: y antes ponía NO.
lcd.setCursor(9,1);
lcd.write("SI");
lcd.setCursor(0,3);
lcd.write("Encendido manual ");
Serial.println("Regando: SI");
Serial.println("");
LCD1602ClockDisplay();
humedadValor(humedad2);
humedadPorcentaje(valorHumedad);
}
else if (digitalRead(buttonPin2) == LOW){
// Se apaga el riego:
Serial.println("Palanca Abajo apagar electroválvula de manera manual");
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
int humedad2 = analogRead(sensorPin);
Serial.print("Hora: ");
digitalClockDisplay();
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad2);
lcd.setCursor(9,2);
lcd.print(humedad2);
digitalWrite(relePin, HIGH);
lcd.setCursor(9,1);
lcd.write("NO");
lcd.setCursor(0,3);
lcd.write("Parada manual ");
Serial.println("Regando: NO");
Serial.println("");
LCD1602ClockDisplay();
humedadValor(humedad2);
humedadPorcentaje(valorHumedad);
}
else {
Serial.println("");
Serial.println("Palanca en medio, sistema de riego automático");
Serial.print("Hora: ");
digitalClockDisplay();
LCD1602ClockDisplay();
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
int humedad = analogRead(sensorPin);
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad);
Serial.println("Regando: NO");
Serial.println("");
humedadPorcentaje(valorHumedad);
humedadValor(humedad);
Alarm.delay(1000);
lcd.setCursor(0,0);
lcd.write("Hora: ");
lcd.setCursor(0,1);
lcd.write("Regando: ");
lcd.setCursor(0,2);
lcd.write("Humedad: ");
lcd.setCursor(9,2);
lcd.print(humedad);
lcd.setCursor(13,2);
lcd.write(' ');
lcd.setCursor(14,2);
lcd.write(' ');
digitalWrite(relePin, HIGH);
lcd.setCursor(9,1);
lcd.write("NO");
lcd.setCursor(0,3);
lcd.write("Sistema Automatico");
}
}
}
void menu(){
lcd.setCursor(0,0);
lcd.write(" Elija una opcion ");
lcd.setCursor(0,2);
lcd.write("1 - Horarios riegos ");
lcd.setCursor(0,3);
lcd.write("2 - inicio y fin ");
lcd.setCursor(0,1);
lcd.write(" ");
char key1 = keypad.getKey();
int pasadoaint = (key1-48);
switch (pasadoaint) {
case 1:
Serial.print("Menú de horarios y riegos");
modificaralarmas();
break;
case 2:
Serial.print("Definir variables de inicio y fin de riegos");
definirvariablesinicioyfin();
break;
}
}
void modificaralarmas(){
Serial.println(" Dentro de modificaralarmas() ");
lcd.setCursor(0,0);
lcd.write("1 - ver horarios ");
lcd.setCursor(0,1);
lcd.write("2 - modificar horas ");
lcd.setCursor(0,2);
lcd.write("2 - borrar horas ");
lcd.setCursor(0,3);
lcd.write("4 - agregar riegos ");
char key2 = keypad.getKey();
if (key2 == '1') {
Serial.print(" Ver horarios");
modificaralarmas();
}
if (key2 == '2') {
Serial.print(" modificar horas");
definirvariablesinicioyfin();
}
if (key2 == '3') {
Serial.print(" borrar horas");
modificaralarmas();
}
if (key2 == '4') {
Serial.print(" agregar riegos");
definirvariablesinicioyfin();
}
if (key2 == '*') {
Serial.print(" Volver al menú principal");
menu();
}
}
void definirvariablesinicioyfin(){
}
void aperturaelectrovalvula(){
if (int humedad = analogRead(sensorPin) > comienzoriego){ // está en 600
while(int humedad = analogRead(sensorPin) > finriego && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin) == HIGH) // fin de riego está en 500
{
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
int humedad2 = analogRead(sensorPin);
Serial.print("Hora: ");
digitalClockDisplay();
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad2);
lcd.setCursor(9,2);
lcd.print(humedad2);
digitalWrite(relePin, LOW);
.
lcd.setCursor(9,1);
lcd.write("SI");
Serial.println("Regando: SI");
Serial.println("");
LCD1602ClockDisplay();
humedadValor(humedad2);
humedadPorcentaje(valorHumedad);
//delay(1000);
}
}
}
void digitalClockDisplay() {
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void LCD1602ClockDisplay(){
lcd.setCursor(6,0);
printDigitsLCDHora(hour() );
lcd.setCursor(14,0);
lcd.write(" ");
lcd.setCursor(8,0);
lcd.print(':');
lcd.setCursor(9,0);
printDigitsLCD(minute());;
lcd.setCursor(11,0);
lcd.print(':');
lcd.setCursor(12,0);
printDigitsLCD(second());
}
Muchas gracias