Serial.print Fehler, brauch Hilfe

Hallo erst mal an alle hier und Grüße aus dem Lausitzer Seenland.

Ich habe ein biss´l Erfahrung mit Bascom und mal im Ansatz mit C.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 7

Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);

void setup() {

  Serial.begin(9600);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  rainbow(5);

}


void rainbow(uint8_t wait) {
  uint16_t i, j;
  long c=0;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(i+j));
    }
    strip.show();
    // inhalt von wheel anzeigen
    c=Wheel;
    Serial.print(c);
    delay(wait);
  }
}

// farben werden berechnet
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Das ist der code der bis auf die Ausgabe auf dem Monitor auch läuft.

Mein Problem ist die Umwandelung der “Wheel”-Var so das ich deren Wert im Monitor sehe.

Diese Fehelrmeldung kommt:

C:\Users\mobil\Documents\Arduino_1xWS\strandtest_1\strandtest_1.ino:33:6: warning: invalid conversion from ‘uint32_t ()(byte) {aka long unsigned int ()(unsigned char)}’ to ‘long int’ [-fpermissive]

c=Wheel;

^

Aber da steh ich irgend wie auf´m Schlauch.

Wheel ist keine Variable, die Du zuweisen kannst, sondern eine Funktion, welcher Du eine Variable vom Datentyp byte übergeben musst. quasi: c=Wheel(var);

Der Wert von Wheel ist ein Zeiger auf die Funktion Wheel().

Gruß Tommy

Danke. das ging schnell.

Jetzt zeigt er mir was an , 16515840. Das ist doch aber der wert von WheelPos ?

Ich wollte mir aber die Werte der Einzelnen Farben anzeigen.

Jetzt zeigt er mir was an , 16515840. Das ist doch aber der wert von WheelPos ?

-->Offensichtlich nicht... Habe gerade Adafruits Seite dazu überflogen, diese Zahl ist ein Wert, der für eine Farbe steht, und mithilfe der Bibliothek auch für die Farbzuweisung genommen werden kann. Wenn Du die einzelnen RGB-Farbwerte möchtest, dann musst Du entweder diesen Wert aufschlüsseln oder die Wheel()-Funktion entsprechend anpassen.

Das komische dabei ist aber die LED ändert die Farbe. Aber dieser wird im gleich angezeigt. :confused:

Die Color()-Funktion packt nur die Farbwerte in einen einzelnen Wert von 32 Bit bzw. 4 Byte. Im ersten Byte steht der B-Wert, im zweiten der G-Wert, im dritten der R-Wert (im höchsten Byte theoretisch den W-Wert, aber der trifft hier nicht zu)... kann man hier nachsehen, Zeile 1917.

Wheel() schaut also, wo das Rad steht, berechnet daran den aktuellen Farbwert, und gibt diesen an setPixelColor() in der for()-Schleife wieder, da wird dann die Farbe sozusagen auf das LED-Pixel gebracht.

Die Frage ist nun, was genau Du erreichen möchtest? Er berechnet für jedes Pixel einen eigenen Farbwert, also musst Du die Ausgabe in der for-Schleife machen. Entweder indem Du nach strip.setPixelColor(i, Wheel(i+j)); noch einmal Wheel(i+j) aufrufst und den Farbwert dann in die RGB-Werte aufschlüsselst, oder indem Du in die Wheel()-Funktion gehst, in den If-Anweisungen die RGB-Werte berechnest und zwischenspeicherst, am Ende der Funktion die RGB-Werte ausgibst und schließlich mit strip.Color() an return gibst.

Das habe ich verstanden, es wird ja ein serieller Byte Datenstrom zur Led gesendet. Aber wie nehme ich diesen Color nun aus einander ? Ein wenig Hilfe wär gut.

daja64:
Hallo erst mal an alle hier und Grüße aus dem Lausitzer Seenland.

Ich war schon mal in Bad Muskau bei Herrn Pückler und bin durch seinen Park geradelt.

daja64:
Aber wie nehme ich diesen Color nun aus einander ?

Beispielsweise so:

   for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(i + j));
      a = Wheel(i + j);
      c = a >> 16;
      if (c < 16) Serial.print('0');
      Serial.print(c, HEX);
      Serial.print(' ');
      c = (a >> 8) & 0xFF;
      if (c < 16) Serial.print('0');
      Serial.print(c, HEX);
      Serial.print(' ');
      c = a & 0xFF;
      if (c < 16) Serial.print('0');
      Serial.println(c, HEX);
    }

Ausgabe:

FF 00 00
FC 03 00
F9 06 00
F6 09 00
F3 0C 00
F0 0F 00
ED 12 00
EA 15 00
E7 18 00
E4 1B 00
E1 1E 00
DE 21 00
DB 24 00

Hier rächt sich dass die Library nicht wie FastLed ein struct für die Farbe hat dass diese Konvertierung übernimmt. Nicht schön gemacht

Super .Danke. Den code nehm mal auseinander. Jetzt habe ich erst mal wieder was zum üben