Skip to content

Instantly share code, notes, and snippets.

@gene-ressler
Last active December 5, 2022 05:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gene-ressler/0ffd38ee1d9a12a5701e9c286fd6e157 to your computer and use it in GitHub Desktop.
Save gene-ressler/0ffd38ee1d9a12a5701e9c286fd6e157 to your computer and use it in GitHub Desktop.
Sketch to flash and beep International Morse for a console string
#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