#define HWSERIAL Serial1 void setup() { Serial.begin(9600); HWSERIAL.begin(9600); } const unsigned long sleeptime = 2500; unsigned long sleep = 0; int aread = 0; boolean bounce = 0; // array to hold analog values for each column int col[12]; // array to hold high and low values for each range int range[16][2] = { {1009, 1024}, {204, 215}, {343, 352}, {146, 152}, {507, 518}, {170, 176}, {255, 260}, {126, 134}, {686, 701}, {186, 192}, {295, 302}, {137, 142}, {409, 416}, {157, 162}, {227, 238}, {118, 125} }; // convert to switch positions boolean bin[16][4] = { {0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 1}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 0, 1}, {0, 0, 1, 1}, {1, 0, 1, 1}, {0, 1, 1, 1}, {1, 1, 1, 1} }; // array to hold key positions boolean keya[12][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} }; boolean keyb[12][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} }; void loop() { LEDsleep(); readcolumns(); assignkeysA(); delay(5); readcolumns(); assignkeysB(); compkeys(); if (bounce == 0) { LEDupdate(); SERIALupdate(); } } void readcolumns() { byte pass = 0; int comp = 0; for (int x = 0; x < 12; x++) { aread = 0;; comp = 0; pass = 0; while (pass < 3) { aread = analogRead(x + 14); if (aread != comp) { pass = 0; } comp = aread; pass++; } col[x] = aread; } } void assignkeysA() { for (int c = 0; c < 12; c++) { for (int v = 0; v < 16; v++) { if ((col[c] >= range[v][0]) && (col[c] <= range[v][1])) { for (byte x = 0; x < 4; x++) { keya[c][x] = bin[v][x]; } } } } } void assignkeysB() { for (int c = 0; c < 12; c++) { for (int v = 0; v < 16; v++) { if ((col[c] >= range[v][0]) && (col[c] <= range[v][1])) { for (byte x = 0; x < 4; x++) { keyb[c][x] = bin[v][x]; } } } } } void compkeys() { for (int c = 0; c < 12; c++) { for (int v = 0; v < 16; v++) { bounce = 0; for (byte x = 0; x < 4; x++) { if (keya[c][x] != keyb[c][x]) { bounce = 1; } } } } } void LEDupdate() { for (int c = 0; c < 12; c++) { for (byte r = 0; r < 4; r++) { if (keya[c][r] == 1) { sleep = 0; HWSERIAL.write((r * 16) + c); Serial.println((r * 16) + c); } } } } void SERIALupdate() { for (int y = 0; y < 12; y++) { Serial.print(col[y]); Serial.print(", "); } Serial.println(); } void LEDsleep() { if (sleep < sleeptime) { sleep++; } if (sleep == sleeptime) { HWSERIAL.write(random(0, 63)); delay(5); } }