From dbb12256857d38ad855a833df585eb7afb8b433a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20S=2E=20=C5=81ukasiewicz?= Date: Wed, 11 Feb 2026 22:14:02 +0100 Subject: [PATCH] Add keyer logic to Arduino --- keyer/keyer.ino | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 keyer/keyer.ino diff --git a/keyer/keyer.ino b/keyer/keyer.ino new file mode 100644 index 0000000..bf5bdd3 --- /dev/null +++ b/keyer/keyer.ino @@ -0,0 +1,49 @@ +const int dot_pin = 2; +const int dash_pin = 3; + +float wpm = 10.0f; + +char state = 'R'; // Ready, Send, Wait +int remaining = 0; +int last_update = -1; + +char last_send = 'X'; + +void setup() { + Serial.begin(115200); + + pinMode(dot_pin, INPUT_PULLUP); + pinMode(dash_pin, INPUT_PULLUP); +} + +void loop() { + int dit = 60.0f / (50.0f * wpm) * 1000.0f; + + int dt = millis() - last_update; + last_update = millis(); + remaining -= dt; + + if (state == 'S' && remaining <= 0) { + state = 'W'; + remaining = dit; + } else if (state == 'W' && remaining <= 0) { + state = 'R'; + } else if (state == 'R') { + if (digitalRead(dot_pin) == LOW) { + state = 'S'; + remaining = dit; + } + if (digitalRead(dash_pin) == LOW) { + state = 'S'; + remaining = 3 * dit; + } + } + + char current_send = state == 'S' ? '2' : '0'; + + if (current_send != last_send) { + Serial.print(current_send); + last_send = current_send; + } + delay(1); // Limit update rate under 1kHz +}