# define DOT 0
# define DASH 1
# define DOTTIME 80
# define BEEPER 9
# define FREQ 477
byte table[][3] = {
//character if dot if dash relative neopixel for character
/* 0 */ {'?', 1, 2},
// 2
/* 1 . E */ {'E', 3, 4},
/* 2 - T */ {'T', 5, 6},
// 4
/* 3 .. I */ {'I', 7, 11},
/* 4 .- A */ {'A', 8, 12},
/* 5 -. N */ {'N', 9, 13},
/* 6 -- M */ {'M', 10, 14},
// 8
/* 7 ... S */ {'S', 15, 23},
/* 8 .-. R */ {'R', 16, 24},
/* 9 -.. D */ {'D', 17, 25},
/* 10 --. G */ {'G', 18, 26},
/* 11 ..- U */ {'U', 19, 27},
/* 12 .-- W */ {'W', 20, 28},
/* 13 -.- K */ {'K', 21, 29},
/* 14 --- O */ {'O', 22, 30},
// 16
/* 15 .... H */ {'H', 0, 0},
/* 16 .-.. L */ {'L', 0, 0},
/* 17 -... B */ {'B', 0, 0},
/* 18 --.. Z */ {'Z', 0, 0},
/* 19 ..-. F */ {'F', 0, 0},
/* 20 .--. P */ {'P', 0, 0},
/* 21 -.-. C */ {'C', 0, 0},
/* 22 ---. = */ {'?', 0, 0},
/* 23 ...- V */ {'V', 0, 0},
/* 24 .-.- = */ {'?', 15, 0},
/* 25 -..- X */ {'X', 0, 0},
/* 26 --.- Q */ {'Q', 0, 0},
/* 27 ..-- = */ {'?', 0, 0},
/* 28 .--- J */ {'J', 0, 0},
/* 29 -.-- Y */ {'Y', 0, 0},
/* 30 ---- = */ {'?', 0, 0},
};
void setup() {
Serial.begin(115200);
pinMode(BEEPER, OUTPUT);
setupDashDot();
reset();
}
int tState;
void tableFSM(int event)
{
dashDot(event);
tState = table[tState][event + 1];
if (event == DOT)
Serial.print("DOT --> ");
else
Serial.print("DASH--> ");
Serial.println((char) table[tState][0]);
letterUp((int) table[tState][0]);
}
void reset (void)
{
tState = 0;
resetDashDot();
Serial.println("");
Serial.println("RESET");
}
char *testCharacters[] = {".-", ".-..", "-", "---"};
const byte nChars = sizeof testCharacters / sizeof *testCharacters;
int fork = 7;
void loop()
{
for (int ii = 0; ii < nChars; ii++) {
Serial.println(testCharacters[ii]);
reset();
char *xx = testCharacters[ii];
while (*xx) {
tableFSM(*xx == '.' ? DOT : DASH);
tone(BEEPER, FREQ, *xx == '.' ? DOTTIME : (3 * DOTTIME));
delay(*xx == '.' ? DOTTIME : (3 * DOTTIME));
xx++;
delay(DOTTIME); // sue me.
}
delay(DOTTIME * 2); // already did one
}
delay(1000);
reset();
// make it stop
if (!--fork) for (; ; );
}
// totally separable DashDot display mechanism
# define N_REAL 42
# define NDASHDOT 16
# define PIN_NEOPIXEL 10
# include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel track(N_REAL, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);
int nextPixel;
void setupDashDot() {
track.begin();
track.setPixelColor(1, 0xff0000);
track.setPixelColor(2, 0x00ff00);
track.setPixelColor(3, 0x0000ff);
track.setPixelColor(4, 0xffffff);
track.show();
delay(777);
}
void letterUp(int theLetter)
{
static int lastLetter;
if (lastLetter)
track.setPixelColor(lastLetter, 0x0000ff);
track.setPixelColor(theLetter - 'A' + NDASHDOT, 0xff0000);
lastLetter = theLetter - 'A' + NDASHDOT;
track.show();
}
# define BACK 0x205020
void resetDashDot() {
nextPixel = 0;
track.fill(BACK);
track.show();
}
void dashDot(int event) {
if (nextPixel >= NDASHDOT) return;
if (event == DASH) {
for (byte ii = 0; ii < 3; ii++)
track.setPixelColor(nextPixel + ii, 0xc080ff);
nextPixel += 3;
}
if (event == DOT) {
track.setPixelColor(nextPixel, 0xc080ff);
nextPixel++;
}
track.setPixelColor(nextPixel, BACK);
nextPixel++; // intercharacter space.
track.show();
}
A...B...C...D...E.....F...G...H...I.....J...K...L....M...N...O...P...Q....R...S...T....U....V...W...X...Y....Z
FPS: 0
Power: 0.00W
Power: 0.00W