SKETCH ARDUINO BEACON




// 2.11.2018, Arduino IDE v1.8.7, v0.2

// CW Beacon using Si5351, LZ2WSG, KN34PC

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

#include "si5351.h"


#define PIN_SP 10// posizione out monitor audio= pin 10 Arduino

#define PIN_TX 13// posizione out monitor ledtx= pin 13 Arduino


Si5351 si5351(0x60);


uint16_t duration = 100;//valore velocita' cw (80-100)(maggiore e' il valore...minore WPM)

uint16_t hz = 750;//valore nota monitor (750hz)

String cw_message = "VVV DE IK1LBW/B   JN44VD PSE QSL";//inserire il msg. da trasmettere (maiuscolo)

uint32_t tx = 50475000; // inserire freq. tx (es.)--> 50.426 mhz= 50426000   144.444 mhz= 144444000 (28224=28222000)  (50444=50443000)  (144444=144433500)

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

void setup() {

  pinMode(PIN_TX, OUTPUT);


  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 25000000, 0);

  si5351.set_freq(tx * SI5351_FREQ_MULT, SI5351_CLK1);

  si5351.output_enable(SI5351_CLK1, 0);

  si5351.drive_strength(SI5351_CLK1,SI5351_DRIVE_8MA);// settaggio PWT out...2MA=2Mw...4MA=4Mw...8MA=8Mw...MAX !!

}

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

void loop() {

  cw_string_proc(cw_message); // durata spazio tra msg. e portante fissa bcn (>900)

  delay(1000);


  cw(true);

  delay(10000); // durata portante fissa bcn (>15000)


  cw(false);

  delay(7000); // durata spazio tra portante fissa bcn e inizio msg. (>5000)

}

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

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 == ' ') {                                      // пауза между думите

    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 (punto)

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

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

    }

  }

}

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

void ti() {

  cw(true);                                            // TX TI (punto)

  delay(duration);


  cw(false);                                           // stop TX TI (punto)

  delay(duration);

}

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

void ta() {

  cw(true);                                            // TX TA (linea)

  delay(3 * duration);


  cw(false);                                           // stop TX TA (linea)

  delay(duration);

}

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

void char_space() {                                    // 3x, пауза между буквите

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

}

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

void word_space() {                                    // 7x, пауза между думите

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

}

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

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

  if (state) {

    si5351.output_enable(SI5351_CLK1, 1);

    digitalWrite(PIN_TX, HIGH);

    tone(PIN_SP, hz);

  }

  else {

    si5351.output_enable(SI5351_CLK1, 0);

    digitalWrite(PIN_TX, LOW);

    noTone(PIN_SP);

  }

}