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

}

}