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

Hallo,

Vorab hier mal mein Code.

Habe vor an einer Fotozelle kurze und Lange Signale (Morsesignale) abzufragen.

Das abfragen an der Fotozelle klappt super und Punkte erkennt er mir auch ^^

Das aller erste problem ist jedoch, dass er gerne nur Punkte ausgibt...

Müsste ich jetz für einen "Strich" i auch genau definieren, da es ja mit i > 3 leider nicht klappt..

int count = 0;
int sensor = A0;
int i;
int c;
//int array[];

void setup(){
  Serial.begin(9600);
  i = 0;
  c = 0;
}

void loop() {
  
  int sensorValue = analogRead(sensor);
  
  if(sensorValue <= 100){
    count = 0;
  }
  
  if (sensorValue >= 100){
    i = i + 1;
  }
  
  if (i == 3 && count == 0){
   // array[c] = ".";
    c = c + 1;  
    i = 0;
    Serial.println ("Punkt");
  }
   
  if (i > 3 && count == 0){
   // array[c] = "-";
    c = c + 1;
    i = 0;
    Serial.println ("Strich");
  } 
  
  delay(100);
  
}

Habe auch schon das Hier versucht was auch nur Punkte ausgibt:

int count = 0;
int sensor = A0;
int i;
int c;
//int array[];

void setup(){
  Serial.begin(9600);
  i = 0;
  c = 0;
}

void loop() {
  
  int sensorValue = analogRead(sensor);
  
  if(sensorValue <= 100){
    count = 0;
  }
  
  if (sensorValue >= 100){
    i = i + 1;
  }
  if (i >3){
    if (i > 3 && count == 0){
     // array[c] = "-";
      c = c + 1;
      i = 0;
      Serial.println ("Strich");
    } 
  }
  else {
    if (i == 3 && count == 0){
     // array[c] = ".";
      c = c + 1;  
      i = 0;
      Serial.println ("Punkt");
    }
  }
   
  
    
  
  delay(100);
  
}

Das ist mein eines Problem,

das andere ist, dass ich mein ergebnis nun in irgendeiner Form am stück speichern möchte um es dann am schluss auszulesen und in klartext wie "hallo" oder aber auch sätzen wieder zu geben. Dabei habe ich an einen Array gedacht.

Das gegenstück zu diesem Progamm befindet sich auf meinem iPhone mit dem ich über einen NSMutablArray einen "Array" mit unbestimmter länge erzeugen konnte und so einfach x beliebig lange Arrays haben konnte.

Dummerweise muss ich hier die länge des array's angeben..

Habt ihr da vielleicht eine Idee / Vorschlag wie man dafür eine Lösung findet??

Noch dazu bin ich im besitz eines Ethernet shilds und Arduino Uno, wobei ich eventuell als Auslagerung eine SD karte einschieben könnte wenn der Platz nicht reicht, was ich aber nicht glaube :grin:

Schon mal Vielen dank für eure Hilfe! :wink:

Dein Programm funktioniert nicht, da zuerst die Bedingung für Punkt wahr wird und die Variablen zurückgesetzt werden und dann nie die Werte für einen Strich erreicht werden.
Noch 2 Fehler.
Um die Länge des Impulses zu Kontrollieren mußt Du die Zeit messen. Dein Programm mißt die Intensität des Impulses.
Verwende ein Digitales Pin und einen Fototransistor. Ein Fotowidertand ist zu langsam.
Grüße Uwe

Das habe/ wollte ich eben verhindern durch das if (i == 3 && count == 0)

also sollte die Punkt Bedingung nur eintreten, wenn Drei Werte über 100 waren und nun unter null ist..

Ich glaub der Fehler liegt darin, dass ich count bei Sensor Value über 100 dann auch auf 1 etc setzten muss, da dieser Wert sonst ja immer bleibt..

Okay ich suche mir mal was mit der Zeit. Ich hatte es davor so geregelt, dass nur alle 100ms der Wert abgefragt wird und ein Punkt eben 3 x 100 ms sind. Dadurch habe ich die Zeit indirekt schon abgefragt.

Habe solch einen Fototransistor wie auf dem Bild zu sehen ist.

Das habe ich auch vor (Die intensität zu messen), da in einem Normalen Raum bereits die Intensität sich in einem bereich zwischen 0 und 100 bewegt ( i.d.R. bei mir 30-50 ) Und wenn ich eben eine Taschenlampe (die App) direkt rein leuchten lasse ist der Wert weit über 100

Daher ist mir ein Analoger Pin eigentlich schon lieber.

Die frage ist nur, wie ich das jetz nun Speichern kann?

Ich könnte einfach mehrere Arrays bzw einen Großen erzeugen und mit foo voll schreiben bzw leer lassen und am schluss dann die leeren Speicher Löschen bzw Ignorieren. Ginge das?

MfG

EDIT: Habe gerade bei if (sensorValue >= 100) noch count = count + 1; eingefügt und ich kann nun Punkte und Striche unterscheiden :slight_smile:

Jetz ist das nächste eben der Array oder eine andere Art des Speicherns gefragt.. (Siehe den auskommentierten Code)

EDIT2: keiner eine Idee??

Push !

ich hatte Dir schon geantwortet.

Ich kann nun aber schon Striche und Punkte gesondert voneinander erkennen mit meiner Methode

Was jetz fehlt ist die Speicherung des wertes, worauf du mir noch nicht geantwortet hattest.

Da war ja eben die Idee eines Arrays jedoch kann ich nur bestimmte längen eingeben..

MfG

mrlowalowa:
Ich kann nun aber schon Striche und Punkte gesondert voneinander erkennen mit meiner Methode

Glückwunsch. Auch die Pausen zwischen zwei Buchstaben ?

Was jetz fehlt ist die Speicherung des wertes, worauf du mir noch nicht geantwortet hattest.
Da war ja eben die Idee eines Arrays jedoch kann ich nur bestimmte längen eingeben..

Das stimmt, der RAM des Arduino ist begrenzt.
Wie lange soll der Arduino laufen? Warum speichern, wenn du's schon zum PC übertragen hast?
Edit : Sorry, hab dein ersten Post nicht sorgfältig genug gelesen.
Fehlt ja noch die Erkennung der Morsezeichen.
Aber dafür reicht doch ein Array von 5 (?) Byte, oder so.
Schwieriger ist vermutlich das dekodieren.

Was hältst du davon: Punkt ist 0, Strich ist 1, und jedes Zeichen fängt mit einer 1 an, damit man die Länge erkennt.
Das ganze wird in ein Byte geshiftet, und daraus ein Zeiger auf die Ergebnistabelle gemacht

e = . = 0b00010  = 2
t = - = 0b00011  = 3
i = .. = 0b00100  = 4
a = .- = 0b00101  = 5

usw.

Das ist nicht speicheroptimiert, aber 64 byte solltest du haben.

//                           0    1    2    3    4    5     ...                                   
const char morsetable[] = { '?', '?', 'e', 't', 'i', 'a' ,  // ... usw   
};

Die Pause hat mich nun gereitzt :roll_eyes:

Habe nun die drei Pausen Typen eingebaut und auch Erkennung wann das ganze anfängt und wieder aufhört.

Hab auch jeweils was in die Kommies zur Erklärung dazugeschrieben.

int count = 0;
int sensor = A0;
int i;
int c;
int pause;
int start_pause;
int count_p;

//int array[];

void setup(){          // initialisierung meiner int's
  Serial.begin(9600);
  i = 0;
  c = 0;
  pause = 0;
  start_pause = 0;
  count_p = 0;
}

void loop() {
  
  int sensorValue = analogRead(sensor); // Abfragen des Fototransistors
  
  if(sensorValue <= 100){               // Wenn kein Licht bzw Steulicht von Raum etc
    count = 0;
    if (start_pause == 1){              // Beginnt erst, wenn schon einmal Licht war
      if (pause == 0){                  // Wenn Pause zurückgesetz wurde, dann mitzählen
        count_p = 0;
      }
      pause = pause + 1;                
      count_p = count_p + 1;            // Kann das eventuell rausgelassen werden? nur für letzte funktion   
    }
    
  }
  
  if (sensorValue >= 100){
    i = i + 1;
    count = count + 1;
    start_pause = 1;
   
  }
  if (i > 3 && count == 0){
     // array[c] = "-";
     c = c + 1;
     i = 0;
     pause = 0;
     Serial.println ("Strich");
   } 
   if (i == 3 && count == 0){
     // array[c] = ".";
     c = c + 1;  
     i = 0;
     pause = 0;
     Serial.println ("Punkt");
    }
    
   if (i == 1 && pause == 3 && start_pause == 1){
     pause = 0;
     Serial.println("Pause Buchstabe");            // Zwischen jedem Buchstaben ist eine Punkt länge Pause
   }
   if (i == 1 && pause == 6 && start_pause == 1){
     pause = 0;
     Serial.println("Pause Wort");                // Zwischen jedem Wort sind zwei Punkte bzw ein Strich Pause
   }
   if (i == 1 && pause == 9 && start_pause == 1){
     pause = 0;
     Serial.println("Pause Satz");                // Zwischen jedem Satz sind 3 Punkt-längen Pause
   }
  
   if (count_p >= 10){
     start_pause = 0;                          // Damit keine unnötigen Pausen gezählt werden
     count_p = 0;                              // Zurücksetzten
     
     Serial.println ("Übertragung Abgeschlossen"); // Könnte dem Array / Plotter sagen: jetz umwandeln
   }
  
  delay(100);                        // Fragt nur alle 100 ms den Wert am Sensor ab
  
}

Die jetzigen Serial.println sind nur zum Testen da, damit man sieht, dass was ankommt.

Ich find die Idee super! :slight_smile: :slight_smile:

Nach deinem Prinzip müsste dann das hier stimmen: (Zwecks Verständniss)

u = ..- = 0b01001
q = --.- = 0b11101

ß = ...--.. = 0b10001100 (Das würde jetz aber den Ramen von max 4 Zeichen sprengen, wegen Sonderzeichen)

Das ß könnte man aber auch erstmal auslassen ^^ Das sind Träumereien aber cool wäre es schon.

Habe übrigens 32.256 Bytes Platz, also könnte man sich da ruhig austoben :wink:

Das Problem ist dann aber immernoch die Speicherung?

Achsoooo... ich kann die Dann ja alle hintereinander in einer Line im Serial Port ausgeben lassen und dann bei neuer eingabe in die nächste Zeile springen. :slight_smile: Jetz kapiere ich auch deine aussagen vor dem Edit.

Wie erzeugt man bei Arduino Object C einen Pointer? Hab die bisher nur beim iPhone gemacht..

Momentan spielt sich bei mir alles im void loop() ab, dafür will ich ja aber eine weitere "Funktion" oder sehe ich das falsch?

Schon mal danke für den Super Tipp!! :slight_smile: :slight_smile:

Dein Verständnis ist richtig.
Glaube nicht dass Samuel Morse ein 'ß' gekannt hat. (Edit: bzw sowas exotisches übertragen wollte) Kommt noch nicht mal in ASCII vor.

Wie erzeugt man bei Arduino Object C einen Pointer? Hab die bisher nur beim iPhone gemacht..

Weiss nicht was das mit "Object" zu tun hat. Pointer sind was ganz normales bei c.
Brauchst du aber noch nicht mal.
Wenn du deine Morsesignale entschlüsselt hast und z.B.

byte x = 0b1001;  // wir haben "..- " empfangen und das Zeichen ist fertig
char z = morsetable[x]; // der Inhalt von morsetable[17] ( 'u' ) ist jetzt in z
Serial.print(z);

Mit Pointern sähe das so aus

char* zp = morsetable+x;
Serial.print( *zp );

Edit: P.S.

Habe übrigens 32.256 Bytes Platz, also könnte man sich da ruhig austoben

Z.Zt. liegt eine Kopie der morsetable im RAM, und der ist beim UNO nur 2k gross.
Da die Tabelle konstant ist, könntest du sie auch aus dem Flash-Speicher lesen ( PROGMEM ), aber wenn's auch so geht, warum ?

Ich versteh nicht, was du auf dem Arduino speichern willst:
Nach der Zeichen-Pause kannst du ein Zeichen dekodieren und ausgeben.
Bei der Wort-Pause gibst du ein extra Leerzeichen aus.
Bei der Satz-Pause gibst du ein extra Newline ( '\n' )
Nach 10 Pausen Ruhe ( oder eher deutlich später ) kommt "Übertragung beendet".
Arduino hat und braucht hierfür kaum Speicher.

Hallo,
hab mir mal eine Idee mit millis() ausgedacht (aber nicht getestet):

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

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

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
    { wert = 0; } // Pause
  }
  if ( signal == 1 && analogRead(sensor)  <= 100)
  { 
    signal = 0;
    time = millis();
    while ( analogRead(sensor) <= 100)
    {}
    if ( millis() - time > 300 )
    { wert = 2; } // Lang
    else
    { wert = 1; } // Kurz
  }

Damit kannst Du die Zeitspannen exakt bestimmen.
Vielleicht hilfts Dir ja ein bischen....

Gruß
Reinhard

.... einen hab ich noch..... :wink:
Eigentlich sind bei analogRead<=100 3 Zustände vonnöten:
<300 Zeitspanne zwischen einem Piep und dem nächsten
300-2000 Leerstelle, löst gleichzeitig einen Abgleich der letzten Signale mit dem Zeichen-Array aus. Ausgabe des Zeichens mit Serial print

2000 Zeilenumbruch

Gruß
Reinhard

@michael_x:

Da geb ich dir Recht :smiley: Wäre nur schön gewesen, da ich ein solches Zeichen in meinem Name trage und das dann noch ne Spur eindrucksvoller wirken würde :stuck_out_tongue: (ist aber wie gesagt nur eine Spielerei :wink: )

Das Object kommt eben vom iPhone App programmieren. Aber mir ist auch gerade aufgefallen, dass ich gar nicht mit Objekten zu tun habe (sprich [blablalba] ).

michael_x:
Ich versteh nicht, was du auf dem Arduino speichern willst:
Nach der Zeichen-Pause kannst du ein Zeichen dekodieren und ausgeben.
Bei der Wort-Pause gibst du ein extra Leerzeichen aus.
Bei der Satz-Pause gibst du ein extra Newline ( '\n' )
Nach 10 Pausen Ruhe ( oder eher deutlich später ) kommt "Übertragung beendet".
Arduino hat und braucht hierfür kaum Speicher.

Was ich Speicher will ist das was du auch vergessen hast oder ich den vielleicht selbstverständlichen Weg nicht weiß.

Um die Zeichenfolge " . . - " entschlüsseln zu können musst du die Zeichenfolge erst einmal Speichern bzw zusammen schieben.

Das stelle ich mir nun aber eher "einfach" vor. Man könnte einen Array mit 4 bzw 3 (wegen der 0 Speicherfläche ?? ) erzeugen und mit 0 o.ä. füllen. Wenn jetz ein Punkt kommt den Platz mit 1 vollschreiben und bei Strich eben mit 2. Um dann etwas zusammen geschobenes auszugeben lässt man die Nullen eben "fallen" und schreibt den Array dann wieder mit Nullen voll damit kein Fehler für die nächsten Zeichen übrig bleibt.

@spaceball:

Danke für deine Überlegungen! Die werde ich auch mal ausprobieren! :wink:
int sensorValue hast du anscheinend initialisiert aber nie gebraucht und kann deshalb weggelassen werden?

millis() - time verstehe ich auch nicht so ganz vom Prinzip her. Dachte time = millis() .

Das wäre ja dann das gleiche wie " x - x " und das ist immer null.

Von daher müsste man 2 unterschiedliche Zeiteinheiten parralel laufen lassen und deren Differenz würde dann dem hier entsprechen oder sehe ich das falsch?

Ich frage mich nur wann dann die andere Zeit einheit anfagen soll. Da man dann aufgrund der schon gelieferten Zeichensätze zusätzlich Zeit mit einberechnen müsste, welche ja variieren und daher meinen Ausgaben am Schluss noch ein verbrauch_time = XY machen müsste abhängig von den punkten und Strichen.

Danke auf jedenfall schon mal euch beiden für eure Super Unterstützung!!!! :slight_smile: :slight_smile: :slight_smile:

Gruß
Flo

millis() liefert die Anzahl der Millisekunden zurück, die seit dem starten des Arduino vergangen sind. Daher ändert sich der Wert ständig.
Mit time = millis() merkst Du dir den aktuellen Wert. Mit millis() - time bekommst Du die Millisekunden, die seit dem Merken vergangen sind.

Hallo mrlowalowa,
tja, das sensorValue ist wirklich umsonst. Hatte ich am Anfang anstatt "signal" gedacht.

time= millis();
damit nehme ich den aktuellen Wert der hochgezählten Zeitvariablen ( wie von MaFu beschrieben... Danke! ).
Dann warte ich mit der while-Schleife solange, bis sich der Sensorzustand von Licht zu Dunkel oder umgekehrt ändert und lese dann noch mal die Zeítvariable aus.
Nun ergibt die Differenz die Länge des Signals: entweder des Lichtsignals oder der Pause!
Somit kann ich auch gleich zwischen Kurz oder Lang und zwischen Leerzeichen, Zeilenumbruch und "Signalzwischenraum" unterscheiden.

Natürlich bleibt das Programm in der while-Schleife hängen, solange sich der Sensorzustand nicht ändert.
Dies sollte aber in Deinem Fall kein Problem darstellen.

Wegen dem Array:
Wenn ich meinem Beispiel folge, würde die 0 den Vergleich starten, der die gespeicherte Signalfolge mit der in einem mehrzeiligen 2D-Array gespeicherten Buchstabentabelle abgleicht und darin den entsprechenden Eintrag ermittelt.
Das Array müßte Byte entsprechen, da es 2 Signal-Zustände gibt (Kurz und Lang) und eben noch den "da kommt nichts mehr Zustand" (Array-Wert = z.B. 255 oder auch 0 ...), falls die Morsetabelle nur ein kurzes Piep verlangt...

Gruß
Reinhard

PS.: Ich entschuldige mich im Voraus, falls meine grauen Zellen meine Überlegungen etwas verwirrend formuliert haben sollten, aber um 1:40 Uhr und nach mehreren Geburtstagsfeierbierchen läufts einfach nicht mehr ganz so rund....
XD

Du hast Geburtstag und sagst mir nichts?
Alles Gute!

nene! Das dauert noch ein paar Monate.
Bin nur Opfer.
Aber was tut man nicht alles für seine Freunde! :smiley:

Jetz komm ich dahinter, danke euch zwein!

Ist viel produktiver, da ich nicht immer genau dort anfange zu morsen wenn ich nur alle 100ms den Wert abfrage. Da variiert der Punkt dann immer zwischen 1 und 3...

Werde das nun mal versuchen einzubauen.

Ich habe jetz noch 2 Probleme mit dem iPhone. Zum einen wird das erste Zeichen immer nur als minimalsten blitz ausgegeben (da die LED am iPhone auch erst warm werden / hochfahren etc muss ^^)

Daher würde ich vorschlagen, dass ein anfangs signal von so 1 sec als Start auch gehen würde. Damit wird dann die LED auf betriebstemperatur gebracht und der Arduino ist sich auch sicher, dass es jetz losgeht. Die jetzigen Methoden sind ja darauf aufgebaut, dass bei einem ersten Signal es dann auch schon losgeht, aber was macht der Aruino wenn jetz über 1 sec eingestrahlt wird und danach einfach nichts kommt? Gibt es für solche fälle dann Probleme oder gibt er einfach nur nichts aus?

Ich fände es so also praktisch wenn man am anfang und ende Start / End leuchten machen würde was so eine sec aufwärts sein könnte.

Das Zweite Problem ist, dass mein Programm von . auf - zicken macht und der Punkt dem Strich anscheinend etwas Zeit klaut und somit ein Punkt mit doppelter Pause und einem Punkt daraus entsteht. Wieso auch immer.. Das muss ich noch rausfinden. Denke es ist sinnvoller meine iPhone APP dementsprechend anzupassen als jetz den Arduino auf diesen Fehler anzupassen.

Mit "gespeicherter Zeichenfolge" meinst du dann meine Speichermethode mit dem Array und 4 Nullen??

Was meinst du mit "Das Array müsste Byte entsprechen" ??

Und die Morsetabelle sollte nichts verlangen, die sollte nur passiv aggieren und nicht aktiv oder hab ich da nen denk fehler?

Gruß
Flo

So iPhone App läuft jetz stabil mit folgenden werten: ein Punkt 0.5, eine Pause (zwischen Zeichen) 0.5 , ein Strich 1,5 und zwischen Wörtern auch 1,5 Pause (alles in Sekunden Angabe)

Da mach ich am besten alles was über 450 ms usw ist, da ich wahrscheinlich nicht in die bedingung " == 500 " schreiben kann was den äußeren Umständen echt weng hoch angerechnet währe wenn der exakt 500 messen würde :smiley:

Jedenfalls hab ich noch eine Idee zum speichern der Werte:

Wir haben ja schon Byte x = 0b10101 = .-.- = Buchstabe (das ist die Methode von Michael_x)

Könnte man es nicht einfach so machen, dass man byte x = 0b1 initialisiert und dann bei wert 1 eine 0 hinten dran hängt und bei wert 2 eben eine 1.

Sprich sowas

x = x "+ 1" bzw "+ 0";

Nur will ich nicht den wert um eines erhöhen sondern hinten dran hängen. Das wird mit einem normalen Plus auf diese Weise nicht funktionieren ^^

Hab mich mal zu 2D Arrays kurz schlau gemacht, aber noch ein bis 2 fragen:

Am anfang muss man einen Datatype angeben, jedoch wird in den Zwei Ebenen ja jeweils ein anderer datatype verwendet (int bzw byte und char (für die buchstaben) )

Wie muss ich den dann definieren? Und in die erste Ebene schreibe ich dann meine Byte stränge rein. Nur werden dann bei zum beispiel bei dem buchstaben "e" der Byte strang so aussehen : x = 0b10 ;

Das kommt dann in meine morsetabelle und wird am besten gleich so ausgegeben (??):

byte x = 0b1;
if (wert == 1){     // steht für punkt aus spaceball's idee zu den millis()
   x = x "+ 0";      // hinten dran hängen
}
Serial.print(morsetable[x]);

So sollte das Prinzip ausschauen:

Bei kurzen pausen wird einfach hochgezählt und eventuell bei über 4 ein Fehler ausgegeben.
Bei dreifacher Pause (nächstes Wort) Wird ein Befehl gegeben den Byte strang auszuwerten und zu Printen.
und bei Fünffacherpause wird eine neue Zeile Begonnen bzw Die Übertragung beendet, falls es über 4 sec lang sein sollte

Bräuchte jetz erstmal nur die Sache mit den Bytes und wie ob das so mit dem 2D Array funktioniert wie ich es in meinem kleinen Sample versucht habe zu veranschaulichen. :slight_smile:

Gruß
Flo

EDIT:

mein 2D Array schaut nun so aus: bei DIM_0_SIZE und DIM_1_SIZE wird wahrscheinlich die länge des Alphabets rein gehören? (--> 26)

byte char array [DIM_0_SIZE] [DIM_1_SIZE] = {
   //as many vals as dim1
  {0b101, 0b11000, 0b11010, 0b1100, 0b10, 0b10010, 0b1110, 0b10000, 0b100, 0b10111, 0b1101, 0b10100, 
0b111, 0b110, 0b1111, 0b10110, 0b11101, 0b1010, 0b1000, 0b11, 0b1001, 0b10001, 0b1011, 0b11001, 0b11011, 0b11100},
  {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}//as many rows as dim0
};

Nur will ich nicht den wert um eines erhöhen sondern hinten dran hängen. Das wird mit einem normalen Plus auf diese Weise nicht funktionieren ^^

Richtig. Shiften nennt man die Operation, an die du denkst.

x = 1; // init
while ( true ) {
 byte i = getPunktStrichPause () ; // nur so als Pseudo-Code   ( 0 = .  /  1 = _   /  2 = Pause, mindestens die zwischen zwei Zeichen ) 
 if ( input < 2) x = (x << 1) | i;  // Shift um ein Bit nach links, neuer Punkt/Strich dazu
 else break; // Ende von while (true) 
}

Statt des ODER ( | ) könntest du auch ein PLUS ( + ) verwenden, das ergibt hier dasselbe, da nur 0 oder 1 mit einer 0 verknüpft werden.

Das heißt ich habe jetzt das hier:

byte x = 0b00001;

Dann shifte ich die 1 um eins nach links und füge 0 bzw 1 hinzu was dann das hier ergeben sollte:

x = 0b00010;

Bei i gleich 2 oder höher würde dann die Umwandlung in einen Buchstaben statt finden oder zusätzlich weitere Aktionen, wie Zeilenumbruch etc

Dann exportiere ich meine Funktionen mal schön, damit das ganze etwas übersichtlicher wird und nehme die Variablen mit.

Der 2D Array müsste dann so passen nur fehlen jetz noch die ganzen 0 bei z.B. 0b10 ( = " . " ) ---> 0b00010

Dann sollte der Code auch funktionieren.

Habe meine Hardware nun auch um einen Button, 3 Status LED's in Grün, Gelb, Rot und einen Lautsprechererweitert. Mal schaun was sich aus meinem Kleinen Projekt noch so entwickelt :slight_smile: