#include <Keypad.h>
#include <FastLED.h>
// kompilacja:
// 0/1 - wył/wł dodatkowe info w serial i miganie zintegrowaną diodą
#define _INFO_ (1)
#define WIERSZ 4
#define KOLUMNA 10
#define ROZMIAR_MATRYCA (WIERSZ * KOLUMNA)
#define PIN_MATRYCA 12
#define CZAS_INFO 10000 // 10 sekund
#if _INFO_
#define PIN_DIODA 13
bool stan_dioda = false; // dioda wbudowana na płytce
unsigned long czas_poprz = millis();
#endif
byte klucz[WIERSZ][KOLUMNA] = {0};
byte wPiny[WIERSZ] = {A3, A2, A1, A0};
byte kPiny[KOLUMNA] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
CRGB matryca_led[ROZMIAR_MATRYCA];
CRGB kolor[4] = {CRGB::Yellow, CRGB::Red, CRGB::Blue, CRGB::Green};
bool stan[ROZMIAR_MATRYCA] = { false };
Keypad klawa = Keypad(makeKeymap(klucz), wPiny, kPiny, WIERSZ, KOLUMNA);
// uzupełnia klucze dla przycisków
void ustaw_klucze(){
byte * wsk = (byte*)klucz; // wskazuje jak na tablicę 1-wymiarową
for(byte i = 0; i < ROZMIAR_MATRYCA; i++) wsk[i] = i + 1;
}
void start_matryca(){
FastLED.clear();
FastLED.show();
}
void setup() {
#if _INFO_
pinMode(PIN_DIODA, OUTPUT);
#endif
ustaw_klucze();
FastLED.addLeds<NEOPIXEL, PIN_MATRYCA>(matryca_led, ROZMIAR_MATRYCA);
start_matryca();
Serial.begin(9600);
while(!Serial); // czeka na serial; usuń jeżeli zawiesza płytkę
Serial.println("[INFO]: serial gotowy");
}
void loop() {
byte klawisz = (byte)klawa.getKey();
if (klawa.getState() == PRESSED && klawisz > NO_KEY && klawisz <= ROZMIAR_MATRYCA) {
byte id = klawisz - 1;
stan[id] = !stan[id];
matryca_led[id] = (stan[id] ? kolor[byte(id / 10)] : CRGB::Black); // pokazuję odpowiedni kolor lub wyłączam diodę
FastLED.show();
char buff[14] = {0};
snprintf(buff, 14, "id: %i [%s]", klawisz, stan[id] ? "on" : "off");
Serial.println(buff);
}
#if _INFO_
// wypisuje co 10 sekund czy żyje i zmienia stan wbudowanej diody
unsigned long czas_teraz = millis();
if((czas_teraz - czas_poprz) > CZAS_INFO){
czas_poprz = czas_teraz;
digitalWrite(PIN_DIODA, (stan_dioda = !stan_dioda) ? HIGH : LOW);
Serial.println(">>> wciąż działam <<< ");
}
#endif
}