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);
}
}