Last active
December 5, 2022 05:45
-
-
Save gene-ressler/0ffd38ee1d9a12a5701e9c286fd6e157 to your computer and use it in GitHub Desktop.
Sketch to flash and beep International Morse for a console string
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <ctype.h> | |
#define ACTIVE_BUZZER 12 | |
char s[256]; | |
int n = 0, p = 0; | |
void setup() { | |
delay(1000); | |
pinMode(LED_BUILTIN, OUTPUT); | |
pinMode(ACTIVE_BUZZER, OUTPUT); | |
Serial.begin(9600); | |
while (!Serial) /* skip */; | |
Serial.println("Enter a message!"); | |
} | |
#define DIT 1 | |
#define DAH 0 | |
#define P(I, V) ((V) << ((I) + 3)) | |
#define C1(A) (1 | P(0, A)) | |
#define C2(A, B) (2 | P(0, A) | P(1, B)) | |
#define C3(A, B, C) (3 | P(0, A) | P(1, B) | P(2, C)) | |
#define C4(A, B, C, D) (4 | P(0, A) | P(1, B) | P(2, C) | P(3, D)) | |
#define C5(A, B, C, D, E) (5 | P(0, A) | P(1, B) | P(2, C) | P(3, D) | P(4, E)) | |
#define DIT_TIME 100 | |
#define DAH_TIME (3 * DIT_TIME) | |
#define SYMBOL_SPACE DIT_TIME | |
#define LETTER_SPACE (3 * DIT_TIME) | |
#define WORD_SPACE (7 * DIT_TIME) | |
byte code[] = { | |
C2(DIT, DAH), // A | |
C4(DAH, DIT, DIT, DIT), // B | |
C4(DAH, DIT, DAH, DIT), // C | |
C3(DAH, DIT, DIT), // D | |
C1(DIT), // E | |
C4(DIT, DIT, DAH, DIT), // F | |
C3(DAH, DAH, DIT), // G | |
C4(DIT, DIT, DIT, DIT), // H | |
C2(DIT, DIT), // I | |
C4(DIT, DAH, DAH, DAH), // J | |
C3(DAH, DIT, DAH), // K | |
C4(DIT, DAH, DIT, DIT), // L | |
C2(DAH, DAH), // M | |
C2(DAH, DIT), // N | |
C3(DAH, DAH, DAH), // O | |
C4(DIT, DAH, DAH, DIT), // P | |
C4(DAH, DAH, DIT, DAH), // Q | |
C3(DIT, DAH, DIT), // R | |
C3(DIT, DIT, DIT), // S | |
C1(DAH), // T | |
C3(DIT, DIT, DAH), // U | |
C4(DIT, DIT, DIT, DAH), // V | |
C3(DIT, DAH, DAH), // W | |
C4(DAH, DIT, DIT, DAH), // X | |
C4(DAH, DIT, DAH, DAH), // Y | |
C4(DAH, DAH, DIT, DIT), // Z | |
C5(DAH, DAH, DAH, DAH, DAH), // 0 | |
C5(DIT, DAH, DAH, DAH, DAH), // 1 | |
C5(DIT, DIT, DAH, DAH, DAH), // 2 | |
C5(DIT, DIT, DIT, DAH, DAH), // 3 | |
C5(DIT, DIT, DIT, DIT, DAH), // 4 | |
C5(DIT, DIT, DIT, DIT, DIT), // 5 | |
C5(DAH, DIT, DIT, DIT, DIT), // 6 | |
C5(DAH, DAH, DIT, DIT, DIT), // 7 | |
C5(DAH, DAH, DAH, DIT, DIT), // 8 | |
C5(DAH, DAH, DAH, DAH, DIT), // 9 | |
}; | |
void loop() { | |
if (n >= 0) { | |
// Manage string entry. | |
if (!Serial.available()) return; | |
char ch = toupper(Serial.read()); | |
if (n > 0 && ch == '\n') { | |
s[n] = '\0'; // Terminate string. | |
n = -n; // We're done with string entry. | |
Serial.print("Sending: "); | |
Serial.println(s); | |
return; | |
} | |
if (ch == ' ' || ('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'Z')) s[n++] = ch; | |
} else { | |
// Check for newline to stop sending. | |
if (Serial.available()) { | |
do Serial.read(); while (Serial.available()); | |
n = p = 0; | |
Serial.println(""); | |
Serial.println("Enter another message!"); | |
return; | |
} | |
// Wrap if we've gone past the end of string. | |
if (!s[p]) { | |
Serial.println(""); | |
p = 0; | |
} | |
// Send International Morse. | |
char ch = s[p++]; | |
if (ch == ' ') { | |
delay(WORD_SPACE - LETTER_SPACE); | |
Serial.print(" "); | |
return; | |
} | |
byte c = code[ch <= '9' ? ch - '0' + 26 : ch - 'A']; | |
byte sz = c & 7; | |
for (byte i = 0; i < sz; ++i, c >>= 1) { | |
digitalWrite(LED_BUILTIN, HIGH); | |
digitalWrite(ACTIVE_BUZZER, HIGH); | |
delay((c & 8) ? DIT_TIME : DAH_TIME); | |
digitalWrite(ACTIVE_BUZZER, LOW); | |
digitalWrite(LED_BUILTIN, LOW); | |
delay(SYMBOL_SPACE); | |
} | |
delay(LETTER_SPACE - SYMBOL_SPACE); | |
Serial.print(ch); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment