#define SPEED  (17) //speed in WPM. Default: 16
#define DOTLEN  (1200/SPEED)
#define DASHLEN  (3*(1200/SPEED))
#define PAUSE 10 //Time in seconds between transmissions

int ledPin=13; //Digital pin used to show when the tone is playing. Pin 13 has an attached led on most Arduino boards.
int tonePin=3; //Digital pin used to send the tone. It MUST be a PWM pin (Marked with ~).
int toneFreq=500; //Tone frequency. Usually between 500 and 900 Hz.

void sendMsg(char*);
void dash();
void dot();

void setup()
{
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Arduino Morse Beacon - by Nicola Salsotto IN3GJH - github.com/NicoVarg99");
  Serial.println("modified by Rich k0eb for ARISS camp at the Eaton Library 2022");
  Serial.print("\n");
}

void loop()
{
  sendMsg("ARISS at the Eaton Library");
  Serial.print("DELAY: ");
  Serial.print(PAUSE);
  Serial.println(" s");
  delay(PAUSE*1000);
}


void dash()
{
  digitalWrite(ledPin, HIGH);
  tone(tonePin, toneFreq);
  delay(DASHLEN);
  digitalWrite(ledPin, LOW);
  noTone(tonePin);
  tone(tonePin, 21000);
  delay(DOTLEN);
  noTone(tonePin);
}

void dot()
{
  digitalWrite(ledPin, HIGH) ;
  tone(tonePin, toneFreq);
  delay(DOTLEN);
  digitalWrite(ledPin, LOW);
  noTone(tonePin);
  tone(tonePin, 21000);
  delay(DOTLEN);
  noTone(tonePin);
}

void eol()
{
  tone(tonePin, 21000);
  delay(DOTLEN*2);
  noTone(tonePin);
}

void sendMsg(char *str)
{
  int i;

  tone(tonePin, 21000);
  delay(500);
  noTone(tonePin);

  Serial.print("TX: ");
  for(i=0;i<strlen(str);i++)
  {
    switch (str[i])
    {
    case 'A':
      dot();dash();eol();break;
    case 'B':
      dash();dot();dot();dot();eol();break;
    case 'C':
      dash();dot();dash();dot();eol();break;
    case 'D':
      dash();dot();dot();eol();break;
    case 'E':
      dot();eol();break;
    case 'F':
      dot();dot();dash();dot();eol();break;
    case 'G':
      dash();dash();dot();eol();break;
    case 'H':
      dot();dot();dot();dot();eol();break;
    case 'I':
      dot();dot();eol();break;
    case 'J':
      dot();dash();dash();dash();eol();break;
    case 'K':
      dash();dot();dash();eol();break;
    case 'L':
      dot();dash();dot();dot();eol();break;
    case 'M':
      dash();dash();eol();break;
    case 'N':
      dash();dot();eol();break;
    case 'O':
      dash();dash();dash();eol();break;
    case 'P':
      dot();dash();dash();dot();eol();break;
    case 'Q':
      dash();dash();dot();dash();eol();break;
    case 'R':
      dot();dash();dot();eol();eol();break;
    case 'S':
      dot();dot();dot();eol();break;
    case 'T':
      dash();eol();break;
    case 'U':
      dot();dot();dash();eol();break;
    case 'V':
      dot();dot();dot();dash();eol();break;
    case 'W':
      dot();dash();dash();eol();break;
    case 'X':
      dash();dot();dot();dash();eol();break;
    case 'Y':
      dash();dot();dash();dash();eol();break;
    case 'Z':
    case 'z':
      dash();dash();dot();dot();eol();break;
    case ' ':
      tone(tonePin, 21000);
      delay(DOTLEN*5);
      noTone(tonePin);
      break;
    case '.':
      dot();dash();dot();dash();dot();dash();eol();break;
    case ',':
      dash();dash();dot();dot();dash();dash();eol();break;
    case ':':
      dash();dash();dash();dot();dot();eol();break;
    case '?':
      dot();dot();dash();dash();dot();dot();eol();break;
    case '\'':
      dot();dash();dash();dash();dash();dot();eol();break;
    case '-':
      dash();dot();dot();dot();dot();dash();eol();break;
    case '/':
      dash();dot();dot();dash();dot();eol();break;
    case '(':
    case ')':
      dash();dot();dash();dash();dot();dash();eol();break;
    case '\"':
      dot();dash();dot();dot();dash();dot();eol();break;
    case '@':
      dot();dash();dash();dot();dash();dot();eol();break;
    case '=':
      dash();dot();dot();dot();dash();eol();break;
    case '0':
     dash();dash();dash();dash();dash();eol();break;
    case '1':
     dot();dash();dash();dash();dash();eol();break;
    case '2':
     dot();dot();dash();dash();dash();eol();break;
    case '3':
     dot();dot();dot();dash();dash();eol();break;
    case '4':
     dot();dot();dot();dot();dash();eol();break;
    case '5':
     dot();dot();dot();dot();dot();eol();break;
    case '6':
     dash();dot();dot();dot();dot();eol();break;
    case '7':
     dash();dash();dot();dot();dot();eol();break;
    case '8':
     dash();dash();dash();dot();dot();eol();break;
    case '9':
     dash();dash();dash();dash();dot();eol();break;

    }
    Serial.print(str[i]);
    delay(DOTLEN*2);
  }
  Serial.print("\n");
}