Array Problem - Allgemeines Problem mit if in Verbindung von einem A-Sensor

Dein 2D Array mit 2*26 byte ist nicht kürzer als ein 1*32 Array, macht nur das Auswerten komplizierter und länger. ( Wenns schon läuft, ist es auch gut. ) Erst wenn du auch Morsecodes für Zahlen mitnimmst, hast du ein 1*64 Array mit einigen Lücken.

Wo kriegst du eigentlich die Morse-Signale her, dass du auf so strikte Zeiten vertrauen kannst ?

Übrigens: 0b101 und 0b00101 ist nur eine andere Schreibweise der gleichen Zahl.

So um zum Array Problem zurück zu kommen: Hier bin ich nun :smiley:

byte array [26] [26] = {
    {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100, 
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
  const char b_array[26] =  {"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"};

Kommt ein Fehler, dass const char zu viele Enterys hat…
Muss ich jetz splitten ?? Sprich wenn ausgabe aus array über 4 ist gehe in e-f_array etc? Oder gibt es da eine sinnvollere Lösung?

Kann euch auch mal gerne mein bisheriges werk präsentieren ^^

unsigned long time;
int sensor = A0,
    ma_count = 0, // Array Position hochzählen / zuweisen
    strich = 1,
    punkt = 0; 
byte signal = 0,  // Signal ja/nein
     wert = 0,    // 0= Pause   1= Kurz   2= Lang   3= Zeilenwechsel
     code;

char ausgabe;

byte array [26] [26] = {
    {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100, 
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
 const char b_array[26] =  {"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"};



void setup()
{
  Serial.begin(9600);
  // time = millis();
  code = 0b00001;
}

void loop()
{
  if ( signal == 0 && analogRead(sensor) > 100)
  { 
    signal = 1;
    time = millis();
    while ( analogRead(sensor) > 100)
    {}
    if ( millis() - time >= 2000 )  // Pause 2 sec -> Zeilenumbruch
    { wert = 3; } // Zeilenumbruch
    else
    {char ausgabe;
    ausgabe = moersetable(code);
     Serial.print(ausgabe);
    }
      
     
  }
  if ( signal == 1 && analogRead(sensor)  <= 100)
  { 
    signal = 0;
    time = millis();
    while ( analogRead(sensor) <= 100)
    {}
    if ( millis() - time > 450 ) // Lang
    { code = code << 1 | strich;} 
    else // Kurz
    {code = code << 1 | punkt;}

  }
  
}

byte moersetable(byte code){
 
  // steht bereits im Head, aber kann hier vielleicht besser angebracht sein
 /* byte array [26] [26] = {
    {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100, 
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
  const char b_array[26] =  {"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"};
  */
  byte pos;
  char result;
  pos = array[code];
  result = b_array[pos];
  return result;
 
  
}

Und den Fehler Code den ich dazu bekomme:

Morse_Entschl_ssler_2:16: error: too many initializers for 'const char [26]'
Morse_Entschl_ssler_2.cpp: In function 'byte moersetable(byte)':
Morse_Entschl_ssler_2:72: error: invalid conversion from 'byte*' to 'byte'

Ich weiß auch noch nicht genau wie ich aus meinem 2D Byte Array dann eine positions angabe im Alphabet array machen kann… :confused:

Gruß Flo[/code]

mrlowalowa: byte array [26] [26] = {     {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100,     0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},     {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}   };   const char b_array[26] =  {"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"};

Und den Fehler Code den ich dazu bekomme:

Morse_Entschl_ssler_2:16: error: too many initializers for 'const char [26]'
Morse_Entschl_ssler_2.cpp: In function 'byte moersetable(byte)':
Morse_Entschl_ssler_2:72: error: invalid conversion from 'byte*' to 'byte'

Der Code enthält drei Fehler.

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}

sind 27 Einträge und nicht 26. const char b_array[26] =  {"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"};Das sind Zeichenketten und keine einzelnen Zeichen. Du musst es so schreiben:

const char b_array[26] =  {'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'};

Und zu guter letzt...

byte array [26] [26] = {

definiert ein Array mit 26 x 26 Zeichen. So wäre es richtig:

byte array [2] [26] = {

Ich weiß auch noch nicht genau wie ich aus meinem 2D Byte Array dann eine positions angabe im Alphabet array machen kann.. :/

Dann lass es ;)

  • Ein byte array[26][26] ist nicht das was du willst, denn es bestünde aus 26*26 Elementen

  • Ein eindimensionales Array für alle empfangenen Möglichkeiten von "." bis "----", wie ich es dir ganz am Anfang angedeutet habe, ist das einfachste. Das empfangene Morsezeichen ( z.B. a = 0b00101 ) kennzeichnet die Position in deiner Tabelle ( also 5 ) an welcher der auszugebende Buchstabe 'a' steht. Fertig. -- Lediglich die ersten 2 Einträge ( 0 und 1 ) gibt es nicht, da das kürzeste Zeichen e = 0b00010 ist. Du könntest die Morsetabelle bei e anfangen lassen und beim Zugriff immer diese 2 subtrahieren, aber das spart nichts. -- Du kannst diese Tabelle sogar einfach als text schreiben char morse[] = "??etianmsurwdkgohvf_l?pjbxcyzy.-" ( nach http://www.opencaching.de/images/uploads/EE5E4A60-F7F2-11DF-B2AC-00163E3AC09B.jpg )

morse[5] ist das Beispiel 'a'

-- Mit Ziffern müsstest du nochmal 32 codes anfügen: 22 unbenutzte und die 10 Ziffern.

Ah, danke für die Erleuchtung, euch beiden :wink:

Hab jetzt noch ein bisschen rumbasteln und ausprobieren müssen und bin nun zu diesem Ergebnis in der Ausgabe gekommen:

rlo
?flo
???
e
?
?Xw
?f
e
?n?
e
o
?flo
?flo
?flo
?flo

Ich hab immer “flo” per Handy geschickt. Ab und zu staut sich da dann leider doch noch irgendwelche fehler an was dann zu den mittleren Ergebnissen geführt hat. Auch kommt es mal vor, dass mitten im f (…-.) ein e geprinted wird. (das liegt aber an der iPhone lampe die beim erst start immer erst kurz zuckt um “warm” zu laufen. Ist natürlich quatsch, dass sie warm laufen muss aber das ist bei jeder iPhone App mit LED Torch leider so, daher eher ein Hardware bzw Softwarefehler in der Firmware des iPhone. Wie dem auch sei… )

Erst ging es garnicht. Dann hab ich mir den Code nochmal von Michael_x angeschaut. Mit dem war ich von anfang an nicht ganz zu frieden, da ich Ihn nicht verstanden hab… :smiley: Irgendwas war mir da gleich am anfang nicht so ganz richtig… Er hatte einen denkfehler mit dem Signal 1 und 0. Somit musste das “innere” / die Auswertung etc von punkt, pause, strich mit einander vertauscht werden, damit der Code überhaupt wirken kann.

Man kann ja keine pause messen und dann aus der Pause ein Zeichen ermitteln :smiley: :smiley:

Nachdem ich den Fehler gefunden hatte, wurde der letzte buchstabe nie ausgegeben, da mein Code in der while-Schleige hing… Daher hab ich nun in die while-Schleife die Ausgabe gesetzt, wenn die Zeit über einen gewissen rahmen (2 Sec) geht.
Kleiner nebeneffekt von code = 0b00001; in der while schleife war, dass mir dann immer ein Fragezeichen ausgegeben wurde. Deshalb wird der Befehl in der while-schleife nur ausgeführt wenn der code nicht gleich 0b00001 ist. So wurden tausende ‘?’ erspart.

Jetz habe ich noch ein paar Falsch ausgaben zwischen drinn zu verzeichnen, was nach mehrmaligen drücken des Reset knopfes verschwindet.

Da würde es abhilfe schaffen am schluss (ebenfalls in der While-Schleife) alle Variablen etc auf 0 zu schalten… Muss ich noch Testen.

Die übrigen Frage Zeichen die vom Code = 0b00001 in der whileschleife (höchst wahrscheinlich kommen) sind auch nicht grad supi… Aber habe ich einfach unterdrückt durch die nicht Ausgabe von ‘?’

Nicht grad die feine Englische Art aber funktioniert.

was jetz noch fehlt ist die bereinigung des Codes der hier angesprochenen Fehler (variablen zurücksetzen) und ob vielleicht irgendwer noch grobe fehler entdeckt.

Hier nun mein Source Code :slight_smile: :

unsigned long time;
int sensor = A0,
    strich = 1,
    punkt = 0; 
byte signal = 0,  // Signal ja/nein
     wert = 0,    // 0= Pause   1= Kurz   2= Lang   3= Zeilenwechsel
     code;

char ausgabe;

void setup()
{
  Serial.begin(9600);
  // time = millis();
  code = 0b00001;
}

void loop()
{
  if ( signal == 0 && analogRead(sensor) > 100)
  { 
    signal = 1;
    time = millis();
    while ( analogRead(sensor) > 100)
    {}
    if ( millis() - time > 450 ) // Lang
    { code = code << 1 | strich;
      //Serial.println("Strich");
    } 
    else // Kurz
    {code = code << 1 | punkt;
     //Serial.println("Punkt");
    }
      
     
  }
  if ( signal == 1 && analogRead(sensor)  <= 100)
  { 
    signal = 0;
    time = millis();
    while ( analogRead(sensor) <= 100)
    { 
      if (millis() - time >= 2000 && code != 0b00001){
       char ausgabe;
       ausgabe = moersetable(code);
       if (ausgabe != '?'){
        Serial.print(ausgabe);
       }
       code = 0b00001;
       Serial.println("");
      }
 
    }
    if ( millis() - time >= 2000 )  // Pause 2 sec -> Zeilenumbruch
    {} // Zeilenumbruch
    if ( millis() - time >= 380)
    {wert = 3;} // Pause zwischen Signalen || braucht man nicht!!
    if (millis() - time >= 790)
    {wert = 4;
     char ausgabe;
     ausgabe = moersetable(code);
     if (ausgabe != '?'){
      Serial.print(ausgabe);
     }
     code = 0b00001;} // Pause zwischen Buchstaben
  }
  
}

byte moersetable(byte code){
 
  const char b_array[] =  {'?', '?', 'e', 't', 'i', 'a', 'n', 'm', 's', 'u', 'r', 'w', 'd', 'k', 'g', 'o', 'h', 'v', 'f', '_', 'l', '?', 'p', 'j', 'b', 'x', 'c', 'y', 'z', 'q', '.', '-'};
  char result;
  result = b_array[code];
  return result;
 
  
}

Gruß Flo[/code]