#include <Toggle.h>
struct BrailleMP3 {
byte brailleCode; // 6 bits for braille dots
byte track; // mp3 track number
const char* label; // associated character or string
};
BrailleMP3 brailleStructs[] = {
{ 0b000001, 1, "a" }, //a playing track 00001
{ 0b000011, 2, "b" }, //b playing track 00002
{ 0b001001, 3, "c" }, //c playing track 00003
{ 0b011001, 4, "d" }, //d playing track 00004
{ 0b010001, 5, "e" }, //e playing track 00005
{ 0b001011, 6, "f" }, //f playing track 00006
{ 0b011011, 7, "g" }, //g playing track 00007
{ 0b010011, 8, "h" }, //h playing track 00008
{ 0b001010, 9, "i" }, //i playing track 00009
{ 0b011010, 10, "j" }, //j playing track 00010
{ 0b000101, 11, "k" }, //k playing track 00011
{ 0b000111, 12, "l" }, //l playing track 00012
{ 0b001101, 13, "m" }, //m playing track 00013
{ 0b011101, 14, "n" }, //n playing track 00014
{ 0b010101, 15, "o" }, //o playing track 00015
{ 0b001111, 16, "p" }, //p playing track 00016
{ 0b011111, 17, "q" }, //q playing track 00017
{ 0b010111, 18, "r" }, //r playing track 00018
{ 0b001110, 19, "s" }, //s playing track 00019
{ 0b011110, 20, "t" }, //t playing track 00020
{ 0b100101, 21, "u" }, //u playing track 00021
{ 0b100111, 22, "v" }, //v playing track 00022
{ 0b111010, 23, "w" }, //w playing track 00023
{ 0b101101, 24, "x" }, //x playing track 00024
{ 0b111101, 25, "y" }, //y playing track 00025
{ 0b110101, 26, "z" }, //z playing track 00026
{ 0b101111, 27, "AND" }, //[ playing track 00027 "AND"
{ 0b111111, 28, "FOR" }, //\ playing track 00028 "FOR"
{ 0b110111, 29, "OF" }, //] playing track 00029 "OF"
{ 0b101110, 30, "THE" }, //^ playing track 00030 "THE"
};
class ButtonLed : public Toggle {
public:
byte bPin;
byte lPin;
ButtonLed(const byte p, const byte l) : Toggle(p), bPin(p), lPin(l) {}
void begin() {
Toggle::begin(bPin);
pinMode(lPin, OUTPUT);
}
};
ButtonLed buttons[3][2] = {
{{11, 5}, {10, 2}}, // 1 4
{{12, 6}, { 9, 3}}, // 2 5
{{13, 7}, { 8, 4}} // 3 6
};
void searchBrailleCode(const byte code) {
for (auto& b : brailleStructs) {
if (b.brailleCode == code) {
Serial.print(F("Label: "));
Serial.print(b.label);
Serial.print(F(" - Track ID: "));
Serial.println(b.track);
return;
}
}
Serial.println(F("Braille code does not exist"));
}
void setup() {
Serial.begin(115200);
for (auto& row : buttons)
for (auto& b : row)
b.begin();
}
void loop() {
bool changed = false;
for (auto& row : buttons) {
for (auto& b : row) {
b.poll();
if (b.onPress()) {
digitalWrite(b.lPin, digitalRead(b.lPin) == HIGH ? LOW : HIGH);
changed = true;
}
}
}
if (changed) {
byte brailleCode = 0;
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 2; col++) {
bool on = digitalRead(buttons[row][col].lPin) == HIGH;
if (on) brailleCode |= 1 << (col * 3 + row);
Serial.write(on ? 'x' : '.');
Serial.write(' ');
}
Serial.println();
}
searchBrailleCode(brailleCode);
Serial.println(F("------"));
}
}