#include <Keypad.h>

#define LED_RED 11
#define LED_GREEN 10
#define LED_BLUE 9

class RgbLed
{
public:
  RgbLed(int pinR, int pinG, int pinB)
  {
    _pinRed = pinR;
    _pinGreen = pinG;
    _pinBlue = pinB;
    digitalWrite(_pinRed, HIGH);
    digitalWrite(_pinGreen, HIGH);
    digitalWrite(_pinBlue, HIGH);
  }
  ~RgbLed() = default;

  void setColour(int colour)
  {
    //colour = 0(000) - Выключено
    //colour = 1(001) - Красный
    //colour = 2(010) - Зелёный
    //colour = 3(011) - жёлтый
    //colour = 4(100) - Синий
    //colour = 5(101) - Сиреневый
    //colour = 6(110) - Бюриюзовый
    //colour = 7(111) - Белый
    _red = !(colour & 0b1);
    _green = !(colour & 0b10);
    _blue = !(colour & 0b100);

    digitalWrite(_pinRed, _red);
    digitalWrite(_pinGreen, _green);
    digitalWrite(_pinBlue, _blue);
  }

  void turnOn()
  {
    digitalWrite(_pinRed, _red);
    digitalWrite(_pinGreen, _green);
    digitalWrite(_pinBlue, _blue);
  }

  void turnOff()
  {
    digitalWrite(_pinRed, 1);
    digitalWrite(_pinGreen, 1);
    digitalWrite(_pinBlue, 1);
  }
 

private:
  
  int _red;
  int _green;
  int _blue;

  int _pinRed;
  int _pinGreen;
  int _pinBlue;
};

RgbLed led(LED_RED, LED_GREEN, LED_BLUE);

const byte rowsPins[] = {7, 6, 5, 4};
const byte columnsPins[] = {3, 2, 1, 0};
const char keypadMap[4][4] = 
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

Keypad keypad(makeKeymap(keypadMap), rowsPins, columnsPins, 4, 4);

bool flash = false;
int time = 0;

void keyPadProcesser(char key)
{
 
  if (key == '0')
  {
     led.setColour(0);
  }
  else if(key == '1')
  {
     led.setColour(1);
  }
  else if(key == '2')
  {
     led.setColour(2);
  }
  else if(key == '3')
  {
     led.setColour(3);
  }
  else if(key == '4')
  {
     led.setColour(4);
  }
  else if(key == '5')
  {
     led.setColour(5);
  }
  else if(key == '6')
  {
     led.setColour(6);
  }
  else if(key == '7')
  {
     led.setColour(7);
  }
  else if(key == 'A')
  {
     flash = false;
     led.turnOn();
  }
  else if(key == 'B')
  {
    flash = true;
     time = 1000;
  }
  else if(key == 'C')
  {
    flash = true;
     time = 500;
  }
  else if(key == 'D')
  {
    flash = true;
    time = 250;
  } 
}

void setup() 
{
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);

  keypad.addEventListener(keyPadProcesser);  
}

void loop() 
{
  keypad.getKey();
  if(flash)
  {
    int range = millis() % (2 * time);
    if( range > 0 && range < time)
    {
      led.turnOff();
    }
    else
    {
      led.turnOn();
    }    
  }    
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
rgb2:R
rgb2:COM
rgb2:G
rgb2:B
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4