1
0
Misc/analog/analogread.ino
di0ib 72237266a5 Create analogread.ino
Former-commit-id: afc3ff6fc3df0d6a2217c51d610af6240e8b78d9
2017-05-10 09:17:03 -10:00

221 рядки
3.1 KiB
C++

#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);
}
}