Wenn man in die Welt der Mikrocontroller-Programmierung eintaucht, ist eines der ersten Übungen das Blinken eines SOS in Morse-Code. Aber wie geht es dann weiter? Morsen mit Arduino: In diesem Projekt erfährst du, wie du über den seriellen Monitor Text eingeben und per Arduino in Blinken und Piepsen umwandeln kannst.
Bauteile
- Piezo-Speaker (Tipp: Die kann man auch gut aus alten Melodie-Grußkarten rausoperieren.)
Schaltung

Die Schaltung besteht aus einem Arduino UNO und einem Piezo-Speaker. Dieser wird einfach an den digitalen Pin 8 und den GND des Arduinos verbunden.
Code: Morsen mit Arduino
String inputString = ""; // speichert eingehende Daten
bool stringComplete = false; // ist true, wenn der empfangene String vollständig ist
int ledPin = 13; // Ausgabe Pin LED
int speakerPin = 8; // Pin des Lautsprechers
static String morseLetters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "E"
};
static String morseNumbers[] = {"-----", ".----", "..---", "...--", "....-", "....." , "-....", "--...", "---..", "----."};
void setup() {
Serial.begin(115200); // serielle Kommunikation starten
inputString.reserve(200); // erstellt Speicherpuffer (Buffer) von 200 Bytes für eingehende Daten
pinMode(ledPin, OUTPUT); // deklariert ledPin als Output
}
void loop() {
if (stringComplete) { // wenn er vollständig empfangen wurde
Serial.println(inputString); // gib ihn im seriellen Monitor aus
morseOutput(inputString); // rufe morseOutput-Methode auf und übergib den String
inputString = ""; // String zurücksetzen
stringComplete = false; // stringComplete auf false setzen, bis wieder ein String vollständig empfangen wurde
}
}
void serialEvent() { // wird nach jedem Durchgang von loop() automatisch ausgeführt
while (Serial.available()) { // solange serielle Daten verfügbar sind
char inChar = (char)Serial.read(); // lies das aktuelle Byte aus
inputString += inChar; // füge das Byte als Char (Zeichen) dem String inputString hinzu
if (inChar == '\n') { // falls das Zeichen ein Zeilenumbruch ist, ist der Empfang der Daten abgeschlossen
stringComplete = true; // setze dann stringComplete auf true, damit die loop-Methode die Daten ausgeben kann
}
}
}
void morseOutput(String myString) {
// aktueller Buchstabe wird in Integer umgewandelt (Ascii-Code), das ergibt z.B. für das kleine a 97
String currentLetter = ""; // speichert den aktuellen Morse-Code für einen Buchstaben zwischen
for (int i = 0; i < myString.length(); i++) { // für 0 bis Länge des Strings
if ((int(myString[i]) >= 97) && (int(myString[i]) <= 122)) { // falls Buchstabe von a bis z
currentLetter = morseLetters[int(myString[i]) - 97]; // currentLetter = Stelle im Morse-Code Array ab 97
} else if ((int(myString[i]) >= 65) && (int(myString[i]) <= 90)) { // falls Buchstabe von A bis Z
currentLetter = morseLetters[int(myString[i]) - 65]; // currentLetter = Stelle im Morse-Code Array ab 65
} else if ((int(myString[i]) >= 48) && (int(myString[i]) <= 57)) { // falls Zahl von 0 bis 9
currentLetter = morseNumbers[int(myString[i]) - 48]; // currentLetter = Stelle im Morse-Code Zahlen-Array ab 48
} else {
currentLetter = " "; // bei allen anderen Zeichen, füge ein Leerzeichen ein
}
Serial.print(currentLetter); // gib den Morse-Code im seriellen Monitor aus
Serial.print(" "); // Leerzeichen im seriellen Monitor
for (int j = 0; j < currentLetter.length(); j++) { // für 0 bis Länge von current Letter
if (int(currentLetter[j]) == 46) { // prüfe, ob aktuelles Zeichen ein Punkt ist (Ascii-Code 46)
digitalWrite(ledPin, HIGH); // schalte LED ein
tone(speakerPin, 200); // schalte Lautsprecher ein, Tonhöhe 200 Hz
delay(50); // kurze Pause
digitalWrite(ledPin, LOW); // schalte LED aus
noTone(speakerPin); // schalte Lautsprecher aus
delay(50); // kurze Pause
} else if (int(currentLetter[j]) == 45) { // prüfe, ob aktuelles Zeichen ein Strich ist (Ascii-Code 45)
digitalWrite(ledPin, HIGH); // schalte LED ein
tone(speakerPin, 200); // schalte Lautsprecher ein, Tonhöhe 200 Hz
delay(150); // längere Pause
digitalWrite(ledPin, LOW); // schalte LED aus
noTone(speakerPin); // schalte Lautsprecher aus
delay(150); // längere Pause
} else {
delay(150); // längere Pause, Zeichen unbekannt
}
}
delay(200); // Pause zwischen Zeichen
}
}
Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!
- Die beliebtesten Arduino-Projekte von StartHardware
- Inklusive Schaltplan, Beschreibung und Code
- Arduino-Schnellstart-Kapitel
- Kompakter Programmierkurs


