Introduction: Arduino Morse Decoder

This device reads hand keyed Morse code from a signal key (or an ordinary switch) and translates it to plain text and show the Morse code you're keying on an LCD. I use it to train my own Morse keying skills.

The decoder automatically corrects itself for your keying speed.

Step 1: Requirements

1x Arduino UNO
1x Buzzer
1x LCD with I2C connector and 4 lines of text

And a switch (or Morse key), breadboard and wires.

Tip: you could create it without an LCD and then output the decoded text on the serial monitor of the Arduino IDE.

Step 2: Hardware Setup

Setup the hardware by hooking up everything as shown in the schematic diagram.

Connect the buzzer between GND and pin 8 of the Arduino and the Morse key (I use a tactile switch) between GND and pin 7.

Besides the GND and +5V pins the LCD has an SCL and SDA connection that you connect to the pins with the same names on the Arduino. I didn't use pull-up's to connect the LCD, but you could if you want to.

Step 3: Software

Upload the sketch (Seinsleutel2.ino) in the Arduino. I also included the library that I needed to use to control the LCD.

And start keying (see the video for a demonstration).

Comments

author
arvevans (author)2016-12-16

For those who do not have the I2C type liquid crystal display it should be easy to change this to use a standard 1602 style parallel interfaced LCD. Also possible to use Serial.print() to send text information to either the terminal screen that is built into the IDE or to an attached PC running a terminal emulator that is capable of connecting via tty/USB mode.

The I2C LCD library is in the zip file and can be installed in your IDE once the file has been unzipped.

It makes no difference whether variables are named in German or some other language. The compiler just converts them to numeric tokens and compiles them as defined. An example of this might be the define "int x = 5", where x is neither English or German, or both, and the compiler handles this variable name with no problem.

author
Karmacom_a (author)arvevans2017-05-07

Just to be more precise, I had to use a different library for the 1602A:

#include <LiquidCrystal.h>

Initializing the LCD with pins:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Then take into account it has 2 rows and 16 columns in the setup

lcd.begin(16, 2);

And also in the upd function

x++; if (x >= 16) {

if (y >= 2) {

I hope it helps!

author
kangetsu (author)Karmacom_a2017-05-22

Are you able to post the entire code with your updates? I am new to this and am not sure why nothing is coming up on the LCD. Thanks!!!

author
Karmacom_a (author)kangetsu2017-05-25

Hi kangetsu

sorry for late reply, I am not sure how to upload the entire code, check the connections between the Arduino and the LCD, they should be smthg like:

LCD Arduino/protobrd

K GND

A 100ohm resistor to vcc (5V)

D7 D2

D6 D3

D5 D4

D4 D5

E D11

RW GND

RS D12

V0 100ohm resistor to GND

VDD Vcc - 5V

VSS GND

Resistor values could be changed to adjust the backlight and char light to your needs

hope it helps!!

author
mhansen4 (author)2017-01-02

im getting more questionmarks than letters - is something wrong with my setup ?

author
fsona (author)2016-12-28

Hi Hackertie,

I am studying your source code and I have a question about the algorithm you use to identify a Pause and start decoding the "Kar"achter. Why do you use

if (tijd > StreepDuur - StreepDuur / 40 ) ? is it a spece between two letters?

and

if (tijd > StreepDuur * 2) ? is it the space between two words?

Many thanks

Fabio

author
Hackerstore (author)fsona2016-12-29

StreepDuur == the duration of a dash
tijd == time

The statement "if (tijd > StreepDuur - StreepDuur / 40): decodes a space between two letters.
And "(tijd > StreepDuur * 2)" is for decoading a space between words.

Som more explanation:
PuntDuur == Duration of a dot
starttijd == Start time

author
fsona (author)Hackerstore2016-12-29

thanks a lot.

Fabio

author
Coage (author)2016-04-18

I dont have the lcd display, so how can I display the reading into the monitor serial?

author
arvevans (author)Coage2016-12-16

Serial.print(variable_name); or Serial.print("text string");

author
DIY Hacks and How Tos (author)2016-04-03

This would be cool to set up with a laser pointer and send morse code between two Arduinos miles away.

author

CW transmits much further than just a few mile, and good luck getting perfect unobstructed line of sight.

author
arvevans (author)DanielV1142016-12-16

Actually there are several commercial providers of laser-beam communications systems. Th ones I installed in San Francisco area in the 1996 era are still being used today with satisfactory service. Key seems to be using dual-beam layout separated by at least 2 meters to avoid the bird blockage situation. Fog that is prevalent in that area does not seem to be a problem. System orientation does have to be observed to avoid sunrise or sunset interference with the light beam.

Hams have been experimenting with light-beam communication since the 1960's with some remote transceivers and repeaters being monitored and controlled via optical Ethernet links.

author

In the nineties, there were a lot of ideas for comercial telecommunication equipment with laser that failed with a little of fog of when a bird crossed the laser beam. It already was made... and didn't work...

Could be as an indoor experiment only.

BTW: Hacketje, good job and I'll try to modify to your code for numbers as well

Best regards to both and all contributors.

author
AntonioG19 (author)2016-12-08

i have a error in the part of the code: LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); its told me that POSITIVE is not declared

author
ernesto199 (author)2016-11-15

Leuk project, ik ga dit eens uitproberen. Ik ben bezig voor het Museum Engelandvaarders waar we een seinsleutel hebben uit de 2e wereldoorlog. De bezoeker mag straks letter voor letter morsecode nadoen in de hoop dat er wat leesbaars op het scherm komt. Ik heb wel de timing een beetje aangepast. Een dot is 200ms.

author
daryl.rasmusen (author)2016-07-21

Any way to get the sketch translated from Dutch to English?

author
R Jordan Kreindler (author)2016-07-11

A view from a different perspective. Thanks.

author
NithinR1 (author)2016-07-08

Plzzzz Tell me that the programs are working...!!!!!!!

author
Hackertje (author)NithinR12016-07-08

Yes, the program works :=) Do you need any help understanding the code?

author
NithinR1 (author)2016-07-08

Is this in English...????

author
Hackertje (author)NithinR12016-07-08

It is Morse. It understands every language, English too.

author
kamingto (author)2016-04-26

May I let me know how to show the numbers(0-9) in your program?

author
Hackertje (author)kamingto2016-04-26

My program only shows letters. The source is there, feel free to extend it. You could add an additional string array with numbers, add another while loop (like the one that starts in line 100 in my code) to check if a number was keyed.

author
kamingto (author)Hackertje2016-04-27

Thank you. I will try it.

author
kamingto (author)2016-04-13

Why the program cannot write in arduino?
It's shown undefined reference to `atexit' from DecodeerKar()

author
cdrobsonjr (author)2016-04-07

Funny as anything to me trying to read your code written in some kind of Scandinavian language. :)

author
Hackertje (author)cdrobsonjr2016-04-08

Funny that you think Dutch is a Scandinavian language :-)

author
fishlee05 (author)2016-04-08

Why the error "Seinsleutel2.cpp.o: In function `DecodeerKar()': C:\Program Files (x86)\Arduino/Seinsleutel2.ino:107: undefined reference to `atexit' when I Verify the code ??

author
martyn.walker (author)2016-04-04

Wouldn't it be interesting to replace the button with a microphone then run some of the transmissions on this page through it? http://www.radiomarine.org/audio/list?panel=pab1_13

author
momoluv (author)2016-04-03

I can tell you put a lot of effort into this! Nice work, keep it up :-)

About This Instructable

16,461views

164favorites

License:

Bio: Goeroe.
More by Hackertje:Fitness GamesThe WOPR (WWW Operated Relay)Space Invaders Fitness
Add instructable to: