// Morse Code Practice Generator Ray Gardiner VK3YNV 2/8/2022 // Connect Speaker to Pin 8 #define pin 8 #define dit_time 120 #define side_tone 550 // define spacing // delay starts from beginning of tone, the tone function returns immediately so the delay has // to add one dit time for dits, so delay is 2 dit times for a dit and 4 dit times for dah. // letter and word spacing is after void letter_space() { delay(dit_time*3); } void word_space() { delay(dit_time*7); } void dit() { tone(pin,side_tone,dit_time); delay(dit_time*2); ; } void dah() { tone(pin,side_tone,dit_time*3); delay(dit_time*4); ; } void A() { dit(); dah(); } void B() { dah(); dit(); dit(); dit(); } void C() { dah(); dit(); dah(); dit(); } void D() { dah(); dit(); dit(); } void E() { dit(); } void f() { dit(); dit(); dah(); dit(); } void G() { dah(); dah(); dit(); } void H() { dit(); dit(); dit(); dit(); } void I() { dit(); dit(); } void J() { dit(); dah(); dah(); dah(); } void K() { dah(); dit(); dah(); } void L() { dit(); dah(); dit(); dit(); } void M() { dah(); dah(); } void N() { dah(); dit(); } void O() { dah(); dah(); dah(); } void P() { dit(); dah(); dah(); dit(); } void Q() { dah(); dah(); dit(); dah(); } void R() { dit(); dah(); dit(); } void S() { dit(); dit(); dit(); } void T() { dah(); } void U() { dit(); dit(); dah(); } void V() { dit(); dit(); dit(); dah(); } void W() { dit(); dah(); dah(); } void X() { dah(); dit(); dit(); dah(); } void Y() { dah(); dit(); dah(); dah(); } void Z() { dah(); dah(); dit(); dit(); } void N1() { dit(); dah(); dah(); dah(); dah(); } void N2() { dit(); dit(); dah(); dah(); dah(); } void N3() { dit(); dit(); dit(); dah(); dah(); } void N4() { dit(); dit(); dit(); dit(); dah(); } void N5() { dit(); dit(); dit(); dit(); dit(); } void N6() { dah(); dit(); dit(); dit(); dit(); } void N7() { dah(); dah(); dit(); dit(); dit(); } void N8() { dah(); dit(); dit(); dit(); dit(); } void N9() { dah(); dah(); dah(); dah(); dit(); } void N0() { dah(); dah(); dah(); dah(); dah(); } void MorseTx ( char c ) { c = toupper(c); Serial.print(c); switch (c) { case 'A': A(); break; case 'B': B(); break; case 'C': C(); break; case 'D': D(); break; case 'E': E(); break; case 'F': f(); break; case 'G': G(); break; case 'H': H(); break; case 'I': I(); break; case 'J': J(); break; case 'K': K(); break; case 'L': L(); break; case 'M': M(); break; case 'N': N(); break; case 'O': O(); break; case 'P': P(); break; case 'Q': Q(); break; case 'R': R(); break; case 'S': S(); break; case 'T': T(); break; case 'U': U(); break; case 'V': V(); break; case 'W': W(); break; case 'X': X(); break; case 'Y': Y(); break; case 'Z': Z(); break; case '1': N1(); break; case '2': N2(); break; case '3': N3(); break; case '4': N4(); break; case '5': N5(); break; case '6': N6(); break; case '7': N7(); break; case '8': N8(); break; case '9': N9(); break; case '0': N0(); break; // all other non morse sendable characters just send a letter space case ' ': letter_space(); break; default: letter_space(); break; } letter_space(); } void SendRandomCharacter () { char n = random('A','Z'); MorseTx(n); } void SendGroup () { int i; for (i=0;i<5;i++) { SendRandomCharacter (); } } void setup() { Serial.begin(9600); while (!Serial) { } // send an intro: Serial.println("Morse Code Practice Generator:"); Serial.println(); } void loop() { SendGroup(); Serial.println(); delay(3000); }