diff --git a/4pack/4pack.ino b/4pack/4pack.ino new file mode 100644 index 0000000..61a72fd --- /dev/null +++ b/4pack/4pack.ino @@ -0,0 +1,213 @@ +#include +#include +#include + +//debounce milliseconds +const int debounce = 5; +//Switch Pins +const byte k[4] = { 4, 5, 6, 7 }; +//Switch status +boolean s[4] = { 0, 0, 0, 0 }; + +//M for Media Key, K for Keyboard +const char codetype[4] = { 'K', 'K', 'K', 'K' }; + +//Keycodes +const ConsumerKeycode ccode[4] = { MEDIA_VOLUME_MUTE, + MEDIA_VOLUME_MUTE, + MEDIA_PLAY_PAUSE, + MEDIA_PLAY_PAUSE + }; + +const KeyboardKeycode kcode[4] = { KEY_LEFT_ARROW, + KEY_DOWN_ARROW, + KEY_UP_ARROW, + KEY_RIGHT_ARROW + }; +byte col = 0; +byte leds[2][2]; +const int keyfade = 40; +const char curve[] = { + 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1 +}; +const int fadecount = 2; +const unsigned long breathcount = 5000; +int fadecounter = 0; +unsigned long breathcounter = 0; +byte pass = 1; + +// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1) +int pins[6] = { + -1, 18, 19, 20, 21 +}; + +// col[xx] of leds = pin yy on led matrix +int cols[2] = { + pins[2], pins[1] +}; + +// row[xx] of leds = pin yy on led matrix +int rows[2] = { + pins[4], pins[3] +}; + + + +void setup() { + Keyboard.begin(); + Consumer.begin(); + setupLeds(); + onLeds(); + //setup inputs, turn on pullups + for (int i = 0; i < 4; i++) { + pinMode(k[i], INPUT); + digitalWrite(k[i], 1); + } +} + +void loop() { + CheckKeys(); + delay(debounce); + + fadecounter++; + if (fadecounter > fadecount) { + fadecounter = 0; + fade(); + } + breathcounter++; + if (breathcounter > breathcount) { + breathcounter = 0; + fadecounter = 0; + breath(); + } +} + +void CheckKeys() { + for (int i = 0; i < 4; i++) { + if (codetype[i] == 'M') { + if (digitalRead(k[i]) == 0) { + if (s[i] == 0) { + Consumer.press((ccode[i])); + s[i] = 1; + byte row = i / 2; + byte col = i % 2; + leds[col][row] = 60; + breathcounter = 0; + } + } + else { + if (s[i] == 1) { + s[i] = 0; + Consumer.release((ccode[i])); + byte row = i / 2; + byte col = i % 2; + leds[col][row] = 60; + breathcounter = 0; + } + } + } + if (codetype[i] == 'K') { + if (digitalRead(k[i]) == 0) { + if (s[i] == 0) { + Keyboard.press((kcode[i])); + s[i] = 1; + byte row = i / 2; + byte col = i % 2; + leds[col][row] = 60; + breathcounter = 0; + } + } + else { + if (s[i] == 1) { + s[i] = 0; + Keyboard.release((kcode[i])); + byte row = i / 2; + byte col = i % 2; + leds[col][row] = 60; + breathcounter = 0; + } + } + } + } +} + +void setupLeds() { + // sets the pins as output + for (int i = 1; i <= 4; i++) { + pinMode(pins[i], OUTPUT); + } + + // set up cols and rows + for (int i = 1; i <= 2; i++) { + digitalWrite(cols[i - 1], HIGH); + } + + for (int i = 1; i <= 2; i++) { + digitalWrite(rows[i - 1], LOW); + } + + clearLeds(); + + // Set refresh rate (interrupt timeout period) + Timer1.initialize(500); + // Set interrupt routine to be called + Timer1.attachInterrupt(display); +} + +void clearLeds() { + // Clear display array + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + leds[i][j] = 0; + } + } +} + +void onLeds() { + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + leds[i][j] = keyfade; + } + } +} + +void fade() { + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (leds[i][j] > 0) { + leds[i][j] = leds[i][j] - 1; + } + } + } +} + +void breath() { + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + leds[i][j] = 60; + } + } +} + +// Interrupt routine +void display() { + digitalWrite(cols[col], HIGH); // Turn whole previous column off + col++; + if (col == 2) { + col = 0; + pass++; + if (pass > 8) { + pass = 1; + } + } + for (int row = 0; row < 2; row++) { + if (curve[leds[col][row]] > pass) { + digitalWrite(rows[row], HIGH); // Turn on this led + } + else { + digitalWrite(rows[row], LOW); // Turn off this led + } + } + digitalWrite(cols[col], LOW); // Turn whole column on at once (for equal lighting times) +} +