1 | void setup() { |
2 | Serial.begin(115200); |
3 | Serial.print("Bitte Morsetext eingeben\r\n"); |
4 | pinMode(13, OUTPUT); |
5 | }
|
6 | |
7 | int PinOut = 13; |
8 | String incomingString = ""; |
9 | //Array Di=1 Dah=3, 2=Leer 5 Elemente pro Buchstabe
|
10 | uint8_t Morsecode[211] = {1, 3, 2, 2, 2, 3, 1, 1, 1, 2, 3, 1, 3, 1, 2, 3, 1, 1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 3, 3, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 3, 3, 3, 2, 3, 1, 3, 2, 2, 1, 3, 1, 1, 2, 3, 3, 2, 2, 2, 3, 1, 2, 2, 2, 3, 3, 3, 2, 2, 1, 3, 3, 1, 2, 3, 3, 1, 3, 2, 1, 3, 1, 2, 2, 1, 1, 1, 2, 2, 3, 2, 2, 2, 2, 1, 1, 3, 2, 2, 1, 1, 1, 3, 2, 1, 3, 3, 2, 2, 3, 1, 1, 3, 2, 3, 1, 3, 3, 2, 3, 3, 1, 1, 2, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 1, 3, 3, 3, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 3, 1, 1, 3, 3, 3, 3, 1}; |
11 | |
12 | unsigned long times = 100; |
13 | uint8_t sx = 0; |
14 | void loop() { |
15 | if (Serial.available() > 0) { //Zeichen da? |
16 | char tempincomingChar = Serial.read(); //dann Buchstaben einlesen |
17 | if (isAlphaNumeric(tempincomingChar) || isWhitespace(tempincomingChar)) //Ist das eingelese Zeichen alphanumerisch oder ein TAB/Leerzeichen? |
18 | incomingString += tempincomingChar; // dann Zeichen zum String hinzufügen |
19 | else if (isSpace(tempincomingChar)) { //Wenn Morsetectende erreicht hier weitermachen |
20 | incomingString.toLowerCase(); //Alle zeichen kleinschreibend, wegen Einfachheit |
21 | for (int i = 0; i < incomingString.length(); i++ ) { //Chars durchgehen |
22 | if (isDigit(incomingString.charAt(i)))//Numerisch? |
23 | sx = (((int)incomingString.charAt(i)) - 22) * 5; //Startpunkt berechnen Asciicode-Offset*5 =Element Morsetaktestart |
24 | else if (isAlpha(incomingString.charAt(i)))//Buchstabe? |
25 | sx = (((int)incomingString.charAt(i)) - 97) * 5; //zb. bei asciicode a=97 97-97=0 1 und 3 / kurz und dann lang und die 2en Skippen |
26 | else if ((int)incomingString.charAt(i) == ' ') { //Oder Leerzeichen? |
27 | delay(times * 4);//Dann Wortlücke 3 und 4=7 Takte Wortlücke |
28 | continue; //nächster Buchstabe |
29 | }
|
30 | for (int c = 0; c <= 4; c++) { //Ab Element sx 5 Elemente als Takte einlesen und Pin toggeln |
31 | if (Morsecode[sx + c] == 2) continue;//bei der ersten "2" nächster Buchstabe |
32 | digitalWrite(13, HIGH); //Pin auf High |
33 | delay(Morsecode[sx + c] * times);//100ms oder 300ms für kurz oder lang anhalten |
34 | digitalWrite(13, LOW);//Auf Low ziehen |
35 | delay(times);//1di Wartezeit zwischen kurz/lang |
36 | }
|
37 | delay(3 * times);//1dah Wartezeit zwischen Buchstaben |
38 | }
|
39 | incomingString = ""; |
40 | delay(1000); |
41 | Serial.print("Bitte Morsetext eingeben\r\n"); |
42 | }
|
43 | }
|
44 | }
|
45 | /*
|
46 | • Der Benutzer wird über die serielle Schnittstelle im Terminal
|
47 | aufgefordert eine Zeichenkette einzugeben.
|
48 | ◦ Die Zeichenkette darf Groß- & Kleinbuchstaben sowie Leerzeichen und
|
49 | Ziffern enthalten. Andere Zeichen werden zwar entgegengenommen, aber
|
50 | später (beim Morsen) ignoriert. ◦ Die vorzusehende Zeichenkettenlänge
|
51 | berechnet sich individuell folgendermaßen: length = Klassenkatalognummer
|
52 | + 6
|
53 | • Dann soll am Terminal der zu morsende Text angezeigt werden. Die
|
54 | nicht morsbaren Zeichen werden nicht angezeigt.
|
55 | • Dann wird die Anzahl der zu morsenden Zeichen am Terminal angegeben.
|
56 | (Anzahl = ...)
|
57 | • Dann wird ein Countdown angezeigt von 5 bis 0, der das Morsen
|
58 | ankündigt. (Morsen beginnt in 5, 4, 3, 2, 1, go!
|
59 | • Dann wird die Zeichenkette gemorst.
|
60 | • Nach einer Sekunde Pause beginnt die Sequenz von neuem, der Benutzer
|
61 | kann einen neuen Text eingeben.
|
62 | Hinweise
|
63 | • Wenn etwas in dieser Beschreibung nicht eindeutig festgelegt ist,
|
64 | aber zur Problemlösung festgelegt werden sollte, dann legen Sie es fest.
|
65 | Dokumentieren Sie getroffene Festlegungen samt Erläuterungen im
|
66 | Kopfkommentar Ihres Quellcodes. Beispielsweise ist hier nicht festgelegt
|
67 | ◦ womit gemorst wird. Dazu gibt es verschiedene Möglichkeiten: Buzzer
|
68 | (cool!), onboard LED (langweilig!), externe LED (ok...)
|
69 | ◦ woher die im Programm verwendeten Timings sind (wie lange ist ein
|
70 | Punkt, eine Pause ein Strich); suche dazu im Internet eine "ordentliche"
|
71 | Quelle
|
72 | • Lass Dich von Deinen eigenen Ideen leiten! Du kannst gerne
|
73 | Erweiterungen einbauen, z. B.
|
74 | Könnte jedes Zeichen während es gemorst wird am Terminal angezeigt
|
75 | werden.
|
76 | Dokumentiere auch diese im Kopfkommentar.*/
|