Vieleicht zeigst Du uns auch noch den Rest Deines Codes?
Gerne, aber mein Programm befindet sich noch in einem recht bescheidenen Zustand. Manche Sachen funktionieren noch nicht so wie geplant.
Hier einmal die aktuelle Fassung:
int ledPin = 13;
int Short = 200; // dit
int Long = 3 * Short; // dah
int wordsPerMinute = 1000;
char incomingByte = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("Wie viele Woerter pro Sekunde sollen gemorst werden?");
wordsPerMinute = Serial.read();
}
void blink(int L){
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(L);
digitalWrite(ledPin, LOW);
}
void charBlink(char c){
switch (c) {
case 'a':
blink(Short);
blink(Long);
return;
case 'b':
blink(Long);
blink(Short);
blink(Short);
blink(Short);
return;
case 'c':
blink(Long);
blink(Short);
blink(Long);
blink(Short);
return;
case 'd':
blink(Long);
blink(Short);
blink(Short);
return;
case 'e':
blink(Short);
case 'f':
blink(Short);
blink(Short);
blink(Long);
blink(Short);
return;
case 'g':
blink(Long);
blink(Long);
blink(Short);
return;
case 'h':
blink(Short);
blink(Short);
blink(Short);
blink(Short);
return;
case 'i':
blink(Short);
blink(Short);
return;
case 'j':
blink(Short);
blink(Long);
blink(Long);
blink(Long);
return;
case 'k':
blink(Long);
blink(Short);
blink(Long);
return;
case 'l':
blink(Short);
blink(Long);
blink(Short);
blink(Short);
return;
case 'm':
blink(Long);
blink(Long);
return;
case 'n':
blink(Long);
blink(Short);
return;
case 'o':
blink(Long);
blink(Long);
blink(Long);
return;
case 'p':
blink(Short);
blink(Long);
blink(Long);
blink(Short);
return;
case 'q':
blink(Long);
blink(Long);
blink(Short);
blink(Long);
return;
case 'r':
blink(Short);
blink(Long);
blink(Short);
return;
case 's':
blink(Short);
blink(Short);
blink(Short);
return;
case 't':
blink(Long);
return;
case 'u':
blink(Short);
blink(Short);
blink(Long);
return;
case 'v':
blink(Short);
blink(Short);
blink(Short);
blink(Long);
return;
case 'w':
blink(Short);
blink(Long);
blink(Long);
return;
case 'x':
blink(Long);
blink(Short);
blink(Short);
blink(Long);
return;
case 'y':
blink(Long);
blink(Short);
blink(Long);
blink(Long);
return;
case 'z':
blink(Long);
blink(Long);
blink(Short);
blink(Short);
return;
default:
Serial.print("Sorry, Buchstabe ");
Serial.print(c);
Serial.print(" konnte leider nicht ausgegeben werden.");
}
}
void loop()
{
// Serielle Daten sind vorhanden
if (Serial.available() > 1){
// Daten einlesen
Serial.println("Welcher Buchstabe soll ausgegeben werden?");
incomingByte = Serial.read();
Serial.print("Empfangen: ");
Serial.println(incomingByte);
charBlink(incomingByte);
Serial.println("Buchstabe ausgegeben");
delay(500);
}
}
Was für einen Typ hat incomingByte und was machst Du noch so damit?
incomingByte ist vom Typ
char.
Woher weisst Du, daß das nicht funktioniert?
Die Syntax von meinem Befehl wird von der Arduino IDE nicht hervorgehoben.
Davon abgesehen würde ich die Morsezeichen nicht per Switch auseinandersteuern. Ich würde einfach ein Stringarray nehmen und das Zeichen (abzüglich Offset) als Index. Damit dabei der Speicher noch reicht wird man das wohl mit "progmem" Makros verzieren müssen. Cases wären mir für sowas aber zu nervig.
Sorry, aber ich verstehe nur Bahnhof.
1. Ist mit Stringarray ein Array mit Textstrings gemeint?
2. Was ist eigentlich ein Offset? Die
Wikipedia-Beschreibung dazu verstehe ich nicht.
3. Warum muss ich das Offset vom Zeichen abziehen?
4. Was meinst du mit Index?
5. Was macht das Programm "
progmem" und warum braucht man dazu Makros?
Als Alternative:
Die Großbuchstaben A-Z sind von 65 bis 90 dezimal und die Kleinbuchstaben a-z von 97 bis 122
Einfach Daten in eine byte-Variable einlesen und kontrollieren ob die eingehenden Zahlen zwischen 65 und 90 sind und dann 32 dezimal addieren.
OK. Meinst du mit "dezimal" das normale Dezimalsystem?
Du kannst auch im switch schreiben:
...
case "a"
case "A"
morsekode umwandeln
break();
case...
Einfacher ist es Du definierst ein Array und indizierst es mit den Buchstaben
Beispiel dem Morsekode wurde eine führende 1 hinzugefügt um die Länge des Codes zu bestimmen. Eine 1 bedeutet langes Signal, eine 0 ein kurzes. Also 0000 0101 bedeutet kurz - lang
morse[0] = b 0000 0101 // A
morse[1] = b 0001 1000 // B
morse[3] = b 0001 1010 //C
...
dann einfach vom Buchstaben 65 bzw 97 subtrahieren und als index des Arrays verwenden.
Das ist die schnellste und platzsparenste Implementierung.
1. Für was steht das "
b" am Anfang des Codes?
2. Ist mit Index die Zahl in den eckigen Klammern hinter "morse" gemeint?
Gruß
Atalanttore