Buenos días amigos, tengo un problema con un teclado matricial de 4x4, resulta que arduino tarda mucho tiempo en detectar la pulsación de los botones, alguien tiene alguna solución?
Adjunto el código completo, gracias de antemano
#include <DS1307RTC.h>
#include <Time.h>
#include <OneWire.h> //SE INCLUYE LA LIBRERIA ONEWIRE PARA LA SONDA DS18B20
#include <Wire.h>
#include <DallasTemperature.h> //SE DECLARA LA LIBRERIA PARA LA SONDA DS18B20
#include <LiquidCrystal.h>
#include <Keypad.h>
#define ONE_WIRE_BUS 13 //SE DEFINE EL PIN DATA DE LA SONDA DS18B20
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC = 0;
bool fallotemp = false;
bool calentador = false;
bool luz = false;
bool ventiladores = false;
bool rgb = false;
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys [ROWS] [COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 23, 24, 25}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {26, 27, 28, 29}; //connect to the column pinouts of the keypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
lcd.begin(16, 2); // SE DECLARA LAS DIMENSIONES DE LA PANTALLA LCD
sensors.begin(); //SE INICIALIZA EL SENSOR
pinMode(30, OUTPUT); // SE DECLARA PIN 30 COMO SALIDA "CALENTADOR"
pinMode(31, OUTPUT); // SE DECLARA EL PIN 31 COMO SALIDA "LUZ"
pinMode(32, OUTPUT); // SE DECLARA EL PIN 32 COMO SALIDA "VENTILADORES"
pinMode(33, OUTPUT); // SE DECLARA EL PIN 33 COMO SALIDA "LUZ NOCHE AZUL"
pinMode(34, OUTPUT); // SE DECLARA EL PIN 34 COMO SALIDA "RGB"
setSyncProvider(RTC.get); // Vamos a usar el RTC
setSyncInterval(86400000); // Sincronizo una vez cada 24 horas
digitalWrite(30, HIGH);
digitalWrite(31, HIGH);
digitalWrite(32, HIGH);
digitalWrite(33, HIGH);
digitalWrite(34, HIGH);
}
void loop(){
sensors.requestTemperatures();
tempC = sensors.getTempCByIndex(0);
delay(50);
lcd.setCursor(2,1);
lcd.print(tempC);
lcd.setCursor(8,1);
lcd.print("Grados");
char customKey = customKeypad.getKey();
if(customKey == '1'){ // SI LA TECLA PULSDA ES IGUAL A 1
calentador = true; // ACTIVAMOS CALENTADOR
lcd.setCursor(0,0); // POSICIONAMOS EL CURSOR EN EL CARACTER 1, FILA 0
lcd.print(" Calentador ON "); // SE IMPRIME EL TEXTO EN LA PANTALLA LCD
delay(1000); // RETARDO DE 500MS
lcd.clear(); // SE LIMPIA LA PANTALLA
}
if (customKey == '4'){
calentador = false;
lcd.setCursor(0,0);
lcd.print(" Calentador OFF");
digitalWrite(30, HIGH);
delay(1000);
lcd.clear();
}
if (calentador == true && tempC <= 20.0){ // SI CALENTADOR ESTA ACTIVADO Y LA TEMPERATURA ES MENOR QUE 20ºC ACTIVAMOS EL PIN 30
digitalWrite(30, LOW);
lcd.setCursor(0,0);
lcd.print("CALENTANDO AGUA ");
}
if (calentador == true && tempC >= 21.0){
lcd.setCursor(0,0);
lcd.print(" Temperatura OK ");
digitalWrite(30, HIGH);
}
if (calentador == true && tempC<= 12.00){
fallotemp = true;
lcd.setCursor(0,0);
lcd.print("Fallo Calentador");
}
else{
fallotemp = false;
}
if (tempC>= 22.00){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Temp Excesiva");
}
if(customKey == 'A'){
lcd.setCursor(0,0);
lcd.print(" ");
luz = true;
lcd.setCursor(5,0);
lcd.print("LUZ ON");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
}
if (customKey == 'B'){
lcd.setCursor(0,0);
lcd.print(" ");
luz = false;
lcd.setCursor(5,0);
lcd.print("LUZ OFF");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
}
//if (calentador == true && luz == true){ // "PRUEBA"==> SI CALENTADOR ESTA ACTIVADO Y LUZ TAMBIEN SE MUESTRA MENSAJE EN PANTALLA
//lcd.setCursor(0,0); // ESTA PRUEBA LA REALIZO PARA UTILIZARLA DE TAL MANERA "SI CALENTADOR == TRUE && tempC<=20" SOLO SE ACTIVARA EL PIN 30 CUANDO AMBOS SEAN VERDADEROS
//lcd.print("Prueba OK");
// }
if (customKey == '#'){ // SI SE PULSA LA TECLA # APARECE EN PANTALLA EL SIGNIFICADO DE LAS TECLAS "A, B, C, D"
lcd.setCursor(0,0); // DESPUES DE UN RETARDO FINAL SE LIMPIA LA PANTALLA
lcd.print("1 Calentador ON");
lcd.setCursor(0,1);
lcd.print("4 Calentador OFF");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A LUZ ON");
lcd.setCursor(0,1);
lcd.print("B LUZ OFF");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("C Ventilador ON");
lcd.setCursor(0,1);
lcd.print("D Ventilador OFF");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("2 Leds RGB ON");
lcd.setCursor(0,1);
lcd.print("5 Leds RGB OFF");
delay(2000);
lcd.clear();
}
if (customKey == 'C'){
lcd.setCursor(0,0);
lcd.print(" ");
ventiladores = true;
lcd.setCursor(0,0);
lcd.print("Ventiladores On");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
}
if (customKey == 'D'){
lcd.setCursor(0,0);
lcd.print(" ");
ventiladores = false;
lcd.setCursor(0,0);
lcd.print("Ventiladores Off");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
}
if (customKey == '2'){
lcd.setCursor(0,0);
lcd.print(" ");
rgb = true;
lcd.setCursor(2,0);
lcd.print("Leds RGB ON");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
}
if (customKey == '5'){
lcd.setCursor(0,0);
lcd.print(" ");
rgb = false;
lcd.setCursor(2,0);
lcd.print("Leds RGB OFF");
delay(1000);
lcd.setCursor(0,0);
lcd.print(" ");
}
if (rgb == true){
digitalWrite(34, LOW);
}
else{
digitalWrite(34, HIGH);
}
if (ventiladores == true && tempC >= 21.00){
digitalWrite(32, LOW);
}
else{
digitalWrite(32, HIGH);
}
if (luz == false){
digitalWrite(33, HIGH);
}
if (esHora()&& luz == true) {
digitalWrite(31, LOW);
digitalWrite(33, HIGH);
delay(500);
}else{
digitalWrite(31, HIGH);
if (luz == true){
digitalWrite(33, LOW);
}
delay(500);
}
}
boolean esHora() {
//Defino horas Inicio a las 19:30 y termina a las 21:00
byte horaInicio = 19;
byte minutoInicio = 22;
byte horaFin = 19;
byte minutoFin = 23;
//Para hacer las comparaciones de cuando empezar y cuando terminar, lo paso todo a minutos.
int momentoInicio = (horaInicio * 60) + minutoInicio;
int momentoFin = (horaFin * 60) + minutoFin;
int momentoAhora = (hour() * 60) + minute();
//Esto es que si hemos pasado o estamos en el momento de inicio , pero antes del momento del fin…
if ((momentoInicio <= momentoAhora) && (momentoAhora < momentoFin)) {
//devolver "Cierto" en esta función "esHora"
return true;
} else {
//devolver "Falso" en esta función "esHora"
return false;
}
}