SKETCH
ARDUINO
CW KEYER
BEACON
// 2.11.2018, Arduino IDE v1.8.7, v0.2
//
// PROGRAMMA ORIGINALE BY LZ2WSG(KN34PC)...CW BCN USING SI5351
//
// MODIFICATO BY IK1LBW AD USO CW KEYER PER BEACON (NOVEMBRE 2020)
//
// SI RICORDA CHE UN MESSAGGIO AD USO BEACON DEVE ESSERE "RACCHIUSO" IN UN TEMPO DI 60 SECONDI.
//
//IN TALE TEMPO,OLTRE AL MSG. DA TRASMETTERE DEVO ESSERE COMPRESI I TEMPI DI "PAUSA" E DI "PORTANTE FISSA".
//
//SI RACCOMANDA DI LASCIARE DOPO LA PORTANTE "FISSA" UN TEMPO DI PAUSA DI CIRCA 10 SECONDI PER DARE MODO DI RICEVERE ULTERIORI BCN CHE ARRIVASSERO ISOOFREQUENZA VIA TROPO/E.S.
//
// 73 de ARMANDO (IK1LBW)
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#define PIN_SP 10// posizione out monitor audio= pin 10 di Arduino
#define PIN_TX 13// posizione out monitor led tx= pin 13 di Arduino
uint16_t duration = 100;//valore velocita' cw (WPM 80-100)....maggiore il valore minore e' la velocita'(valore ottimale bcn 90/110 WPM)
uint16_t hz = 750;//valore nota monitor pin 10 di Arduino (settato a 750 hz...ma si possono scegliere altri valori)
String cw_message = "V V V DE IK1LBW JN44VD";//inserire il msg. da trasmettere (in maiuscolo)
//---------------------------------------------------------------------------------------------------------
void setup() {
pinMode(PIN_TX, OUTPUT);
}
//----------------------------------------IMPOSTAZIONE TEMPI ON/OFF PORTANTE ESPRESSI IN MILLISECONDI(1 secondo= 1000 millisecondi)-------------------------------------------------
void loop() {
cw_string_proc(cw_message); // durata spazio tra msg. e portante fissa bcn (scegliere valori >900 millisecondi)
delay(1000);
cw(true);
delay(15000); // durata portante fissa bcn (scegliere valori >10000 millisecondi)
cw(false);
delay(9000); // durata spazio tra portante fissa bcn e inizio msg. (scegliere valori >5000 millisecondi)
}
//---------------------------------------------------------------------------------------------------------
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) { //GENERAZIONE SIMBOLI CODICE MORSE (CW)
String s;
if (m == ' ') { // #1087;#1072;#1091;#1079;#1072; #1084;#1077;#1078;#1076;#1091; #1076;#1091;#1084;#1080;#1090;#1077;
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; // FINE GENERAZIONE SIMBOLI CODICE MORSE
}
}
}
//------------------------------ CREAZIONE VALORE DEL "PUNTO" ( . ) ---------------------------------------------------------------------------
void ti() {
cw(true); // TX TI (punto)
delay(duration);
cw(false); // stop TX TI (punto)
delay(duration);
}
//------------------------------ CREAZIONE VALORE DELLA "LINEA ( _ ) ---------------------------------------------------------------------------
void ta() {
cw(true); // TX TA (linea)
delay(3 * duration);
cw(false); // stop TX TA (linea)
delay(duration);
}
//---------------------------------------------------------------------------------------------------------
void char_space() { // 3x, #1087;#1072;#1091;#1079;#1072; #1084;#1077;#1078;#1076;#1091; #1073;#1091;#1082;#1074;#1080;#1090;#1077;
delay(2 * duration); // 1 from element-end + 2 new
}
//---------------------------------------------------------------------------------------------------------
void word_space() { // 7x, #1087;#1072;#1091;#1079;#1072; #1084;#1077;#1078;#1076;#1091; #1076;#1091;#1084;#1080;#1090;#1077;
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) {
digitalWrite(PIN_TX, HIGH);
tone(PIN_SP, hz);
}
else {
digitalWrite(PIN_TX, LOW);
noTone(PIN_SP);
}
}