Hallo liebe Community,
ich bin gerade dabei mit 2 Arduino Unos ein Programm zur Datenübertragung mit Licht zwischen den beiden zu erstellen. Dies ist auch funktionstüchtig. Wenn ich mir jedoch im seriellen Monitor anschaue ob die Nachricht vollständig angekommen ist, fehlt jedes mal das letzte Zeichen. Wenn ich anschließend noch einen Text rüber sende, wird zunächst der Text von davor mit dem letzten Zeichen ergänzt und dann nach einem Leerzeichen weiter geprintet. Bsp. : Gesendet: HALLO ;im seriellen Monitor: HALL (beim zweiten Senden O ergänzt und dann wieder: HALL. Habe schon einige Dinge in der Logik probiert, komme aber einfach nicht drauf.
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);
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
}
}
// Pause zwischen Zeichen erkennen
if (analogRead(sensorPin) <= 250) {
unsigned long pauseStart = millis();
while (analogRead(sensorPin) <= 250);
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
}
}
}
Ich würde mich über eine Antwort freuen. Danke im Voraus. LG