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 +}