#include <Keypad.h>
#define RED 11
#define GREEN 10
#define BLUE 9
const byte Rows = 4;
const byte Cols = 4;
char keymap[Rows][Cols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rPins[Rows]= {13,8,7,6};
byte cPins[Cols]= {5,4,3,2};
Keypad kpd = Keypad(makeKeymap(keymap), rPins, cPins, Rows, Cols);
int r = HIGH;
int g = HIGH;
int b = HIGH;
char keypressed;
char BlinkAct = '-';
static uint32_t tmr = 0;
int toHold = 0;
bool isOn = true;
void Turn(char act){
switch (act){
case '0':
r = HIGH;
g = HIGH;
b = HIGH;
break;
case '1':
r = LOW;
g = HIGH;
b = HIGH;
break;
case '2':
r = HIGH;
g = LOW;
b = HIGH;
break;
case '3':
r = HIGH;
g = HIGH;
b = LOW;
break;
case '4':
r = HIGH;
g = LOW;
b = LOW;
break;
case '5':
r = LOW;
g = HIGH;
b = LOW;
break;
case '6':
r = LOW;
g = LOW;
b = HIGH;
break;
case '7':
r = LOW;
g = LOW;
b = LOW;
break;
case '8':
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, HIGH);
break;
case '9':
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, LOW);
break;
default:
break;
}
}
void Blink(char act){
switch (act){
case 'A':
BlinkAct = '-';
digitalWrite(RED, r);
digitalWrite(GREEN, g);
digitalWrite(BLUE, b);
isOn = true;
break;
case 'B':
BlinkAct = act;
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, HIGH);
isOn = false;
break;
case 'C':
BlinkAct = act;
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, HIGH);
isOn = false;
break;
case 'D':
BlinkAct = act;
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, HIGH);
isOn = false;
break;
default:
break;
}
}
void SetHold(char c){
switch (BlinkAct){
case 'B':
toHold = 1000;
break;
case 'C':
toHold = 500;
break;
case 'D':
toHold = 250;
break;
default:
break;
}
}
void setup() {
Serial.begin(9600);
pinMode(RED, OUTPUT);
digitalWrite(RED, r);
pinMode(GREEN, OUTPUT);
digitalWrite(GREEN, g);
pinMode(BLUE, OUTPUT);
digitalWrite(BLUE, b);
}
void loop() {
keypressed = kpd.getKey();
if(keypressed != NO_KEY){
Turn(keypressed);
Blink(keypressed);
}
if(BlinkAct != '-'){
SetHold(BlinkAct);
if(millis() - tmr > toHold){
tmr = millis();
if(isOn){
Blink(BlinkAct);
}
else if(!isOn){
digitalWrite(RED, r);
digitalWrite(GREEN, g);
digitalWrite(BLUE, b);
isOn = true;
}
}
}
else{
digitalWrite(RED, r);
digitalWrite(GREEN, g);
digitalWrite(BLUE, b);
}
}