INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Verkettung von Variablen
26.12.2018, 19:47 (Dieser Beitrag wurde zuletzt bearbeitet: 27.12.2018 00:23 von Bitklopfer.)
Beitrag #1
Verkettung von Variablen
Hallo
Wo fang ich an? Am besten mit einem Ausschnitt aus dem Sketch

Code:
byte pfeil1[] = {B11000000, B01100000, B0011000, B00011000, B00001100, B00000110, B00000011, B1000001};
void setup()
  {
    pinMode(E1, OUTPUT);
    pinMode(E2, OUTPUT);
    pinMode(E3, OUTPUT);
    pinMode(S1, OUTPUT);
    pinMode(S2, OUTPUT);
    pinMode(S3, OUTPUT);
    pinMode(S4, OUTPUT);
    pinMode(S5, OUTPUT);
    pinMode(S6, OUTPUT);
    pinMode(S7, OUTPUT);
    pinMode(S8, OUTPUT);
    pinMode(S9, OUTPUT);
  }

void loop()
  {
    digitalWrite(E1, HIGH);
    for (int y = 0; y > 8; y++)
      {
        spalte(pfeil1[y]);
      }
    pause(P);
  }

void spalte(byte n)
  {
  for(int k=1; k < 9; k++)
    {
      if((n & 10000000) > 0)
      digitalWrite([color=#FF0000][b]"S".k,[/b][/color] HIGH);
      else
      digitalWrite([color=#FF0000][b]"S".k[/b][/color], LOW);
      n = n << 1;
    }  
  }

Es betrifft jetzt die beiden rotmarkierten Stellen. mit dem Punkt ist eine Variante, die ich aus PHP kenne um Variablen zu verketten. Beim Arduino funktioniert das so nicht. Do wie bekomme ich die Laufvariable k an das S um den entsprechenden Ausgangspin anzusprechen? Wahrscheinlich ist die Lösung total simpel, aber ich komm einfach nicht drauf und finde auch nichts. Die Fehlermeldung (request for member 'k' in '"S"', which is of non-class type 'const char [2]')bringt mich auch nicht weiter.

Gruß Kay
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.12.2018, 19:56
Beitrag #2
RE: Verkettung von Variablen
Stelle Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.

Bitte vollständige Sketche posten. Was sind E1...E3 und S1...S9?
Welcher Prozessor?

Was Du suchst sind entweder Struct / Klassen (a.b-Notation) oder Arrays (Laufvariable).
Da werde ich aus Deiner Beschreibung noch nicht ganz schlau.

Du kannst auch mal beschreiben, was Du genau machen willst (zur Not auch als PHP-Code).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2018, 19:39 (Dieser Beitrag wurde zuletzt bearbeitet: 27.12.2018 19:41 von flint74.)
Beitrag #3
RE: Verkettung von Variablen
Code:
const int E1 = 13;
  const int E2 = 2;
  const int E3 = 3;
  const int S1 = 10;
  const int S2 = 11;
  const int S3 = 12;
  const int S4 = 8;
  const int S5 = 9;
  const int S6 = 5;
  const int S7 = 4;
  const int S8 = 6;
  const int S9 = 7;
  int x = 1;
  int y = 0;
  int P = 2000;
  byte pfeil1[] = {B11000000, B01100000, B0011000, B00011000, B00001100, B00000110, B00000011, B1000001};
  byte pfeil2[] = {B01100000, B00110000, B0001100, B00001100, B00000110, B00000011, B10000001, B1100000};
  
void setup()
  {
    pinMode(E1, OUTPUT);
    pinMode(E2, OUTPUT);
    pinMode(E3, OUTPUT);
    pinMode(S1, OUTPUT);
    pinMode(S2, OUTPUT);
    pinMode(S3, OUTPUT);
    pinMode(S4, OUTPUT);
    pinMode(S5, OUTPUT);
    pinMode(S6, OUTPUT);
    pinMode(S7, OUTPUT);
    pinMode(S8, OUTPUT);
    pinMode(S9, OUTPUT);
  }

void loop()
  {
    aus();
    digitalWrite(E1, HIGH);
    digitalWrite(E3, HIGH);
    for (int y = 0; y > 8; y++)
      {
        spalte(pfeil1[y]);
      }
    pause(P);
  }

void spalte(byte n)
  {
  for(int k=1; k < 9; k++)
    {
      if((n & 10000000) > 0)
      digitalWrite("S".k, HIGH);
      else
      digitalWrite("S".k, LOW);
      n = n << 1;
    }  
  }
  
void aus()          // alle LED aus
  {
    digitalWrite(E1, LOW);
    digitalWrite(E2, LOW);
    digitalWrite(E3, LOW);
    digitalWrite(S1, HIGH);
    digitalWrite(S2, HIGH);
    digitalWrite(S3, HIGH);
    digitalWrite(S4, HIGH);
    digitalWrite(S5, HIGH);
    digitalWrite(S6, HIGH);
    digitalWrite(S7, HIGH);
    digitalWrite(S8, HIGH);
    digitalWrite(S9, HIGH);
  }

void alle()       // alle LED leuchten
  {
    digitalWrite(E1, HIGH);
    digitalWrite(E2, HIGH);
    digitalWrite(E3, HIGH);
    digitalWrite(S1, LOW);
    digitalWrite(S2, LOW);
    digitalWrite(S3, LOW);
    digitalWrite(S4, LOW);
    digitalWrite(S5, LOW);
    digitalWrite(S6, LOW);
    digitalWrite(S7, LOW);
    digitalWrite(S8, LOW);
    digitalWrite(S9, LOW);
  }

void pause(int x)
  {
    delay(x);
  }
Das ist das was ich bis jetzt habe, und was leider nicht so funktioniert, wie es soll.
Das ganze ist für meinen 3x3x3 LED-Cube. E1-E3 sind die Ebenden und S1-S9 die Säulen.
Der Plan sieht vor einen Pfeil im Uhrzeigersinn um den Würfel kreisen zu lassen. Einen praktischen Wert hat das ganze nicht. Ich seh das hauptsächlich als Übung oder Spaß oder Hobby oder wie auch immer.

in PHP kann man Variablen mit einem Punkt verketten, so wie ich es hier auch versucht habe. Da würde das so aussehen:
Code:
"S".$k
oder so:
Code:
$a = "S"
$a.$k

Das $-Zeichen steht in PHP vor jeder Variablen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2018, 20:01
Beitrag #4
RE: Verkettung von Variablen
Dein PHP-Code hat mir gezeigt, was Du mit "verketten" meinst -> Eine Zeichenkettenzusammenführung. Das funktioniert in PHP, weil das eine schwach/nicht typisierte Sprache ist. Das funktioniert in C/C++ nicht.

Alle numerischen Variablen als int deutet im Normalfall darauf hin, dass nicht darüber nachgedacht wurde. Für Pins genügt Byte - sie werden nicht negativ und es sind nicht mehr als 256.

Du könntest die Spalten z.B. in ein Array schreiben:
Code:
// Dein Code:
  const int S1 = 10;
  const int S2 = 11;
  const int S3 = 12;
  const int S4 = 8;
  const int S5 = 9;
  const int S6 = 5;
  const int S7 = 4;
  const int S8 = 6;
  const int S9 = 7;

// als Array
const byte spalten[] = {10,11,12,8,9,5,4,6,7};  // von 0 bis 8!
const byte spaltenAnzahl = sizeof(spalten) / sizeof(spalten[0]);
...
// im setup
for(byte i=0; i<spaltenAnzahl; i++) pinMode(spalten[i],OUTPUT);
...
void spalte(byte n)
  {
  for(byte k=0; k < spaltenAnzahl; k++)  // 0 bis 8
    {
      if((n & 10000000) > 0)  // Was soll das darstellen? Meinst Du damit Binär, dann B10000000 oder 0x80
      digitalWrite(spalten[k], HIGH);
      else
      digitalWrite(spalten[k], LOW);
      n = n << 1;
    }  
  }

Versuche es mal auf diesem Weg. Für E kannst Du das auch machen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2018, 14:30
Beitrag #5
RE: Verkettung von Variablen
Die Idee mit den Arrays ist richtig gut. Sie hat nur einen Nachteil: Sie ist mir nicht selber gekommen. Angel
Ob Variablen als int oder byte deklariert werden, spielt, denke ich, hier nicht so die Rolle. Bei Sketchen, welche den Speicher des Arduino ausreizen, ist es natürlich wichtig darauf zu achten. Der Unterschied macht hier 174 byte an Speicherbedarf aus. Da der Sketch aber nur 4% des gesammt Speichers benötigt ...
Ich hab im Code jetzt einen einfachen und einen doppelten Pfeil festgelegt, wobei mir der einfache besser gefällt.

Code:
// Anordnung der Säulen und Ebenen am Würfel
  //
  //  9    5     4
  //
  //  8    7     6
  //
  // 12   11    10
  //
  //        USB
  //
  //     3  oben
  //     2  mitte
  //    13  unten
    
  byte Saeule[] = {10, 11, 12, 8, 9, 5, 4, 6, 7};  // Säulen
  byte Ebene[] = {13, 2, 3};                       // Ebenen

void setup()
  {
    for(byte x = 0; x < 8; x++)                   // Pins der Säulen werden als Ausgänge definiert
      {
        pinMode(Saeule[x], OUTPUT);
      }
    for(byte x = 0; x < 3; x++)                   // Pins der Ebenen werden als Ausgänge definiert
      {
        pinMode(Ebene[x], OUTPUT);
      }
  }

void loop()
  {
    aus();                                        // alle LED werden zu Beginn ausgeschalten
    for (byte d = 0; d < 4; d++)                  // Schleife mit 4 Durchläufen wird für die Figur festgelegt
      {
        for (byte x = 0; x < 8; x++)              // Für die Figur müssen die Säulen einzeln nacheinander angesprochen werden
          {
            pfeil1(x);                            // Die Zählvariable wird der Funktion übergeben und rückt den Pfeil
          }                                       // eine Position weiter
      }
    for (byte d = 0; d < 4; d++)
      {
        for (byte x = 0; x < 8; x++)
          {
            pfeil2(x);
          }
      }
  }

void pfeil2(byte n)                           // doppelter Pfeil läuft im Uhrzeigersinn um den Würfel
  {
    if (n == 8)                               // wenn Säule 9 dran währe beginnt die Zählung wieder bei 0
      {
        n = 0;
      }
    byte m = n + 1;                           // Eine Säule vorher
    if (m == 8)
      {
        m = 0;
      }
    byte k = m + 1;                           // Noch eine Säule vorher
    if (k == 8)
      {
        k = 0;
      }
    for(byte x = 0; x < 35; x++)              // x bestimmt hier die Geschwindigkeit, mit der de Pfeil um den Würfel kreist
      {
        digitalWrite(Saeule[n], LOW);         // einmal leuchten je 2 LED in der oberen und unteren Ebene
        digitalWrite(Saeule[m], LOW);
        digitalWrite(Saeule[k], HIGH);
        digitalWrite(Ebene[0], HIGH);
        digitalWrite(Ebene[1], LOW);
        digitalWrite(Ebene[2], HIGH);
        delay(5);
        digitalWrite(Saeule[n], HIGH);        // nach 5 ms leuchten 2 LED in der mittleren Ebene
        digitalWrite(Saeule[m], LOW);         // durch die sehr kurze Pause erscheint es so, als ob
        digitalWrite(Saeule[k], LOW);         // alle 6 LED gleichzeitig eingeschalten wären
        digitalWrite(Ebene[0], LOW);
        digitalWrite(Ebene[1], HIGH);
        digitalWrite(Ebene[2], LOW);
        delay(5);
      }
  }
void pfeil1(byte n)                           // einfacher Pfeil läuft im Uhrzeigersinn um den Würfel
  {
    if (n == 8)
      {
        n = 0;
      }
    byte m = n + 1;
    if (m == 8)
      {
        m = 0;
      }
    for(byte x = 0; x < 30; x++)
      {
        digitalWrite(Saeule[n], LOW);
        digitalWrite(Saeule[m], HIGH);
        digitalWrite(Ebene[0], HIGH);
        digitalWrite(Ebene[1], LOW);
        digitalWrite(Ebene[2], HIGH);
        delay(5);
        digitalWrite(Saeule[n], HIGH);
        digitalWrite(Saeule[m], LOW);
        digitalWrite(Ebene[0], LOW);
        digitalWrite(Ebene[1], HIGH);
        digitalWrite(Ebene[2], LOW);
        delay(5);
      }
  }
  
void aus()                                    // alle LED aus
  {
    for(byte x = 0; x < 9; x++)
      {
        digitalWrite(Saeule[x], HIGH);
      }
    for(byte x = 0; x < 3; x++)
      {
        digitalWrite(Ebene[x], LOW);
      }
  }

Vielen Dank für die Hilfe, einen guten Rutsch und maximale Erfolge im neuen Jahr
Kay

So sieht das dann aus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2018, 14:33
Beitrag #6
RE: Verkettung von Variablen
Schön, dass es geholfen hat.

Ich hatte auf byte vs. int hingewiesen, da man sich schon von Anfang an aufs Speichersparen besinnen sollte, damit das schon in Fleisch und Blut übergeht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 945 19.03.2019 20:33
Letzter Beitrag: Hilgi
  char in Variablen aufteilen fv1895 7 572 06.01.2019 11:59
Letzter Beitrag: Tommy56
  Variablen zu einem CHAR verbinden und einbinden Frank_aus_WOB 3 688 02.01.2019 09:07
Letzter Beitrag: Tommy56
  Variablen über Eingabe im Setup beschreiben heini320 3 577 30.12.2018 11:37
Letzter Beitrag: Tommy56
  Zentrale Variablen für verschiedene Klassen Smirgel 3 544 29.10.2018 21:24
Letzter Beitrag: Tommy56
  Speichern u. Lesen von Variablen von SDCard Christian_Moba-Arduino 7 1.618 24.08.2018 17:35
Letzter Beitrag: Tommy56
Question Falsche Variablen Deklaration? nimmzwei 7 1.525 15.01.2018 18:31
Letzter Beitrag: Tommy56
  Libs mit peristenten Variablen Gerri3d 2 1.116 04.11.2017 07:20
Letzter Beitrag: Gerri3d
  Frage zur Adressierung von Variablen ardu_arne 14 2.817 28.10.2017 11:16
Letzter Beitrag: ardu_arne
  Variablen over/underflow "deaktivieren" Scheams 6 1.610 23.06.2016 16:36
Letzter Beitrag: Scheams

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste