SimpleMorse.ino


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.*/