/*
Forum: https://forum.arduino.cc/t/problem-mit-ausgabe-im-seriellen-monitor/1352045
Wokwi: https://wokwi.com/projects/422693755286295553
2025/02/12
Changes to original sketch by ec2021
*/
const int sensorPin = A0;
const int dotDuration = 100; // Dauer eines Punktes in ms
String receivedMorse = ""; // Morsezeichen speichern
String receivedText = ""; // Endgültiger Text speichern
struct MorseCode {
const char* code;
char letter;
};
// Morsecode-Tabelle zur Dekodierung
MorseCode morseTable[] = {
{".-", 'A'}, {"-...", 'B'}, {"-.-.", 'C'}, {"-..", 'D'},
{".", 'E'}, {"..-.", 'F'}, {"--.", 'G'}, {"....", 'H'},
{"..", 'I'}, {".---", 'J'}, {"-.-", 'K'}, {".-..", 'L'},
{"--", 'M'}, {"-.", 'N'}, {"---", 'O'}, {".--.", 'P'},
{"--.-", 'Q'}, {".-.", 'R'}, {"...", 'S'}, {"-", 'T'},
{"..-", 'U'}, {"...-", 'V'}, {".--", 'W'}, {"-..-", 'X'},
{"-.--", 'Y'}, {"--..", 'Z'}, {"", ' '} // Leerzeichen
};
// Funktion, um Morsecode in Buchstaben umzuwandeln
char decodeMorse(String morse) {
for (int i = 0; i < sizeof(morseTable) / sizeof(MorseCode); i++) {
if (morse == morseTable[i].code) {
return morseTable[i].letter;
}
}
return '?'; // Falls Zeichen unbekannt ist
}
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(sensorPin);
boolean signalReceived = false;
if (sensorValue > 250) { // Überprüfung auf den Schwellenwert
unsigned long startTime = millis();
while (analogRead(sensorPin) > 250);
unsigned long duration = millis() - startTime;
if (duration < dotDuration * 1.5) {
receivedMorse += "."; // Kurzes Signal = Punkt
} else {
receivedMorse += "-"; // Langes Signal = Strich
}
signalReceived = true;
}
// Pause zwischen Zeichen erkennen
if (analogRead(sensorPin) <= 250 && signalReceived) {
signalReceived = false;
unsigned long pauseStart = millis();
while (analogRead(sensorPin) <= 250 && millis()-pauseStart <= dotDuration*6);
unsigned long pauseDuration = millis() - pauseStart;
if (pauseDuration > dotDuration * 2.5) { // Lange Pause = neues Zeichen
char letter = decodeMorse(receivedMorse);
receivedText += letter;
Serial.print(letter); // Direkt im Serial Monitor ausgeben
receivedMorse = ""; // Zurücksetzen für nächstes Zeichen
}
if (pauseDuration > dotDuration * 6) { // Noch längere Pause = neues Wort
receivedText += " ";
Serial.print(" ");
Serial.print(" "); // Leerzeichen zwischen Wörtern
}
}
}