<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Morse Zone</title>
    <description>The latest articles on DEV Community by Morse Zone (@morsezone).</description>
    <link>https://dev.to/morsezone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4185974%2F03f5d557-1924-47a0-b704-dc133417218b.png</url>
      <title>DEV Community: Morse Zone</title>
      <link>https://dev.to/morsezone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/morsezone"/>
    <language>en</language>
    <item>
      <title>Learn Morse Code in 10 Minutes a Day with a Free Translator</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sun, 18 Oct 2026 04:53:28 +0000</pubDate>
      <link>https://dev.to/morsezone/learn-morse-code-in-10-minutes-a-day-with-a-free-translator-109d</link>
      <guid>https://dev.to/morsezone/learn-morse-code-in-10-minutes-a-day-with-a-free-translator-109d</guid>
      <description>&lt;p&gt;Morse code is one of the oldest digital encodings still in use, and it is also one of the easiest skills to start learning. You only need two symbols — a dot and a dash — and a little daily practice. Here is a simple routine that takes about ten minutes a day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics
&lt;/h2&gt;

&lt;p&gt;Every letter and number is mapped to a sequence of dots and dashes. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A = &lt;code&gt;.-&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;B = &lt;code&gt;-...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;C = &lt;code&gt;-.-.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;S = &lt;code&gt;...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;O = &lt;code&gt;---&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most famous example is &lt;strong&gt;SOS&lt;/strong&gt;: &lt;code&gt;... --- ...&lt;/code&gt;. If you can memorise a handful of letters first, the rest follow quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 10-minute daily routine
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Minutes 0–3: Learn three letters.&lt;/strong&gt; Pick three new letters each day and say them out loud while visualising the dots and dashes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minutes 3–7: Translate practice.&lt;/strong&gt; Use a &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;free morse code translator&lt;/a&gt; to type words you see around you — the name of a street, your favourite snack — and study the Morse output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minutes 7–10: Decode practice.&lt;/strong&gt; Paste Morse strings into &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; and decode them back into text, checking whether you could have read them by ear.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Practice with sound
&lt;/h2&gt;

&lt;p&gt;Morse code is meant to be heard. A good translator with audio playback lets you listen to the rhythm of dots and dashes and train your ear at the same time as your eyes. Try closing your eyes and decoding short words just from the beeps — you will be surprised how quickly it clicks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it fun
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Decode song titles or film names and guess them before checking.&lt;/li&gt;
&lt;li&gt;Send a secret Morse message to a friend and see if they can decode it.&lt;/li&gt;
&lt;li&gt;Track your streak: ten minutes a day for a month is enough to read basic Morse comfortably.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is consistency rather than long study sessions. Short daily drills build the muscle memory that makes decoding feel automatic. Grab a &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;free morse code translator&lt;/a&gt; and start with your own name today — it takes less than a minute, and it is genuinely satisfying to see it in dots and dashes.&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Browser-Based Morse Practice Oscillator (and Why Morse Timing Is a Protocol-Design Masterclass)</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sat, 17 Oct 2026 19:11:05 +0000</pubDate>
      <link>https://dev.to/morsezone/browser-based-morse-practice-oscillator-and-why-morse-timing-is-a-protocol-design-masterclass-313j</link>
      <guid>https://dev.to/morsezone/browser-based-morse-practice-oscillator-and-why-morse-timing-is-a-protocol-design-masterclass-313j</guid>
      <description>&lt;h1&gt;
  
  
  Browser-Based Morse Practice Oscillator (and Why Morse Timing Is a Protocol-Design Masterclass)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Project summary:&lt;/strong&gt; A pocket-sized Morse code practice oscillator you can build in an evening — an Arduino Nano, a piezo buzzer, one push button, and the correct ITU timing — plus a browser-based decoder to check your sending. Everything fits in a mint tin. Total cost under $10.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why bother learning Morse in 2026?
&lt;/h2&gt;

&lt;p&gt;Morse code turns 190 in 2026 (depending on which milestone you count — American Morse in 1836, International Morse standardised by the ITU in 1865). It is still tested in niche amateur-radio licensing paths, still used by QRP portable operators who can get a 5-watt signal across an ocean when voice modes fail, and still the recommended low-bandwidth fallback in emergency-communication plans.&lt;/p&gt;

&lt;p&gt;But this project isn't really about emergency preparedness. It's about &lt;strong&gt;timing as protocol design&lt;/strong&gt;. Morse code is arguably the first widely deployed variable-length digital encoding: before Huffman coding (1952), before the ITU standardised it, telegraph engineers in the 1840s had already solved the core problem — the most frequent letters should have the shortest codes. E is one dit. T is one dah. That's compression by statistics, worked out with brass keys and ears.&lt;/p&gt;

&lt;p&gt;If you write software or build hardware, Morse is worth learning because it forces you to internalise what a protocol &lt;em&gt;is&lt;/em&gt;: an agreement about timing, framing, and error handling, implemented in the cheapest medium available. A practice oscillator is the "hello world" of that agreement — and it's genuinely fun to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The timing specification (the part everyone gets wrong)
&lt;/h2&gt;

&lt;p&gt;Most hobby oscillators get the timing subtly wrong, which means you train your ear on the wrong protocol. Here is the actual standard — the International Morse timing from ITU Recommendation M.1677 — stated in units, where one unit ("dit length") is the fundamental atom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dit (·)&lt;/strong&gt;: 1 unit, key down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dah (−)&lt;/strong&gt;: 3 units, key down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap between dits and dahs within one character&lt;/strong&gt;: 1 unit, key up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap between characters&lt;/strong&gt;: 3 units, key up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap between words&lt;/strong&gt;: 7 units, key up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The speed of Morse is measured in words per minute (WPM), anchored to the standard word PARIS: 50 units. At 20 WPM, one unit is exactly 60 ms; at 5 WPM (a comfortable learning speed), one unit is 240 ms. These ratios — 1:3:1:3:7 — are the whole protocol. Get them right and everything else follows; get them wrong and you're speaking a dialect no one decodes.&lt;/p&gt;

&lt;p&gt;The practical implication for the build: &lt;strong&gt;the microcontroller should own the timing, not your finger.&lt;/strong&gt; Beginners' biggest problem is inconsistent gaps. So this project has two operating modes: &lt;em&gt;manual keying&lt;/em&gt; (you send, the firmware measures you against the spec and shows your error) and &lt;em&gt;trainer mode&lt;/em&gt; (the Arduino sends correctly timed characters and you learn the sound by ear).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What you'll need
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Parts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Arduino Nano (any ATmega328P board works; a Nano Every or classic Nano is fine)&lt;/li&gt;
&lt;li&gt;Piezo buzzer, active or passive (passive lets you set the sidetone frequency — 600–700 Hz is standard for practice)&lt;/li&gt;
&lt;li&gt;Tactile push button (this is your key)&lt;/li&gt;
&lt;li&gt;10 kΩ resistor (button pull-down), 220 Ω resistor (optional, for an LED)&lt;/li&gt;
&lt;li&gt;LED (visual feedback, doubles as the "light signaling" demo)&lt;/li&gt;
&lt;li&gt;Breadboard or perfboard, jumper wires&lt;/li&gt;
&lt;li&gt;Power: USB cable for the bench; a 9 V battery + barrel jack (or a phone power bank) for the "mint tin" portable version&lt;/li&gt;
&lt;li&gt;Optional: second button or a small potentiometer for speed control&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Software
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Arduino IDE (or arduino-cli)&lt;/li&gt;
&lt;li&gt;A browser with a Morse decoder for verifying your sending — I use the free practice tools at &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;https://morsezone.com/&lt;/a&gt; (their translator doubles as a sending checker: type your message, play the audio, and compare it against what you keyed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost: under $10 if you have an Arduino in a drawer; under $25 with a new Nano clone and a mint tin.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The circuit
&lt;/h2&gt;

&lt;p&gt;This is deliberately minimal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Key (tactile button)&lt;/strong&gt; between D2 and GND, with a 10 kΩ pull-down to GND so D2 isn't floating (or use &lt;code&gt;INPUT_PULLUP&lt;/code&gt; and skip the resistor entirely — see firmware below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Piezo buzzer&lt;/strong&gt; on D8. If passive, you'll drive it with &lt;code&gt;tone()&lt;/code&gt;. If active, a plain &lt;code&gt;digitalWrite()&lt;/code&gt; works; &lt;code&gt;tone()&lt;/code&gt; on an active buzzer is harmless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LED&lt;/strong&gt; (with 220 Ω series resistor) on D13 — flashes with the key, so you can practice "light Morse" (flashlight signaling uses exactly the same timing).&lt;/li&gt;
&lt;li&gt;Optional &lt;strong&gt;speed pot&lt;/strong&gt; on A0: maps to 5–25 WPM.&lt;/li&gt;
&lt;li&gt;Optional second button on D3: short-press toggles trainer mode; long-press replays the last trainer character.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wiring diagram (text version — draw it on paper before you breadboard):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nano D2  ----[button]---- GND        (use INPUT_PULLUP)
Nano D8  ----[piezo +]   piezo - → GND
Nano D13 ----[220R]------[LED+]      LED - → GND
Nano A0  ----[pot wiper]            (optional speed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole schematic. If you've built anything with an Arduino before, this takes ten minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The firmware
&lt;/h2&gt;

&lt;p&gt;The firmware is the interesting part. It has three jobs: generate correct timing, measure your timing, and report the error. Here's the core — a complete sketch you can paste into the Arduino IDE:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Morse Practice Oscillator — morse-practice.ino&lt;/span&gt;
&lt;span class="c1"&gt;// Timing per ITU M.1677: dit=1, dah=3, intra-char gap=1, char gap=3, word gap=7&lt;/span&gt;


&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;KEY_PIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;BUZZER_PIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;LED_PIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;SIDETONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;650&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;// Hz — standard practice sidetone&lt;/span&gt;


&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;wpm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                     &lt;span class="c1"&gt;// start slow&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="nf"&gt;unitMs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1200UL&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;wpm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// PARIS = 50 units&lt;/span&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;keyDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BUZZER_PIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SIDETONE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_PIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;noTone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BUZZER_PIN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_PIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendDit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;keyDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unitMs&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendDah&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;keyDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unitMs&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;units&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;units&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unitMs&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// Send one character from a compact table (A-Z, 0-9)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ... lookup table of dits/dahs, then:&lt;/span&gt;
  &lt;span class="c1"&gt;// for each element: sendDit() or sendDah(); gap(1) between elements&lt;/span&gt;
  &lt;span class="c1"&gt;// gap(3) after the character&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;trainerLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// picks random letters, sends them at your WPM, pauses for you to guess&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full sketch — including the A–Z/0–9 lookup table, the serial monitor that prints what the trainer sent (so you can check your ear), and the &lt;strong&gt;self-measurement mode&lt;/strong&gt; — is linked in the project's files. The measurement mode is the feature I'm proudest of: it timestamps your key-down and key-up events with &lt;code&gt;millis()&lt;/code&gt;, compares each dit/dah/gap against the 1:3:1:3:7 ratios at your chosen WPM, and prints a report over serial like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KEYED: .--  target: .--   dit err +8%  dah err -3%  gap err +21%  &amp;lt;-- watch your gaps!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beginners almost always rush the gaps. Seeing "+21% gap error" in the serial monitor fixes in an evening what months of casual practice won't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the firmware owns the timing, not you
&lt;/h3&gt;

&lt;p&gt;Human timing jitter on a hand key is enormous — studies of straight-key operators show 20–30% variance even in experienced hands. That's fine on the air (the human ear is a magnificent adaptive decoder), but when you're &lt;em&gt;learning&lt;/em&gt;, you want a reference implementation first and improvisation later. Trainer mode gives you the reference; measurement mode shows you the delta. This is the same loop as learning any protocol: implement the spec, diff against the spec, converge.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Assembly: the mint-tin portable
&lt;/h2&gt;

&lt;p&gt;For the portable version:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transfer the breadboard circuit to a small piece of perfboard. Solder the Nano's headers, the buzzer (or mount it in the tin lid as a speaker grille), the button (drill a hole in the lid — this is your key), and the LED.&lt;/li&gt;
&lt;li&gt;Power: a 9 V battery fits in an Altoids tin alongside the perfboard. Add a slide switch in the battery lead.&lt;/li&gt;
&lt;li&gt;Label the lid with a felt-tip pen: DIT / DAH reference card. (Print the Morse alphabet from any reference — or use an online translator to generate a cheat sheet.)&lt;/li&gt;
&lt;li&gt;Glue four small rubber feet to the bottom so the tin doesn't dance across the desk when you're keying at 20 WPM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total build time, soldering included: about two hours. Difficulty: beginner — if you can blink an LED, you can build this.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The practice routine (15 minutes a day)
&lt;/h2&gt;

&lt;p&gt;Hardware without a routine becomes desk decoration. Here's the routine I used, adapted from how CW operators actually learn:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Days 1–3 — ears first, never the chart.&lt;/strong&gt; Trainer mode at 8 WPM sends random letters; you guess, serial monitor confirms. Never look at a dots-and-dashes chart while listening — the goal is &lt;em&gt;sound → letter&lt;/em&gt;, not &lt;em&gt;sound → dots → letter&lt;/em&gt;. That's the single most important rule in Morse pedagogy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 4–7 — add the key.&lt;/strong&gt; Manual mode at 8 WPM. Send what the trainer just sent. Watch the gap-error report; keep gaps honest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 8–14 — speed up the character rate, keep spacing wide.&lt;/strong&gt; This is the Farnsworth method: send characters at 15 WPM but stretch the gaps between characters. It teaches the &lt;em&gt;rhythm&lt;/em&gt; of fast code without the panic. The optional speed pot maps to exactly this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 15+ — copy real text.&lt;/strong&gt; Have a friend (or a second Arduino running a different sketch) send words. Or decode practice audio from the web and verify your copy against the source text.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To check your work against a reference, play the target text through an online translator's audio and compare it with your own sending — the translator at the link in the parts section works well as a neutral referee because it implements the same 1:3:1:3:7 timing.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What this teaches about protocol design
&lt;/h2&gt;

&lt;p&gt;Build this and you'll have felt, in your hands, four ideas that show up in every communication protocol you'll ever design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Variable-length encoding beats fixed-length when frequencies are skewed.&lt;/strong&gt; E=·, T=−. Huffman proved it optimal in 1952; telegraphers shipped it in the 1840s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing &lt;em&gt;is&lt;/em&gt; the framing.&lt;/strong&gt; There are no packet headers in Morse — the 1/3/7-unit gaps are the framing layer. UART start/stop bits, Ethernet inter-frame gaps, and USB SOF packets are the same idea in silicon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error detection lives at the human layer.&lt;/strong&gt; There's no checksum in Morse; the operator's brain does forward error correction from context. Every protocol eventually leans on the layer above it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The spec is the product.&lt;/strong&gt; This project's firmware is ~200 lines; the timing table it implements is 5 ratios. The value isn't the code, it's conformance to the agreement.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Going further
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Koch method trainer:&lt;/strong&gt; add an SD card or store word lists in PROGMEM; the Koch method (two letters at full speed, add a letter at 90% accuracy) is the fastest documented path to 20 WPM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light signaling:&lt;/strong&gt; the LED already implements it — try "flashlight Morse" across a dark room. Same timing, different medium. (The 7-unit word gap is what makes light signaling readable at distance.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QRP transmitter:&lt;/strong&gt; replace the buzzer with a keyed oscillator stage and you have the conceptual core of every CW transmitter ever built. Don't transmit without a licence — but the &lt;em&gt;keying circuit&lt;/em&gt; is identical to what you'd key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decode side:&lt;/strong&gt; point a microphone at the buzzer and write the decoder (Goertzel algorithm for tone detection + a state machine for the 1:3:1:3:7 timing). Encoding was this project; decoding is the natural sequel.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Project files:&lt;/strong&gt; full Arduino sketch (with lookup table, trainer mode, and self-measurement mode), a printable Morse reference card, and photos of the mint-tin build will be attached to this project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;License:&lt;/strong&gt; CERN-OHL-S for hardware, MIT for firmware — build it, fork it, teach with it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;About the author: I build free web tools for learning Morse code, including the translator/checker referenced above. This project exists because the best way to understand a 180-year-old protocol is to implement it with your own hands.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>arduino</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Browser-Based Morse Practice Oscillator (and Why Morse Timing Is a Protocol-Design Masterclass)</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:05:56 +0000</pubDate>
      <link>https://dev.to/morsezone/browser-based-morse-practice-oscillator-and-why-morse-timing-is-a-protocol-design-masterclass-30hh</link>
      <guid>https://dev.to/morsezone/browser-based-morse-practice-oscillator-and-why-morse-timing-is-a-protocol-design-masterclass-30hh</guid>
      <description>&lt;h1&gt;
  
  
  Browser-Based Morse Practice Oscillator (and Why Morse Timing Is a Protocol-Design Masterclass)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Project summary:&lt;/strong&gt; A pocket-sized Morse code practice oscillator you can build in an evening — an Arduino Nano, a piezo buzzer, one push button, and the correct ITU timing — plus a browser-based decoder to check your sending. Everything fits in a mint tin. Total cost under $10.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why bother learning Morse in 2026?
&lt;/h2&gt;

&lt;p&gt;Morse code turns 190 in 2026. It is still tested in niche amateur-radio licensing paths, still used by QRP portable operators who can get a 5-watt signal across an ocean when voice modes fail, and still the recommended low-bandwidth fallback in emergency-communication plans.&lt;/p&gt;

&lt;p&gt;It's about &lt;strong&gt;timing as protocol design&lt;/strong&gt;. Morse code is arguably the first widely deployed variable-length digital encoding: before Huffman coding (1952), telegraph engineers in the 1840s had already solved the core problem — the most frequent letters should have the shortest codes. E is one dit. T is one dah.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The timing specification
&lt;/h2&gt;

&lt;p&gt;The International Morse timing from ITU Recommendation M.1677, in units: &lt;strong&gt;Dit&lt;/strong&gt; 1 unit; &lt;strong&gt;Dah&lt;/strong&gt; 3 units; &lt;strong&gt;gap within a character&lt;/strong&gt; 1 unit; &lt;strong&gt;gap between characters&lt;/strong&gt; 3 units; &lt;strong&gt;gap between words&lt;/strong&gt; 7 units. Speed is measured in WPM anchored to PARIS (50 units). These ratios — 1:3:1:3:7 — are the whole protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What you'll need
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Parts:&lt;/strong&gt; Arduino Nano, piezo buzzer (600–700 Hz sidetone), tactile push button, 10 kΩ resistor, 220 Ω resistor, LED, breadboard, jumper wires, USB cable or 9V battery. &lt;strong&gt;Software:&lt;/strong&gt; Arduino IDE, plus a browser-based Morse decoder — I use the free practice tools at &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;https://morsezone.com/&lt;/a&gt; (their translator doubles as a sending checker).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The practice routine (15 minutes a day)
&lt;/h2&gt;

&lt;p&gt;Days 1–3: ears first at 8 WPM, never look at a chart while listening. Days 4–7: add the key, watch your gap timing. Days 8–14: Farnsworth method — fast characters, wide spacing. Days 15+: copy real text; verify against a reference like the translator at &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;https://morsezone.com/&lt;/a&gt;, which implements the same 1:3:1:3:7 timing.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What this teaches about protocol design
&lt;/h2&gt;

&lt;p&gt;Variable-length encoding beats fixed-length when frequencies are skewed. Timing &lt;em&gt;is&lt;/em&gt; the framing (like UART start/stop bits). Error detection lives at the human layer. The spec is the product — the value is conformance to the agreement.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;About the author: I build free web tools for learning Morse code, including the translator at &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;https://morsezone.com/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>arduino</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
