C:\> Rostislav Persion's Projects

.:: Arduino Morse Code ::.
Arduino project for decoding Morse code








This is an Arduino program that decodes Morse code from an I/O pin.

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);    
}

void loop() {

  long endOfBufferTime = 1000; // button off delay in ms for end of letter
  long datDelay = 500; // if button pressed more than this number in ms then a dash not a dot

  String buff = "";
  while(1 == 1)
  {
    // wait till 1
    long cnt2 = 0;
    while( digitalRead(2) == 0)
    {
      cnt2++;
      delay(1);
      // measure blank delay... if over thresh then output buffer
      if ((cnt2 > endOfBufferTime) & (buff.length() > 0))
      {
          //Serial.print(buff += "\n");
          if (buff == ".-") {Serial.print("\nA\n"); buff = ""; }
          if (buff == "-...") {Serial.print("\nB\n"); buff = ""; }
          if (buff == "-.-.") {Serial.print("\nC\n"); buff = ""; }
          if (buff == "-..") {Serial.print("\nD\n"); buff = ""; }
          if (buff == ".") {Serial.print("\nE\n"); buff = ""; }
          if (buff == "..-.") {Serial.print("\nF\n"); buff = ""; }
          if (buff == "--.") {Serial.print("\nG\n"); buff = ""; }
          if (buff == "....") {Serial.print("\nH\n"); buff = ""; }
          if (buff == "..") {Serial.print("\nI\n"); buff = ""; }
          if (buff == ".---") {Serial.print("\nJ\n"); buff = ""; }
          if (buff == "-.-") {Serial.print("\nK\n"); buff = ""; }
          if (buff == ".-..") {Serial.print("\nL\n"); buff = ""; }
          if (buff == "--") {Serial.print("\nM\n"); buff = ""; }
          if (buff == "-.") {Serial.print("\nN\n"); buff = ""; }
          if (buff == "---") {Serial.print("\nO\n"); buff = ""; }
          if (buff == ".--.") {Serial.print("\nP\n"); buff = ""; }
          if (buff == "--.-") {Serial.print("\nQ\n"); buff = ""; }
          if (buff == ".-.") {Serial.print("\nR\n"); buff = ""; }
          if (buff == "...") {Serial.print("\nS\n"); buff = ""; }
          if (buff == "-") {Serial.print("\nT\n"); buff = ""; }
          if (buff == "..-") {Serial.print("\nU\n"); buff = ""; }
          if (buff == "...-") {Serial.print("\nV\n"); buff = ""; }
          if (buff == ".--") {Serial.print("\nW\n"); buff = ""; }
          if (buff == "-..-") {Serial.print("\nX\n"); buff = ""; }
          if (buff == "-.--") {Serial.print("\nY\n"); buff = ""; }
          if (buff == "--..") {Serial.print("\nZ\n"); buff = ""; }

          if (buff == ".----") {Serial.print("\n1\n"); buff = ""; }
          if (buff == "..---") {Serial.print("\n2\n"); buff = ""; }
          if (buff == "...--") {Serial.print("\n3\n"); buff = ""; }
          if (buff == "....-") {Serial.print("\n4\n"); buff = ""; }
          if (buff == ".....") {Serial.print("\n5\n"); buff = ""; }
          if (buff == "-....") {Serial.print("\n6\n"); buff = ""; }
          if (buff == "--...") {Serial.print("\n7\n"); buff = ""; }
          if (buff == "---..") {Serial.print("\n8\n"); buff = ""; }
          if (buff == "----.") {Serial.print("\n9\n"); buff = ""; }
          if (buff == "-----") {Serial.print("\n0\n"); buff = ""; }

      }
    }

    // measure 1
    long cnt1 = 0;
    while( digitalRead(2) == 1)
    {
      cnt1++;
      delay(1);
    }

    //judge dit or dat
    int res = 0;
    if (cnt1 < datDelay) { res = 0; } else { res = 1; }

    //output
    if (res == 0)
    {
      Serial.print(".");
      buff += ".";
    }
    if (res == 1)
    {
      Serial.print("-");
      buff += "-";
    }

  }


}




With Arduino LCD / Button Sheild (letter at a time)






#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


void setup() { pinMode(2, INPUT); }

void clear_lcd()
{
  lcd.setCursor(0,1);lcd.print("                ");
}


void loop() {

  long endOfBufferTime = 1000; // button off delay in ms for end of letter
  long datDelay = 500; // if button pressed more than this number in ms then a dash not a dot

  String buff = "";

  clear_lcd();
  lcd.setCursor(0,1);lcd.print("SLAVA MORSE SOS");
  delay(3000);
  
  clear_lcd();
  lcd.setCursor(0,1);lcd.print("READY... ");
  delay(500);
  
  while(1 == 1)
  {
    // wait till 1
    long cnt2 = 0;
    while(!((analogRead(0) > 500) and (analogRead(0)< 1000)))
    {
      cnt2++;
      delay(1);
      // measure blank delay... if over thresh then output buffer
      if ((cnt2 > endOfBufferTime) & (buff.length() > 0))
      {
          //Serial.print(buff += "\n");
          if (buff == ".-") {clear_lcd();lcd.setCursor(0,1);lcd.print("A "); buff = ""; }
          if (buff == "-...") {clear_lcd();lcd.setCursor(0,1);lcd.print("B "); buff = ""; }
          if (buff == "-.-.") {clear_lcd();lcd.setCursor(0,1);lcd.print("C "); buff = ""; }
          if (buff == "-..") {clear_lcd();lcd.setCursor(0,1);lcd.print("D "); buff = ""; }
          if (buff == ".") {clear_lcd();lcd.setCursor(0,1);lcd.print("E "); buff = ""; }
          if (buff == "..-.") {clear_lcd();lcd.setCursor(0,1);lcd.print("F "); buff = ""; }
          if (buff == "--.") {clear_lcd();lcd.setCursor(0,1);lcd.print("G "); buff = ""; }
          if (buff == "....") {clear_lcd();lcd.setCursor(0,1);lcd.print("H "); buff = ""; }
          if (buff == "..") {clear_lcd();lcd.setCursor(0,1);lcd.print("I "); buff = ""; }
          if (buff == ".---") {clear_lcd();lcd.setCursor(0,1);lcd.print("J "); buff = ""; }
          if (buff == "-.-") {clear_lcd();lcd.setCursor(0,1);lcd.print("K "); buff = ""; }
          if (buff == ".-..") {clear_lcd();lcd.setCursor(0,1);lcd.print("L "); buff = ""; }
          if (buff == "--") {clear_lcd();lcd.setCursor(0,1);lcd.print("M "); buff = ""; }
          if (buff == "-..") {clear_lcd();lcd.setCursor(0,1);lcd.print("N "); buff = ""; }
          if (buff == "---") {clear_lcd();lcd.setCursor(0,1);lcd.print("O "); buff = ""; }
          if (buff == ".--.") {clear_lcd();lcd.setCursor(0,1);lcd.print("P "); buff = ""; }
          if (buff == "--.-") {clear_lcd();lcd.setCursor(0,1);lcd.print("Q "); buff = ""; }
          if (buff == ".-.") {clear_lcd();lcd.setCursor(0,1);lcd.print("R "); buff = ""; }
          if (buff == "...") {clear_lcd();lcd.setCursor(0,1);lcd.print("S "); buff = ""; }
          if (buff == "-") {clear_lcd();lcd.setCursor(0,1);lcd.print("T "); buff = ""; }
          if (buff == "..-") {clear_lcd();lcd.setCursor(0,1);lcd.print("U "); buff = ""; }
          if (buff == "...-") {clear_lcd();lcd.setCursor(0,1);lcd.print("V "); buff = ""; }
          if (buff == ".--") {clear_lcd();lcd.setCursor(0,1);lcd.print("W "); buff = ""; }
          if (buff == "-..-") {clear_lcd();lcd.setCursor(0,1);lcd.print("X "); buff = ""; }
          if (buff == "-.--") {clear_lcd();lcd.setCursor(0,1);lcd.print("Y "); buff = ""; }
          if (buff == "--..") {clear_lcd();lcd.setCursor(0,1);lcd.print("Z "); buff = ""; }

          if (buff == ".----") {clear_lcd();lcd.setCursor(0,1);lcd.print("1 "); buff = ""; }
          if (buff == "..---") {clear_lcd();lcd.setCursor(0,1);lcd.print("2 "); buff = ""; }
          if (buff == "...--") {clear_lcd();lcd.setCursor(0,1);lcd.print("3 "); buff = ""; }
          if (buff == "....-") {clear_lcd();lcd.setCursor(0,1);lcd.print("4 "); buff = ""; }
          if (buff == ".....") {clear_lcd();lcd.setCursor(0,1);lcd.print("5 "); buff = ""; }
          if (buff == "-....") {clear_lcd();lcd.setCursor(0,1);lcd.print("6 "); buff = ""; }
          if (buff == "--...") {clear_lcd();lcd.setCursor(0,1);lcd.print("7 "); buff = ""; }
          if (buff == "---..") {clear_lcd();lcd.setCursor(0,1);lcd.print("8 "); buff = ""; }
          if (buff == "----.") {clear_lcd();lcd.setCursor(0,1);lcd.print("9 "); buff = ""; }
          if (buff == "-----") {clear_lcd();lcd.setCursor(0,1);lcd.print("0 "); buff = ""; }

      }
    }

    // measure 1
    long cnt1 = 0;
    while((analogRead(0) > 500) and (analogRead(0)< 1000))
    {
      cnt1++;
      delay(1);
    }

    //judge dit or dat
    int res = 0;
    if (cnt1 < datDelay) { res = 0; } else { res = 1; }

    //output
    if (res == 0)
    {
      lcd.print(".");
      buff += ".";
    }
    if (res == 1)
    {
      lcd.print("-");
      buff += "-";
    }

  }


}



With Arduino LCD / Button Sheild (entire word)






#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


void setup() { pinMode(2, INPUT); }

void clear_lcd()
{
  lcd.setCursor(0,1);lcd.print("                ");
}


void loop() {

  long endOfBufferTime = 1000; // button off delay in ms for end of letter
  long datDelay = 500; // if button pressed more than this number in ms then a dash not a dot

  String buff = "";

  clear_lcd();
  lcd.setCursor(0,1);lcd.print("SLAVA MORSE SOS");
  delay(3000);

  clear_lcd();
  lcd.setCursor(0,1);lcd.print("> ");
  delay(3000);


    
  while(1 == 1)
  {
    // wait till 1
    long cnt2 = 0;
    while(!((analogRead(0) > 500) and (analogRead(0)< 1000)))
    {
      cnt2++;
      delay(1);
      // measure blank delay... if over thresh then output buffer
      if ((cnt2 > endOfBufferTime) & (buff.length() > 0))
      {
          //Serial.print(buff += "\n");
          if (buff == ".-") {lcd.print("A"); buff = ""; }
          if (buff == "-...") {lcd.print("B"); buff = ""; }
          if (buff == "-.-.") {lcd.print("C"); buff = ""; }
          if (buff == "-..") {lcd.print("D"); buff = ""; }
          if (buff == ".") {lcd.print("E"); buff = ""; }
          if (buff == "..-.") {lcd.print("F"); buff = ""; }
          if (buff == "--.") {lcd.print("G"); buff = ""; }
          if (buff == "....") {lcd.print("H"); buff = ""; }
          if (buff == "..") {lcd.print("I"); buff = ""; }
          if (buff == ".---") {lcd.print("J"); buff = ""; }
          if (buff == "-.-") {lcd.print("K"); buff = ""; }
          if (buff == ".-..") {lcd.print("L"); buff = ""; }
          if (buff == "--") {lcd.print("M"); buff = ""; }
          if (buff == "-..") {lcd.print("N"); buff = ""; }
          if (buff == "---") {lcd.print("O"); buff = ""; }
          if (buff == ".--.") {lcd.print("P"); buff = ""; }
          if (buff == "--.-") {lcd.print("Q"); buff = ""; }
          if (buff == ".-.") {lcd.print("R"); buff = ""; }
          if (buff == "...") {lcd.print("S"); buff = ""; }
          if (buff == "-") {lcd.print("T"); buff = ""; }
          if (buff == "..-") {lcd.print("U"); buff = ""; }
          if (buff == "...-") {lcd.print("V"); buff = ""; }
          if (buff == ".--") {lcd.print("W"); buff = ""; }
          if (buff == "-..-") {lcd.print("X"); buff = ""; }
          if (buff == "-.--") {lcd.print("Y"); buff = ""; }
          if (buff == "--..") {lcd.print("Z"); buff = ""; }

          if (buff == ".----") {lcd.print("1"); buff = ""; }
          if (buff == "..---") {lcd.print("2"); buff = ""; }
          if (buff == "...--") {lcd.print("3"); buff = ""; }
          if (buff == "....-") {lcd.print("4"); buff = ""; }
          if (buff == ".....") {lcd.print("5"); buff = ""; }
          if (buff == "-....") {lcd.print("6"); buff = ""; }
          if (buff == "--...") {lcd.print("7"); buff = ""; }
          if (buff == "---..") {lcd.print("8"); buff = ""; }
          if (buff == "----.") {lcd.print("9"); buff = ""; }
          if (buff == "-----") {lcd.print("0"); buff = ""; }

      }
    }

    // measure 1
    long cnt1 = 0;
    while((analogRead(0) > 500) and (analogRead(0)< 1000))
    {
      cnt1++;
      delay(1);
    }

    //judge dit or dat
    int res = 0;
    if (cnt1 < datDelay) { res = 0; } else { res = 1; }

    //output
    if (res == 0)
    {
      //lcd.print(".");
      buff += ".";
    }
    if (res == 1)
    {
      //lcd.print("-");
      buff += "-";
    }

  }


}