#include <Keypad.h>
# define ON HIGH // Cambiar aqui para reles con logica positiva/negativa
# define OF LOW // Cambiar aqui para reles con logica positiva/negativa
const byte F = 4;
const byte C= 4;
char Teclas[F][C] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} };
byte PinsFilas[F] = {5, 4, 3, 2}; //Pines de las filas
byte PinsColum[C] = {9, 8, 7, 6}; //Pines de las columnas
byte Reles[] = {11,12,13,14,15,16,17,18}; // Pines para los reles
bool Estado_rele[]={false,false,false,false,false,false,false,false}; // Estado de cada rele
unsigned long Timepos[] = {1000,2000,3000,4000,5000,6000,7000,8000}; // Tiempo para cada rele en milisegundos
unsigned long Fin_T[] = {0, 0, 0, 0, 0, 0, 0, 0}; // Auxiliar para controlar timepo de cada rele
unsigned long Amilis = 0; // Auxiliar para controlar desborde millis()
Keypad Teclado = Keypad( makeKeymap(Teclas), PinsFilas, PinsColum, F, C );
void setup()
{
for (int i=0; i<8; i++)
{
pinMode(Reles[i], OUTPUT); // Establecer pin de salida
digitalWrite (Reles[i], OF); // Asegurarse rele apagado
}
}
void loop()
{
Amilis=millis(); // Almacenamos ultimo millis() para controlar desborde
char key = Teclado.getKey();
if (key != NO_KEY) // Hay tecla pulsada?
{
if (key = '1' && !Estado_rele[0]) // Pulso 1 y rele 1 apagado
{
Estado_rele[0] = true; // Cambamnos estado rele
Fin_T[0] = millis() + Timepos[0]; // Tiempo para parar el rele
}
if (key = '2' && !Estado_rele[1]) // Pulso 2 y rele 2 apagado
{
Estado_rele[1] = true; // Cambamnos estado rele
Fin_T[1] = millis() + Timepos[1]; // Tiempo para parar el rele
}
// hasta 8º
}
for (int i=0; i<8; i++)
{
if (millis() > Fin_T[i]) { Estado_rele[i] = false; } // Comprobar si hay q apagar algun rele
if (Estado_rele[i]) {digitalWrite (Reles[i], ON);} else {digitalWrite (Reles[i], OF);} // Encender/Apagar reles
}
if (Amilis > millis()) // Control desborde millis()
{
for (int i=0; i<8; i++) {Fin_T[i] = Fin_T[i] - Amilis + millis(); } // Nuevo tiempo para fin
}
}