int ledPin = 13; int relayPin = 5; static unsigned char morse[43][2] = { { 5 , 31 }, // 0 { 5 , 15 }, // 1 { 5 , 7 }, // 2 { 5 , 3 }, // 3 { 5 , 1 }, // 4 { 5 , 0 }, // 5 { 5 , 16 }, // 6 { 5 , 24 }, // 7 { 5 , 28 }, // 8 { 5 , 30 }, // 9 { 0 , 0 }, // : { 0 , 0 }, // ; { 0 , 0 }, // < { 0 , 0 }, // = { 0 , 0 }, // > { 0 , 0 }, // ? { 0 , 0 }, // @ { 2 , 1 }, // A { 4 , 8 }, // B { 4 , 10 }, // C { 3 , 4 }, // D { 1 , 0 }, // E { 4 , 2 }, // F { 3 , 6 }, // G { 4 , 0 }, // H { 2 , 0 }, // I { 4 , 7 }, // J { 3 , 5 }, // K { 4 , 4 }, // L { 2 , 3 }, // M { 2 , 2 }, // N { 3 , 7 }, // O { 4 , 6 }, // P { 4 , 13 }, // Q { 3 , 2 }, // R { 3 , 0 }, // S { 1 , 1 }, // T { 3 , 1 }, // U { 4 , 1 }, // V { 3 , 3 }, // W { 4 , 9 }, // X { 4 , 11 }, // Y { 4 , 12 } // Z }; const unsigned int maxLen = 512; char message[maxLen] = "BZZTBOMB"; unsigned int curLen = 8; unsigned int curPos = 0; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(relayPin, OUTPUT); curLen = 8; } void loop() { displayChar(message[curPos]); curPos++; if (curPos >= curLen) { Serial.println("EOM"); morseDelay(3000); curPos = 0; } } void displayChar(char n) { if ((n < 48) || (n > 90)) { if (n != 32) Serial.println("out of bounds"); morseDelay(500); return; } Serial.print(n); Serial.print(" "); unsigned char idx = n - 48; unsigned char len = morse[idx][0]; unsigned char data = morse[idx][1]; for (unsigned char i = 0; i < len; i++) { if ((data & (1 << ((len-1)-i))) == 0) { Serial.print("."); dot(); } else { Serial.print("-"); dash(); } } Serial.println(""); morseDelay(500); } void flash(int delayAmt) { digitalWrite(ledPin, HIGH); digitalWrite(relayPin, HIGH); morseDelay(delayAmt); digitalWrite(ledPin, LOW); digitalWrite(relayPin, LOW); morseDelay(250); } void dot() { flash(250); } void dash() { flash(1000); } void morseDelay(unsigned long delayAmt) { // delay(delayAmt); unsigned long start = millis(); while (millis() < start + delayAmt) { // Poll for serial data if needed if (Serial.available()) handleInput(); delay(1); } } void handleInput() { if (!Serial.available()) return; curPos = 0; byte mode = 0; unsigned int bytesIn = 0; for (;;) { while (!Serial.available()) ; int input = Serial.read(); switch (mode) { case 0 :// reset stuff curLen = input; // upper byte of new length mode++; break; case 1 : curLen = (curLen << 8) | input; mode++; Serial.print("length: "); Serial.println(curLen); break; case 2 : message[bytesIn] = input; bytesIn++; if (bytesIn == curLen) { Serial.println("done!"); return; } break; } } }