#include "Keypad.h"
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'}
};
// соединения клавиатуры с выводами Arduino:
byte rPins[Rows] = {11, 10, 9, 8};
byte cPins[Cols] = {7, 6, 5, 4};
// создаем объект класса Keypad
Keypad kpd = Keypad(makeKeymap(keymap), rPins, cPins, Rows, Cols);
char keypressednumber = '0';
char keypressednonumber = 'A';
const int LED_RED = 12;
const int LED_GREEN = 3;
const int LED_BLUE = 2;
void setup()
{
Serial.begin(9600); // инициализация монитора последовательного порта
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
}
void chooseKeyPressedNumber(const char& keypressednumber)
{
switch (keypressednumber)
{
case '0':
{
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
break;
}
case '1':
{
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
break;
}
case '2':
{
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
break;
}
case '3':
{
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
break;
}
case '4':
{
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
break;
}
case '5':
{
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
break;
}
case '6':
{
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
break;
}
case '7':
{
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
break;
}
}
}
int delayNoNumber = 0;
bool isFlash = false;
bool isActive = true;
void chooseKeyPressedNoNumber(const char& keypressednonumber)
{
switch (keypressednonumber)
{
case 'A':
{
delayNoNumber = 0;
isFlash = false;
isActive = true;
break;
}
case 'B':
{
delayNoNumber = 1000;
isFlash = true;
break;
}
case 'C':
{
delayNoNumber = 500;
isFlash = true;
break;
}
case 'D':
{
delayNoNumber = 250;
isFlash = true;
break;
}
}
}
long int time = 0;
// Если кнопка нажата, эта кнопка сохраняется в переменной keypressed.
// Если keypressed не равна NO_KEY, то выводим значение в последовательный порт.
void loop()
{
char keypressed = kpd.getKey();
if (keypressed != NO_KEY)
{
if (keypressed == 'A' || keypressed == 'B' || keypressed == 'C' || keypressed == 'D')
{
keypressednonumber = keypressed;
chooseKeyPressedNoNumber(keypressednonumber);
}
else
{
keypressednumber = keypressed;
}
Serial.println(keypressed);
}
if (millis() - time > delayNoNumber)
{
time = millis();
if (isFlash && isActive)
{
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
isActive = !isActive;
}
else if (isFlash && !isActive)
{
chooseKeyPressedNumber(keypressednumber);
isActive = !isActive;
}
else
{
chooseKeyPressedNumber(keypressednumber);
}
}
}