loop verstehen - array und logische bedingungen - Die 2te

Hallo Arduino Community :slight_smile: !

Ich benötige noch mal eure Hilfe, bzgl. des LED Würfels:

Ich möchte unten stehenden Code vereinfachen, und die Definition der LED pins anstatt
durch ein array

int pin = {2, 3, 4, 5, 6, 7, 8};
int pinOffset = 2;

mit

int LED1=2;

int LED7=8;

machen und mit

pinmode (LED1, OUTPUT);

pinmode (LED7, OUTPUT);

die Ausgänge definieren um alles nachvollziehen.

Es geht mir um das kleinschrittige verstehen und erklären können.

Ich weiss allerdings nicht, wie ich das Listing bzw. die setup und die showeyes routine
abändern muss damit dies dann auch funktioniert:

#define PAUSE 20					// PAUSE 20 ms
int eyes[6][7] = {{0, 0, 0, 1, 0, 0, 0},    // Würfel zeigt 1
		 {1, 0, 0, 0, 0, 0, 1},	       // Würfel zeigt 2
		 {1, 0, 0, 1, 0, 0, 1},	       // Würfel zeigt 3
		 {1, 0, 1, 0, 1, 0, 1},	       // Würfel zeigt 4
		{1, 0, 1, 1, 1, 0, 1},	      // Würfel zeigt 5
		{1, 1, 1, 0, 1, 1, 1}};	      // Würfel zeigt 6
//
int pin[] = {2, 3, 4, 5, 6, 7, 8};
int pinOffset = 2; 							// erste LED ist auf Pin 2
int pushbutton = 13;							// Taster an Pin 13
//

void showdice(int wert)	{
	for (int i = 0; i < 7; i++)
	digitalWrite(pin[i], eyes[wert - 1][i]);	
	delay(PAUSE);
}

void setup() {
	for(int i = 0; i < 7; i++)					         // array aufbauen
	pinMode(pin[i], OUTPUT);					// für Pins entspr. den Würfelaugen
	pinMode(pushbutton, INPUT);					// Taster als Input
}

void loop() {
	if(digitalRead(pushbutton) == HIGH)
	showdice(random(1, 7)); 					// Aufruf "Würfelaugen" zeigen,
										// mit Übergabe einer Zufallszahl
}

Ich bin euch über jede Hilfe dankbar und auch um Nachsicht, da ich Arduino Anfänger bin ::).

Gruß,

Fliffi

in deinem Sketch gibt es keine showeyes Routine. Vieleicht solltest du zunächst beschreiben was dein Programm machen soll und warum du KEIN Array haben willst. Arrays sind nämlich eine tolle Sache.

Fliffi: Ich möchte unten stehenden Code vereinfachen, und die Definition der LED pins anstatt durch ein array

int pin[] = {2, 3, 4, 5, 6, 7, 8}; int pinOffset = 2;

mit

int LED1=2; ... int LED7=8;

machen

Das ist aber das genaue Gegenteil von Vereinfachen.

Gruß Tommy

ich habs mal so kommentiert wie ich es erklären würde
Außerdem ein wenig zusammengeräumt - aber noch nicht optimiert.

const byte pause = 20;           // die Variable pause ist aktuell nur 20 millisekunden, wir verwenden daher ein Variable der Größe Byte. Außerdem definieren wir sie konstant da sie im Sketch nicht verändert wird
const byte eyes[6][7] = {        // Die Definition welche LEDs für welche Augenzahl leuchten soll. 1 ein, 0 aus. Auch diese Muster sind konstant
  {0, 0, 0, 1, 0, 0, 0},         // Muster 0 -> Würfel zeigt 1
  {1, 0, 0, 0, 0, 0, 1},         // Muster 1 -> Würfel zeigt 2
  {1, 0, 0, 1, 0, 0, 1},         // Muster 2 -> Würfel zeigt 3
  {1, 0, 1, 0, 1, 0, 1},         // Muster 3 -> Würfel zeigt 4
  {1, 0, 1, 1, 1, 0, 1},         // Muster 4 -> Würfel zeigt 5
  {1, 1, 1, 0, 1, 1, 1}          // Muster 5 -> Würfel zeigt 6
};

const byte pin[] = {2, 3, 4, 5, 6, 7, 8}; // damit bekommt beispielsweise der pin[0] den GPIO 2 zugewiesen.
const byte pushbutton = 13;               // Taster an Pin 13, ändert sich nicht, daher konstant

void showdice(byte wert) {
  for (byte i = 0; i < 7; i++)                       // wir gehen alle 7 pins (0-6) durch
    digitalWrite(pin[i], eyes[wert - 1][i]);         // der reihe nach (pin[i]) wird nun gem. dem definiertem Muster gesetzt. Da das Muster mit 0 beginnt, wird der übernommen Wert (die Augenzahl) um 1 reduziert. Damit wir in das richtige Bitmuster finden
  delay(pause);
}

void setup() {
  for (byte i = 0; i < 7; i++)         // wir gehen alle 7 pins (0-6) durch
    pinMode(pin[i], OUTPUT);           // der reihe nach werden die 7 pins (die Pins die in pin[0] bis pin[6] definiert wurden) wird nun auf Ausgang gesetzt
  pinMode(pushbutton, INPUT);          // Taster als Input
}

void loop() {
  if (digitalRead(pushbutton) == HIGH)
    showdice(random(1, 7));            // Aufruf "Würfelaugen" zeigen, mit Übergabe einer Zufallszahl. Random arbeitet INKLUSIVE dem erten Werte bis EXKLUSIVE dem zweiten Wert. Du bekommst daher hier eine Zufallszahl 1,2,3,4,5 oder 6.
}

ich denke das Schwierigste ist zu aktzeptieren, dass wir in C++ bei 0 beginnen zu zählen. Daher die ersten Elemente in einem Array den Index 0 haben.

Und halt aufpassen, dass diese For-Schleifen auf "so lange i kleiner ist als " abfragen. Weswegen der Grenzwert mitunter um eins höher ist als man vieleicht glauben würde.
Und drittens, ist es halt eine Eigenart von Würfeln, dass wir zwar nur 6 Werte anzeigen wollen, aber dafür 7 LEDs brauchen wenn wir es als Würfel anordnen wollen.

Damit sollen aber nun alle Verwirrungen geklärt sein, oder?

Edit:
als abschreckendes Beispiel das 200 Byte mehr Flash braucht:

// Würfeln,
// wie man es nicht macht

const byte pause = 20;
const byte ledPin1 = 2;
const byte ledPin2 = 3;
const byte ledPin3 = 4;
const byte ledPin4 = 5;
const byte ledPin5 = 6;
const byte ledPin6 = 7;
const byte ledPin7 = 8;
const byte pushbutton = 13;

void showdice(byte augenzahl)
{
  switch (augenzahl)
  {
    case 1:
      digitalWrite(ledPin1, 0);
      digitalWrite(ledPin2, 0);
      digitalWrite(ledPin3, 0);
      digitalWrite(ledPin4, 1);
      digitalWrite(ledPin5, 0);
      digitalWrite(ledPin6, 0);
      digitalWrite(ledPin7, 0);
      break;
    case 2:
      digitalWrite(ledPin1, 1);
      digitalWrite(ledPin2, 0);
      digitalWrite(ledPin3, 0);
      digitalWrite(ledPin4, 0);
      digitalWrite(ledPin5, 0);
      digitalWrite(ledPin6, 0);
      digitalWrite(ledPin7, 1);
      break;
    case 3:
      digitalWrite(ledPin1, 1);
      digitalWrite(ledPin2, 0);
      digitalWrite(ledPin3, 0);
      digitalWrite(ledPin4, 1);
      digitalWrite(ledPin5, 0);
      digitalWrite(ledPin6, 0);
      digitalWrite(ledPin7, 1);
      break;
    case 4:
      digitalWrite(ledPin1, 1);
      digitalWrite(ledPin2, 0);
      digitalWrite(ledPin3, 1);
      digitalWrite(ledPin4, 0);
      digitalWrite(ledPin5, 1);
      digitalWrite(ledPin6, 0);
      digitalWrite(ledPin7, 1);
      break;
    case 5:
      digitalWrite(ledPin1, 1);
      digitalWrite(ledPin2, 0);
      digitalWrite(ledPin3, 1);
      digitalWrite(ledPin4, 1);
      digitalWrite(ledPin5, 1);
      digitalWrite(ledPin6, 0);
      digitalWrite(ledPin7, 1);
      break;
    case 6:
      digitalWrite(ledPin1, 1);
      digitalWrite(ledPin2, 1);
      digitalWrite(ledPin3, 1);
      digitalWrite(ledPin4, 0);
      digitalWrite(ledPin5, 1);
      digitalWrite(ledPin6, 1);
      digitalWrite(ledPin7, 1);
      break;
  }
  delay(pause);
}

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(pushbutton, INPUT);
}

void loop() {
  if (digitalRead(pushbutton) == HIGH)
    showdice(random(1, 7));
}

Hi

Der Würfel wird doch eh nur in 4 Gruppen angesteuert.

A   B
C D E
F   G

Für alle UNGERADEN wird die LED ‘D’ angesteuert.
Ab der ZWEI B und F (alternativ A und G).
Ab der Vier A und G (alternativ B und F).
Ab (oder bei) der SECHS C und E.

Somit würde ich Das in vier IFs abarbeiten.
Wenn man den Luxus, jede LED einzeln auf egal welchen Pin zu legen nicht unbedingt braucht, könnte man auch nur EINEN Pin angeben, mit Dem diese vier Gruppen beginnen - der Rest ist dann Hardware.

Dann bräuchten wir weder ein Array, noch defines, wobei man ein Array noch mit einer FOR-Schleife durchrattern kann - Das geht mit einzelnen defines nicht wirklich.

MfG

Hallo !

..es geschehen doch noch Wunder !

Danke noiasca :kissing: , :) für den Code ..und den Kommentar dazu !

Mir fällt ein ganzer Steinbruch vom Herzen, dessen Gewicht sich gefühlt im oberen Tonnenbereich befand.

Betrachte dich als Held der Woche..nein des Monats :)

Danke, Danke, Danke !!!

Fliffi

jo der postmaster hat eigentlich recht. GPIO sparen!

kompiliert, hardwareseitig ungeprüft:

// Würfeln,
// mit 4 LED Gruppen
// Idee postmaster
// A     B
// C  D  E
// F     G
// LED A und G Teilen sich einen GPIO
// LED B und F Teilen sich einen GPIO
// LED C und E teilen sich einen GPIO

const byte pause = 20;
const byte ledPinA = 2;  // auch für G
const byte ledPinB = 3;  // auch für F
const byte ledPinC = 4;  // auch für E
const byte ledPinD = 5;

const byte pushbutton = 13;

void showdice(byte augenzahl)
{
  //digitalWrite(ledPinA, 0);
  //digitalWrite(ledPinB, 0);
  //digitalWrite(ledPinC, 0);
  //digitalWrite(ledPinD, 0);
  if (augenzahl % 2) digitalWrite(ledPinD, 1); else digitalWrite(ledPinD, 0);
  if (augenzahl >= 2) digitalWrite(ledPinB, 1); else digitalWrite(ledPinB, 0);
  if (augenzahl >= 4) digitalWrite(ledPinA, 1); else digitalWrite(ledPinA, 0);
  if (augenzahl == 6) digitalWrite(ledPinC, 1); else digitalWrite(ledPinC, 0);
  delay(pause);
}

void setup() {
  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT);
  pinMode(ledPinD, OUTPUT);
  pinMode(pushbutton, INPUT);
}

void loop() {
  if (digitalRead(pushbutton) == HIGH)
    showdice(random(1, 7));           // Aufruf "Würfelaugen" zeigen,
}

Hallo nochmal !

Das Thema LED Würfel ist immer noch nicht ganz durch.

Ich habe den code von noiasca genommen (ließ sich problemlos kompilieren).

Nun habe ich diesen etwas umgestellt

  • void showdice und void loop getauscht, sowie Kommentare geschrieben -

jetzt lässt es sich nicht mehr kompilieren, ich erhalte immer
die Fehlermeldung stray /342 im Programm :frowning:

const byte pause = 20;	// delay von 20ms

				// Festlegung eines 2-dimensionalen Arrays für Würfelaugen,
				// Definition welche  LEDs für welche Augenzahl leuchten soll,
				// 1 LED ein, 0 LED aus - 6 Spalten, 7 Zeilen:
const byte eyes[6][7] = { 
  {0, 0, 0, 1, 0, 0, 0},		// Muster 0 -> Würfel zeigt 1
  {1, 0, 0, 0, 0, 0, 1},		// Muster 1 -> Würfel zeigt 2
  {1, 0, 0, 1, 0, 0, 1},		// Muster 2 -> Würfel zeigt 3
  {1, 0, 1, 0, 1, 0, 1},		// Muster 3 -> Würfel zeigt 4
  {1, 0, 1, 1, 1, 0, 1},		// Muster 4 -> Würfel zeigt 5
  {1, 1, 1, 0, 1, 1, 1}		// Muster 5 -> Würfel zeigt 6
};
						// Variablendeklaration: Datentyp byte (0-255)
						// Zur Festlegung eines 1-dimensionalen Arrays
						// um Pins 2 - 8 später als Output zu schalten
const byte pin[] = {2, 3, 4, 5, 6, 7, 8}; 	// Wichtig ! Das Array beginnt bei 0 zu zählen, d.h.:
						// pin[0] bekommt Pin 2 usw.
 
const byte pushbutton = 13;             	// Taster an Pin 13

void setup () {
	for (byte i = 0; i < 7; i++)		// Der Reihe nach werden die 7 Pins
	pinMode(pin[i], OUTPUT);		// definiert als pin[0] bis pin[6] (entspr 0-6 im Array)
						// als Ausgang gesetzt

	pinMode(pushbutton; INPUT);	// Taster als INPUT

void (showdice(byte wert) {			// Routine showdice zum Darstellen								// der gewürfelten Zahl auf dem LED								// Muster, die generierte Zufallzahl ist
							// in "wert" gespeichert:
	for (byte i = 0; i < 7; i++)			// alle 7 Pins werden durchgegangen,
	digitalWrite(pin[i], eyes[wert – 1][i]);       // der Reihe nach (pin[i] wird nun gemäß 
							// dem definierten Muster gesetzt. Da das 							// Muster mit 0 beginnt, wird der 									// übernommende Wert (die Augenzahl in 							// wert) um 1 reduziert um das richtige 								// Bitmuster zu finden

delay(pause);					// Pause von 20ms für das Würfelflackern
}







void loop() {						// Mainloop: es wird abgefragt ob der Taster 							// an Pin 13 gedrückt wurde:
	if (digitalRead(pushbutton) == HIGH)	//  Ja (entspr. HIGH), dann rufe showdice
	showdice(random(1, 7));			// auf mit Übergabe einer Zufallszahl.
							// Random arbeit INKLUSIVE dem ersten
							// Wert bis EXCLUSIVE dem zweiten Wert.
							// Daher bekommt man eine Zufallszahl
							// 1, 2, 3, 4, 5 oder 6.
}

was ist denn jetzt bitte falsch ??

Grüße, Fliffi

Da hast Du ein mindestens 1 ungültiges Zeichen drin oder Umlaute.

Nimm mal einen Editor, bei dem man den Zeichensatz umstellen kann (z.B. Notepad++). Beim Umschalten der Kodierung zwischen UTF8 und ANSI siehst Du dann irgendwo ein/mehrere blöde Zeichen.

Gruß Tommy

Edit: Es stimmen auch Klammern nicht. z.B.

void (showdice(byte wert) {

Notepadd++ ist gut. Ich versuche gleich mal alles ohne Kommentare zu kompilieren.

In Notepad++ arbeite ich in UTF8.

Das lässt sich jetzt kompilieren:

const byte pause = 20;  

const byte eyes[6][7] = { 
  {0, 0, 0, 1, 0, 0, 0},    
  {1, 0, 0, 0, 0, 0, 1},    
  {1, 0, 0, 1, 0, 0, 1},    
  {1, 0, 1, 0, 1, 0, 1},    
  {1, 0, 1, 1, 1, 0, 1},    
  {1, 1, 1, 0, 1, 1, 1}   
};

const byte pin[] = {2, 3, 4, 5, 6, 7, 8};   
const byte pushbutton = 13;               

void setup () {
  for (byte i = 0; i < 7; i++)    
  pinMode(pin[i], OUTPUT);    
  pinMode(pushbutton, INPUT); 
}
void showdice(byte wert) {
  for (byte i = 0; i < 7; i++)
    digitalWrite(pin[i], eyes[wert - 1][i]);         
  
delay(pause);
}
void loop() {                         
  if (digitalRead(pushbutton) == HIGH)  
  showdice(random(1, 7));
}

:slight_smile:

Bei den Klammern wird nichts morniert.

Danke tommy56.

Fliffi: Bei den Klammern wird nichts morniert.

Das ist auch ein anderer Code, als in #7.

Gruß Tommy

7

pinMode(pushbutton; INPUT); // Taster als INPUT

Strichpunkt an falscher Stelle.

generell falsche Klammersetzungen. das nur als Beispiel: void (showdice(byte wert)

Ein wenig genauer solltest du schon arbeiten lernen.

Generell: Drück mal STRG-T Schauts hässlich aus, hast mit großer Wahrscheinlichkeit Klammern falsch gesetzt.