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
Probleme mit einer Variablen
04.12.2014, 22:00
Beitrag #1
Probleme mit einer Variablen
Hallo. Ich steuere per µController einige WS2812 RGB-LEDs an. Normalerweise funktioniert das u. A. mit folgendem Codeschnipsel:
Code:
stripe_1.setPixelColor(i, stripe_1.Color(rot, gruen, blau));

Da ich mehrere Stripes an dem µController nutze, artet das ansprechen aller Stripes immer etwas aus. Das könnte z. B. Folgendermaßen aussehen:
Code:
for(int i=0; i < NUMPIXELS; i++){ //Schleife für einen normalen Ring mit einer Farbe.
         pixels_vr.setPixelColor(i, pixels_vr.Color(255, 0, 0));
         pixels_vl.setPixelColor(i, pixels_vl.Color(255, 0, 0));
         pixels_hr.setPixelColor(i, pixels_hr.Color(255, 0, 0));
         pixels_hl.setPixelColor(i, pixels_hl.Color(255, 0, 0));
         pixels_vr.show();
         pixels_vl.show();
         pixels_hr.show();
         pixels_hl.show();
      }

Das könnte ich jetzt lösen, indem die Stripes per Zählervariable angesprochen werden.
Code:
for(int i=0; k < NUMSTRIPES; i++){
for(int i=0; i < NUMPIXELS; i++){
         "stripe_" + k.setPixelColor(i,  "stripe_" + k.Color(255, 0, 0));
   }
}
Allerdings funktioniert das nicht. Ich denke ich mache da irgendwas grundlegendes falsch Smile Bitte gebt mir einen Tipp in die richtige Richtung Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 22:15
Beitrag #2
RE: Probleme mit einer Variablen
Hi,
das dürfte noch nicht einmal durch den Compiler gehen... Warum erwartest Du, dass das funktioniert???
"stripe_" ist eine Zeichenkette. Daran willst Du mit "+" was dranhängen. Das würde vielleicht noch gehen, wenn das, was danach kommt auch eine Zeichenkette ist. (Aber nicht so direkt in C++.) Aber dann kommt k.setPixelColor. k ist ein int und keine Objektinstanz. Also kannst Du dafür auch keine Methode aufrufen.
Nehmen wir mal spaßeshalber an, dass sich aus Deiner Codingzeile wirklich eine Zeichenkette ergeben sollte, die theoretisch ausführbares Coding enthält. Um das auszuführen, müsste der Arduino einen C++-Compiler oder Interpreter an Bord haben. Hat er aber nicht...

Der Tipp ist "Array", also ungefähr so:
Code:
Adafruit_NeoPixel stripes[] = { pixels_vr, pixels_vl, pixels_hr, pixels_hl };

   for(int k=0; k < NUMSTRIPES; k++){
    for(int i=0; i < NUMPIXELS; i++){
       stripes[k].setPixelColor(i,  255, 0, 0);
    }
}

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 22:33 (Dieser Beitrag wurde zuletzt bearbeitet: 04.12.2014 22:39 von scritch.)
Beitrag #3
RE: Probleme mit einer Variablen
Hallo Thorsten. Danke für deine Erklärung und deinen Lösungsvorschlag. An ein Array hatte ich gar nicht gedacht, sollte für meinen Fall aber gut anwendbar sein.

Warum ich annehme dass das funktioniert? Habe ich nicht. Ich habe es lediglich gehofft Smile Bin noch nicht so sehr vertraut mit den Zusammenhängen und der Syntax von C++ Smile Deswegen musst du mir bitte auch nochmal erklären was du hiermit meinst: " k ist ein int und keine Objektinstanz.".

Was ich auch gerade nicht verstehe: du definierst ein Array und gibst als Typ "Adafruit_NeoPixel" und als Variablennamen "stripes" an. Wieso nimmst du den Typen "Adafruit_NeoPixel"?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 22:44
Beitrag #4
RE: Probleme mit einer Variablen
Hi,
die Notation mit dem Punkt bedeutet den Aufruf einer Methode bzw. die Adressierung eines Attributs einer Objektinstanz. D.h. wenn Du in C++ sowas hinschreibst:
Code:
x.m();
Dann bedeutet das, dass x eine Instanz einer Klasse ist. (Oder auch ein Objekt.) Diese Klasse muss eine Methode mit dem Namen m haben. Zum Beispiel ist bei Dir wahrscheinlich pixels_vr eine Instanz der Klasse Adafruit_NeoPixel, in welcher eine Methode setPixelColor definiert ist. Deshalb funktioniert pixels_vr.setPixelColor(...).
Es gibt Programmiersprachen, bei denen alles ein Objekt ist. Ich glaube z.B. Python oder vielleicht sogar JavaScript. In dem Fall kann man sogar etwas hinschreiben wie
Code:
2.add(5);
Bei C++ ist das aber nicht der Fall. Hier gibt es Objekte und Werte. Das kommt wahrscheinlich daher, dass (Ansi) C eine Untermenge von C++ sein soll. Die ganzen primitiven Datentypen, wie z.B. int, char etc. sind keine Klassen, sondern einfach nur Datentypen. Die Dinger haben keine Methoden. Deshalb weiß man sofort, dass sowas nicht gehen kann:
Code:
int k;
...
...   k.blabla() ...

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 23:03
Beitrag #5
RE: Probleme mit einer Variablen
Okay, danke. Ich habe mal versucht ein Array zu erstellen wie ich es brauche und das entsprechende Feld eines Arrays im serial Monitor ausgeben zu lassen. Hier bin ich der Meinung dass es funktionieren sollte, tut es aber nicht. Der serial Monitor bleibt leer. Der richtige Datentyp "char" dürfte ja gegeben sein.
Code:
char stripe_1 = stripe_1;
char stripe_2 = stripe_2;
char stripe_3 = stripe_3;
char stripe_4 = stripe_4;
char stripe_5 = stripe_5;
char stripe_6 = stripe_6;
int num_stripes = 6;
char stripes[] = { stripe_1, stripe_2, stripe_3, stripe_4, stripe_5, stripe_6 };

void setup() {
  Serial.begin(9600);  
}

void loop() {
  for( int i=0 ; i < num_stripes ; i++){
   delay(1000);  
   Serial.print(stripes[i]);
   Serial.print("\t");
  }
}

Was mache ich falsch?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 23:56
Beitrag #6
RE: Probleme mit einer Variablen
Hi,
was genau erwartest Du von Deinem Coding ?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.12.2014, 08:38 (Dieser Beitrag wurde zuletzt bearbeitet: 05.12.2014 09:19 von scritch.)
Beitrag #7
RE: Probleme mit einer Variablen
(04.12.2014 23:56)Thorsten Pferdekämper schrieb:  Hi,
was genau erwartest Du von Deinem Coding ?
Gruß,
Thorsten

Guten Morgen Thorsten. Ich erwarte, dass per serial.print(); das jeweilige Feld des Arrays "stripes[]" ausgegeben werden. Also nacheinander im sekundentakt stripe_1, stripe_2, stripe_3...

Okay, so klappt es nun:
Code:
int num_stripes = 6;
String stripes[] = { "stripe_1", "stripe_2", "stripe_3", "stripe_4", "stripe_5", "stripe_6" };

void setup() {
  Serial.begin(9600);  
}

void loop() {
  for( int i=0 ; i < num_stripes ; i++){
   delay(1000);  
   Serial.print(stripes[i]);
   Serial.print("\t");
  }
}

Angewandt auf meinen "richtigen" Code funktioniert das aber wieder nicht.

Code:
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
#include <Adafruit_NeoPixel.h>

// Which pin on the Arduino is connected to the NeoPixels?

#define PIN_vr A0//
#define PIN_vl A1
#define PIN_hr 15
#define PIN_hl 14
#define PIN_h 16
#define PIN_v 10

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      8



Adafruit_NeoPixel stripe_1 = Adafruit_NeoPixel(NUMPIXELS, PIN_vr, NEO_GRB + NEO_KHZ800);//die bezeichnung der Stripes kann verändert werden. so kann man diese auch in einer Zählerschleife ansprechen
Adafruit_NeoPixel stripe_2 = Adafruit_NeoPixel(NUMPIXELS, PIN_vl, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripe_3 = Adafruit_NeoPixel(NUMPIXELS, PIN_hr, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripe_4 = Adafruit_NeoPixel(NUMPIXELS, PIN_hl, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripe_5 = Adafruit_NeoPixel(NUMPIXELS, PIN_v, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripe_6 = Adafruit_NeoPixel(NUMPIXELS, PIN_h, NEO_GRB + NEO_KHZ800);

String stripes[] = { "stripe_1", "stripe_2", "stripe_3", "stripe_4", "stripe_5", "stripe_6" };
int anzahl_polizei_blinker = 5; //Die Anzahl die eine Farbe bei einem Durchlauf blinken soll
int zeit_polizei_blinker = 55; //Die Zeit für einen Blinkvorgang, bis das Licht wieder gelöscht wird.
int zeit_strobe_an = 250;//Die Dauer, bis das Licht wieder an geht
int zeit_strobe_aus = 50;//die zeit bis das Licht wieder aus geht
int wc = 0;//Für Rainbow fading
int mode = 0;
int num_stripes = 6;

int rot = 3;
int gruen = 20;
int blau = 10;
//------------------------------------------------------------------------------------------------
void setup() { //Beginn des Setups
  stripe_1.begin();
  stripe_2.begin();
  stripe_3.begin();
  stripe_4.begin();
  stripe_5.begin();
  stripe_6.begin();
  Serial.begin(9600);    // initalisierung der seriellen Schnittstelle  
}
//------------------------------------------------------------------------------------------------

void loop() {    //hauptschleife
   //#######################################manuelles Umschalten des Modes
  mode = 1;
  //#######################################
  Serial.print(mode);
  Serial.print("\t");
  
  switch(mode){
    //#############################################Case 1####################################################
    case 1:
      for( int i=0 ; i < num_stripes ; i++){
       for(int j=0; j < NUMPIXELS; i++){ //Schleife für einen normalen Ring mit einer Farbe.
         stripes[i].setPixelColor(j, stripes[i].Color(rot, gruen, blau)); // Setzt die Farbe eines Pixels an der aktuellen Position aus der Schleife - für den Blinker ist es orange
         stripes[i].show();
       }  
      }
      break;
}
}
Folgende Meldung erhalte ich:
test.ino: In function 'void loop()':
test:64: error: 'class String' has no member named 'setPixelColor'
test:64: error: 'class String' has no member named 'Color'
test:65: error: 'class String' has no member named 'show'
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.12.2014, 09:22
Beitrag #8
RE: Probleme mit einer Variablen
Natürlich nicht, Deine Stripes sollten Instanzen der Klasse Adafruit_Neopixel sein und nicht String. Mach es doch einfach so wie in meinem ersten Ciding-Vorschlag.
Außerdem empfehle ich Dir, Dich mal mit C++-Grundlagen zu befassen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ausschaltverzögerung bei einer PV Heizung Hans_Maulwurf 27 742 29.11.2016 23:38
Letzter Beitrag: georg01
  ArduinoDroid Probleme Brother Tak 1 206 10.09.2016 22:12
Letzter Beitrag: Brother Tak
  Innenwiderstand einer Batterie (Rundzelle 1,5V) Einsteiger94 2 206 24.07.2016 11:42
Letzter Beitrag: SkobyMobil
  Roboter-Bau Probleme blebbens 8 381 12.07.2016 07:35
Letzter Beitrag: Binatone
  Variablen over/underflow "deaktivieren" Scheams 6 225 23.06.2016 16:36
Letzter Beitrag: Scheams
  Probleme mit sprintf() und dtostrf() GMBU 11 818 22.06.2016 10:52
Letzter Beitrag: GMBU
  Makeblock mit Scratch programmieren- Probleme Keinen Schimmer 6 983 06.05.2016 18:34
Letzter Beitrag: arduinopeter
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 536 23.04.2016 10:26
Letzter Beitrag: rkuehle
  Programme vom UNO auf nano , mini Pro portieren Probleme anwo 19 1.178 17.04.2016 21:12
Letzter Beitrag: hotsystems
  I2C Ansteuerung einer MSM3 (elv mp3 Box) Voreifel 2 316 09.04.2016 17:56
Letzter Beitrag: Voreifel

Gehe zu:


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