diese loop verstehen - array und logische bedingungen

Hallo Arduino community,

ich benötige Hilfe bei einem Arduino sketch. Es geht um die Simulation eines
Würfelspiels mit dem Arduino Uno. 7 LEDs sind wie die Augen eines richtigen Würfels
angeordnet und an die Pins 2 - 8 des Arduino (Uno) angeschlossen. Bei Tasterbetätigung
wird die Routine showdice aufgerufen, an die auch eine vorher generierte Zufallszahl
gegeben wird.

#define WAIT 20					// pause 20ms
int eyes[6][7] = {{0, 0, 0, 1, 0, 0, 0}, 	// Würfelaugen zeigen "1"
                   {1, 0, 0, 0, 0, 0, 1}, 	// Würfelaugen zeigen "2"
                   {1, 0, 0, 1, 0, 0, 1}, 	// Würfelaugen zeigen "3"
                   {1, 0, 1, 0, 1, 0, 1}, 	// Würfelaugen zeigen "4"
                   {1, 0, 1, 1, 1, 0, 1}, 	// Würfelaugen zeigen "5"
                   {1, 1, 1, 0, 1, 1, 1}}; 	// Würfelaugen zeigen "6"
int pin[] = {2, 3, 4, 5, 6, 7, 8};		// pin array
int pinOffset = 2; 				 // erste LED an pin 2
int buttonPin = 13; 				// Taster an pin 13


   

void setup() {					// alle pins 
  for(int i = 0; i < 7; i++)			// des array "pin" 
   pinMode(pin[i], OUTPUT);			// als OUTPUT pins
   pinMode(buttonPin, INPUT);
}

void loop() {
  if(digitalRead(buttonPin) == HIGH)		// Taster prüfen: wenn gedrückt
    showdice(random(1, 7)); 			// Zufallszahl zwischen 1 - 7 generieren  
    
}


void showdice(int wert) {			//  showdice aufrufen, 7 mal in dieser loop 
  for(int i = 0; i < 7; i++)
  
    digitalWrite(i + pinOffset, (eyes[wert - 1][i] == 1)?HIGH:LOW); // WAS PASSIERT HIER GENAU ???
   delay(WAIT);  // kurze Pause
}

Einen Teil des sketchs verstehe ich (2 dimensionales array für die Würfelaugen usw.),
aber die Zeile in der showdice routine mit dem digitalwrite

  • digitalWrite(i + pinOffset, (eyes[value - 1] == 1)?HIGH:LOW); -
    kapiere ich einfach nicht.
    Ausserdem möchte ich dass die LEDs rotieren ca. 3 Sekunden nach Tasterbetätigung
    und nicht etwa so lange wie dieser gedrückt gehalten wird. Wie kann man das
    implementieren ?
    Falls jemand mir erklären kann wie die o.g Schleife genau funktioniert bzw.
    der Ausdruck mit dem digitalWrite, wäre das sehr nett.
    Danke und viele Grüße,
    Fliffi

https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Operatoren#?:_(Bedingung)

@TO: Du merkst mit Code im Normaltext kann es mal schief gehen.

    digitalWrite(i + pinOffset, (eyes[wert - 1][i] == 1)?HIGH:LOW); // WAS PASSIERT HIER GENAU ???
}

Da gibt er die 7 Punkte der gewürfelten Zahl aus. Da er aber die Pins schon in einem Array hat, ist pinoffset eigentlich Unsinn. Außerdem sind HIGH und LOW als 1 und 0 deklariert und das hat er im Array stehen.

Damit kann man das vereinfachen und ich denke, es wird dadurch verständlicher:

  digitalWrite(pin[i], eyes[wert - 1][i]);

wert -1 deshalb, weil das Array bei 0 anfängt, die niedrigste Würfelzahl aber 1 ist.

Gruß Tommy

Mit den Bits hast Du Recht aber für einen Neuling ist auch das Array mit den eyes noch tragbar, wobei byte sinnvoller, als int wäre.
Bitmanipulation ist nicht so anfängerfreundlich wie Array. Es wäre aber der nächste Schritt.

Gruß Tommy

 (eyes[wert - 1] == 1) ? HIGH : LOW)

such nach "ternärer Operator"

das ist eine Kurzform des IF's.

andererseits:
da

int eyes[6][7] = {{0, 0, 0, 1, 0, 0, 0}, // Würfelaugen zeigen "1"
                   {1, 0, 0, 0, 0, 0, 1}, // Würfelaugen zeigen "2"
                   {1, 0, 0, 1, 0, 0, 1}, // Würfelaugen zeigen "3"
                   {1, 0, 1, 0, 1, 0, 1}, // Würfelaugen zeigen "4"
                   {1, 0, 1, 1, 1, 0, 1}, // Würfelaugen zeigen "5"
                   {1, 1, 1, 0, 1, 1, 1}}; // Würfelaugen zeigen "6"

also nur 1 und 0 im Array steht kann man sich die IF Kontrolle sparen.

kann man satt:

(eyes[wert - 1][i]== 1) ? HIGH : LOW)

einfacher:

(eyes[wert - 1][i])

Grüße Uwe

  • digitalWrite(i + pinOffset, (eyes[value - 1] == 1)?HIGH:LOW); -

kapiere ich einfach nicht.

Ist auch dreifach gemoppelt.

digitalWrite(i + pinOffset, *(eyes + value - 1));
macht das gleiche.
(oder?)

(eyes[wert - 1][i] == 1)?HIGH:LOW);
wird zu

eyes[wert - 1][i]

Hallo,

der Spruch lautet anders damit er einen tieferen Sinn ergibt.

"Alle sagen es geht nicht. Dann kam jemand der wußte das nicht und hats gemacht."

Doc_Arduino:
der Spruch lautet anders damit er einen tieferen Sinn ergibt.

Der ist aus den Unglückskeksen des Nico Semsrott.
Hier eine der Quellen

Hallo,

den Typen kenne ich auch. :wink: Ich würde behaupten wollen er hat den Spruch absichtlich "umgedichtet" damit es zu seiner Rolle passt. Mir fiel das nur vorhin direkt ins Auge weswegen ich darauf reagiert habe.

Danke euch allen :slight_smile: !!

..ich versuche den code nach den entsprechenden Anregungen zu ändern,
damit er gut lesbar ist (const für die Pins und so..).
Bei dem array für die augen bleibe ich wohl.

Quote

Ausserdem möchte ich dass die LEDs rotieren ca. 3 Sekunden nach Tasterbetätigung
und nicht etwa so lange wie dieser gedrückt gehalten wird. Wie kann man das
implementieren ?

Zeit merken mit millis() wenn du den Taster loslässt und dann 3000 millisekunden nachlaufen lassen.

Beispiel "BlinkWithoutDelay" in der IDE ansehen und ausprobieren!(!!!)

das hat irgendwie nicht geklappt. Ich versuche das zurzeit mit der StateChangeDetection
aus den Beispielen in der Arduino IDE hinzubekommen.

Gruß Fliffi