diff --git a/analog/analogread.ino b/analog/analogread.ino new file mode 100644 index 0000000..2d0b212 --- /dev/null +++ b/analog/analogread.ino @@ -0,0 +1,220 @@ +#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); + } +} +