Hola.
Tengo un problema en mi programa, el cual quiero hacer un reloj y al mismo tiempo un submenú basandome es esta pagina Varios botones con una sola entrada analógica - el blog de giltesa.
He quitado la parte del reloj pero sigue dandome problemas, contado linea por linea y aun asi no logro dar con el problema. Espero me puedan ayudar.
Saludos.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4); //Configuracion de mi LCD e interfaz I2c. SDA en A4 y SCL en A5
byte arrowDown[8] = {B00000, B01110, B01110, B01110, B11111, B01110, B00100}; // Caracteres personalizados para el LCD
byte cursorLCD[8] = {B00000, B00000, B00110, B01111, B01111, B00110, B00000};
byte ledOn[8] = {B00000, B01110, B10001, B10001, B01010, B01110, B01110};
byte white[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111};
int ExtractorU=2; //Salidas.
int ExtractorD=3;
int luzu=4;
int luzd=5;
int minutos=0; //Defino variables de reloj.
int segundos=0;
int horas=0;
void setup()
{
lcd.begin(20, 4); //Indicamos que tipo de pantalla es.
lcd.backlight(); //Iniciamos pantalla
lcd.init();
pinMode(luzu, OUTPUT); //Mis salidas.
pinMode(luzd, OUTPUT);
pinMode(ExtractorU,OUTPUT);
pinMode(ExtractorD,OUTPUT);
lcd.createChar(0, cursorLCD); // Se añaden los caracteres especiales al objeto LCD:
lcd.createChar(1, arrowDown);
lcd.createChar(2, ledOn);
lcd.createChar(3, white);
}
void loop()
{
segundos++; //Incremento en 1 los segundos
delay(1000); //Espero 1 seg
if (segundos>59){ //Si segundos pasa de 59, aumento 1 a minutos
minutos++;
segundos=0; //segundos vuelvo a 0
}
if (minutos>59){ //si minutos es mas de 59, aumento 1 a horas
horas++;
minutos=0; //vuelve a 0 los minutos
}
lcd.setCursor(0, 0); //Posicioneamos donde queremos escribir,
if (horas<10){ //Si horas es menor a 10 imprime 0
lcd.print("0");
}
lcd.print(horas); //Imprimimos el valor que tengamos en horas
lcd.print(":"); //Si el valor de horas es mas de 10, se sustituira el 0 creado anteriormente
if (minutos<10){
lcd.print("0");
}
lcd.print(minutos); //igual que con horas
lcd.print(":");
if (segundos<10){
lcd.print("0");
}
if (horas>22)
horas=0;
/*Comienza la prog de submenu, implementar salidas 2, 3 y 4 en vez de intensidad de led*/
// Guarda el resultado leído de una pulsación por teclado:
{
char resultButton[7] = "null";
// Se imprime la pantalla de inicio:
lcd.setCursor(6, 0); lcd.print("Menu MTTO");
lcd.setCursor(0, 1); lcd.print("LUCES Y EXTRACTORES");
lcd.setCursor(7, 3); lcd.print("Pulse "); lcd.write(byte(1));
// Se comprueba si se ha pulsado un botón:
getButtonPush( resultButton, 0, 200);
// Si se pulsa la tecla abajo, se entra en el menú:
if( !strcmp(resultButton,"bottom"))
LCDmenu();
}
// MENU PRINCIPAL, DA OPCION PARA ABRIR EL MENU 1 Y MENU 2, TAMBIEN PARA SALIR A LA PANTALLA PRINCIPAL
void LCDmenu()
{
char resultButton[7];
int posCursor=0, opcMenu=-2;
// Menu
lcd.clear();
lcd.setCursor(2, 0); lcd.print("Luces"); //Encender LED
lcd.setCursor(2, 1); lcd.print("Extractores");
lcd.setCursor(2, 2); lcd.print("Salir");
// Mientras no se pulse sobre salir, no se saldrá a la pantalla principal:
do{
strcpy(resultButton,"null");
getButtonPush( resultButton, 0, 200);
// Cursor que indica la opción seleccionada:
lcd.setCursor(0, posCursor); lcd.write(byte(0));
// Desplaza el cursor arriba o abajo:
if(!strcmp(resultButton,"up"))
LCDMueveCursor(&posCursor, 2, 'r'); // Se resta una posición al cursor
else if(!strcmp(resultButton,"bottom")) // Se suma una posición al cursor
LCDMueveCursor(&posCursor, 2, 's');
else if(!strcmp(resultButton,"right"))
opcMenu = posCursor; // Al pulsar a la derecha (para acceder a esa opcion) se actualiza la opción de menú elegida según donde esta el cursor ahora.
// Según la opción elegida del menú, se llama a otro menú o se cierra el menú actual:
switch( opcMenu )
{
case 0: // Se accede al menú de encendido y apagado de Luz.
LCDmenu0();
opcMenu = -2;
break;
case 1: // Se accede al menú de ajuste de brillo de los leds.
LCDmenu1();
opcMenu = -2;
break;
case 2: // Salir a la pantalla principal.
opcMenu = -1;
lcd.clear();
break;
};
}
while(opcMenu != -1);
}
// MENU PARA EL ENCENDIDO Y APAGADO DE LUZ
void LCDmenu0()
{
char resultButton[7];
int posCursor=0, opcMenu=-2;
// Menu
lcd.clear();
lcd.setCursor(2, 0); lcd.print("Luz Lobby");
lcd.setCursor(2, 1); lcd.print("Luz exterior");
lcd.setCursor(2, 2); lcd.print("Salir");
// Mientras no se pulse sobre salir, no se saldrá al Menú:
do{
strcpy(resultButton,"null");
getButtonPush( resultButton, 0, 200);
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor); lcd.write(byte(0));
// Desplaza el cursor arriba o abajo,:
if(!strcmp(resultButton,"up"))
LCDMueveCursor(&posCursor, 2, 'r'); // Se resta una posición al cursor
else if(!strcmp(resultButton,"bottom")) // Se suma una posición al cursor
LCDMueveCursor(&posCursor, 2, 's');
else if(!strcmp(resultButton,"right") || !strcmp(resultButton,"left"))
opcMenu = posCursor;
// Según la opción elegida del menú, se le cambia el estado a un LED, al otro o se cierra el menú actual:
switch( opcMenu )
{
// Luz lobby
case 0:
if(!strcmp(resultButton,"right")) // A la derecha se enciende.
{
if(luzu == LOW) // Se enciende.
digitalWrite(luzu, HIGH);
ledY_E = true;
}
else if( !strcmp(resultButton,"left") ) // Asi se apaga
{
digitalWrite(luzu==LOW);
ledY_E = false;
}
opcMenu = -2;
LCDBombillasLed( ledY_E, 0);
break;
// Luz Exterior
case 1:
if(!strcmp(resultButton,"right"))
{
if(luzd==LOW)
digitalWrite(luzd, HIGH);
ledB_E = true;
}
else if( !strcmp(resultButton,"left") )
{
digitalWrite(luzd==LOW);
ledB_E = false;
}
opcMenu = -2;
LCDBombillasLed( ledB_E, 1);
break;
// Salir
case 2:
if(!strcmp(resultButton,"right"))
opcMenu = -1;
break;
};
}
while(opcMenu != -1);
// Al salir del Menu1 se imprime el menú anterior:
lcd.clear();
lcd.setCursor(2, 0); lcd.print("Luces"); //Encender LED
lcd.setCursor(2, 1); lcd.print("Extractores");
lcd.setCursor(2, 2); lcd.print("Salir");
}
void getButtonPush(char *resultButton, int pin, int pause)
{
// Precondición: El parámetro pin ha de ser un pin Analógico del Arduino.
// Poscondición: El parámetro resultButton es una cadena por referencia que devolverá el botón pulsado.
// El parámetro pause ha de ser un numero entero igual o mayor que 0.
// Info: El teclado usado es este: http://giltesa.com/?p=11458 , según el tipo de resistencias habrá que cambiar las condicionales para adaptarse al valor leído desde el pin Analógico.
int data = analogRead(0);
if (data > 10)
{
if (data > 500 && data < 540)
strcpy(resultButton,"up");
else if (data > 330 && data < 370)
strcpy(resultButton,"left");
else if (data > 240 && data < 280)
strcpy(resultButton,"bottom");
else if (data > 190 && data < 230)
strcpy(resultButton,"right");
delay(pause);
}
}