SKETCH ARDUINO BEACON 3 USCITE


// 24.07.2020, Arduino IDE v1.8.9, v0.2.1

// CW Beacon using Si5351: CLK0, CLK1, CLK2, LZ2WSG, KN34PC

//---------------------------------------------------------------------------------------------------------

#include "si5351.h"


#define PIN_SP 10

#define PIN_TX 13


Si5351 si5351(0x60);


uint16_t duration = 60;

uint16_t hz = 750;

String cw_message = "VVV de LZ2WSG BEACON KN34PC";

uint32_t tx_0 = 28000000;   // CLK0

uint32_t tx_1 = 50000000;   // CLK1

uint32_t tx_2 = 144000000;  // CLK2

//---------------------------------------------------------------------------------------------------------

void setup() {

  pinMode(PIN_TX, OUTPUT);


  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 25000000, 0);


  si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);

  si5351.drive_strength(SI5351_CLK1, SI5351_DRIVE_8MA);

  si5351.drive_strength(SI5351_CLK2, SI5351_DRIVE_8MA);


  si5351.set_freq(tx_0 * SI5351_FREQ_MULT, SI5351_CLK0);

  si5351.output_enable(SI5351_CLK0, 0);


  si5351.set_freq(tx_1 * SI5351_FREQ_MULT, SI5351_CLK1);

  si5351.output_enable(SI5351_CLK1, 0);


  si5351.set_freq(tx_2 * SI5351_FREQ_MULT, SI5351_CLK2);

  si5351.output_enable(SI5351_CLK2, 0);

}

//---------------------------------------------------------------------------------------------------------

void loop() {

  cw_string_proc(cw_message);

  delay(500);


  cw(true);

  delay(5000);


  cw(false);

  delay(1000);

}

//---------------------------------------------------------------------------------------------------------

void cw_string_proc(String str) {                      // processing string to characters

  for (uint8_t j = 0; j < str.length(); j++)

    cw_char_proc(str[j]);

}

//---------------------------------------------------------------------------------------------------------

void cw_char_proc(char m) {                            // processing characters to Morse code symbols

  String s;


  if (m == ' ') {                                      // pause between words

    word_space();

    return;

  }


  if (m > 96)                                          // ACSII, case change a-z to A-Z

    if (m < 123)

      m -= 32;


  switch (m) {                                         // Morse code

    case 'A': s = ".-#";     break;

    case 'B': s = "-...#";   break;

    case 'C': s = "-.-.#";   break;

    case 'D': s = "-..#";    break;

    case 'E': s = ".#";      break;

    case 'F': s = "..-.#";   break;

    case 'G': s = "--.#";    break;

    case 'H': s = "....#";   break;

    case 'I': s = "..#";     break;

    case 'J': s = ".---#";   break;

    case 'K': s = "-.-#";    break;

    case 'L': s = ".-..#";   break;

    case 'M': s = "--#";     break;

    case 'N': s = "-.#";     break;

    case 'O': s = "---#";    break;

    case 'P': s = ".--.#";   break;

    case 'Q': s = "--.-#";   break;

    case 'R': s = ".-.#";    break;

    case 'S': s = "...#";    break;

    case 'T': s = "-#";      break;

    case 'U': s = "..-#";    break;

    case 'V': s = "...-#";   break;

    case 'W': s = ".--#";    break;

    case 'X': s = "-..-#";   break;

    case 'Y': s = "-.--#";   break;

    case 'Z': s = "--..#";   break;


    case '1': s = ".----#";  break;

    case '2': s = "..---#";  break;

    case '3': s = "...--#";  break;

    case '4': s = "....-#";  break;

    case '5': s = ".....#";  break;

    case '6': s = "-....#";  break;

    case '7': s = "--...#";  break;

    case '8': s = "---..#";  break;

    case '9': s = "----.#";  break;

    case '0': s = "-----#";  break;


    case '?': s = "..--..#"; break;

    case ',': s = "--..--#"; break;

    case '/': s = "-..-.#";  break;

  }


  for (uint8_t i = 0; i < 7; i++) {

    switch (s[i]) {

      case '.': ti();  break;                          // TI

      case '-': ta();  break;                          // TA

      case '#': char_space(); return;                  // end of Morse code symbol

    }

  }

}

//---------------------------------------------------------------------------------------------------------

void ti() {

  cw(true);                                            // TX TI

  delay(duration);


  cw(false);                                           // stop TX TI

  delay(duration);

}

//---------------------------------------------------------------------------------------------------------

void ta() {

  cw(true);                                            // TX TA

  delay(3 * duration);


  cw(false);                                           // stop TX TA

  delay(duration);

}

//---------------------------------------------------------------------------------------------------------

void char_space() {                                    // 3x, pause between letters

  delay(2 * duration);                                 // 1 from element-end + 2 new

}

//---------------------------------------------------------------------------------------------------------

void word_space() {                                    // 7x, pause between words

  delay(6 * duration);                                 // 1 from element-end + 6 new

}

//---------------------------------------------------------------------------------------------------------

void cw(bool state) {                                  // TX-CW, TX-LED, 750 Hz sound

  if (state) {

    si5351.output_enable(SI5351_CLK0, 1);

    si5351.output_enable(SI5351_CLK1, 1);

    si5351.output_enable(SI5351_CLK2, 1);

    digitalWrite(PIN_TX, HIGH);

    tone(PIN_SP, hz);

  }

  else {

    si5351.output_enable(SI5351_CLK0, 0);

    si5351.output_enable(SI5351_CLK1, 0);

    si5351.output_enable(SI5351_CLK2, 0);

    digitalWrite(PIN_TX, LOW);

    noTone(PIN_SP);

  }

}