Go Down

Topic: Wieviel LEDs sind für ein Lauflicht möglich ? (Read 2553 times) previous topic - next topic

Aceli

Gut,

Ich bin nur am verzweifeln wie ich alle gleichzeitig aufhelle....... ich bekomme das nicht hin und hatte gehoft, jemand könnte mich auf die richtige spur bringen

postmaster-ino

Hi

Der Funktion FadeInOut() wird genau diese eine LED übergeben, Die eben dann hoch und wieder runter fadet.
In case '3' wird in 4 FOR-Schleifen jeweils 'die nächste LED' EINZELN an diese Funktion übergeben.
Und genau in dieser Funktion wird genau die übergebene LED hoch und wieder runter gedimmt.
... blockierend ...

Wenn Du in case '3' rein schreibst, daß die LED an Pin 13 toggeln soll, wird dort genau Das passieren.

Du möchtest in case '3' eine andere Funktion aufrufen, eben Eine, Die ALLE LEDs hoch und wieder runter fadet - dafür musst Du verstehen, wie jetzt die einzelne LED die Farbe zugewiesen bekommt - DAS münzt Du um auf ALLE LEDs.
Dann hast Du Es geschafft, daß zumindest Alle LEDs gleichzeitig hoch und runter faden - halt so oft, wie Du LEDs hast (= die FOR-Schleifen in case '3').
Nun wirfst Du die FOR-Schleifen raus, nimmst noch die LED-Nummer aus dem Funktionsaufruf raus (auch in der Funktion, sonst gibt's Mecker vom Kompiler) und hast in case '3' ein hoch/runter dimmen aller LEDs.

Das 'auf die richtige Spur helfen' versuchen wir hier gerade Alle.
Nur soll's halt eine Hilfe zur Selbsthilfe werden und nicht ein Code, Den Du per C&P als Dein jetziges Allheilmittel einbindest - Du sollst (Du MUSST) den Kram schon verstehen - alleine, um selber Änderungen dran auszuführen - kann ja nicht das Ziel sein, daß Du beim nächsten Stripe, Der eben 2 LEDs länger ist, hier wieder aufschlägst um Dir einen Code abzuholen, Der 2 LEDs mehr bedient - Das soll nicht das Ziel sein!

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Aceli

Danke.

ich hatte das so gedacht: und getestet . aber leider meckert er im zweiten teil bei "  strip.setPixelColor(, r, g, b);  "

Code: [Select]

 case 3:
      FadeInOut(0xff, 0xff, 0xff);
   
      break;
    default:
      lichtmodus = 0;
      Serial.print(F("Neuer Lichtmodus: "));
      Serial.println(lichtmodus);
  }
}

void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 0; k < 256; k = k + 1) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    strip.setPixelColor(r, g, b);
    if (!ohneVerzoegerung) strip.show();
    verzoegerung(INTER_FADE_DELAY);
  }

  for (int k = 255; k >= 0; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    strip.setPixelColor(r, g, b);
    if (!ohneVerzoegerung) strip.show();
    verzoegerung(INTER_FADE_DELAY);
  }
}


Hab die anderen Farben rausgenommen weil mir weiß reichen würde.

Tommy56

Und was meckert er?

Wir können das nicht nachvollziehen, da Du immer nur ein Fragment postest.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Aceli

da hast du vollkommen recht, werde ich gleich nachreichen. Hatte ich vergessen zu sagen. Kann aktuell nicht regelmäßig ran an den Nano

postmaster-ino

Hi

setPixelColor() verlangt ja auch nach vier Parametern - die Pixel-Nummer, Welche nun eine andere Farbe bekommen soll, will die Methode auch haben.
Du möchtest dieses setPixelColor(Nr,r,g,b); in eine Schleife einwickeln, Die die Nr von 0 bis PixelCount-1 hoch zählt - denke ich.

Aber natürlich darfst Du auch selber nachdenken, warum etwas nicht funktioniert.
Einfach irgendwo irgendwas hintippen und hoffe, der Kompiler mach Das schon, ist nicht programmieren!

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Aceli

Ich habe mir jez noch mal das von Tweaking4all angeschaut. da ja dort was mit setALL steht....

habe dann meinen etwas umgeschrieben und eingefügt...

hier der Sketch.. Es funktioniert.

Code: [Select]

#include <Adafruit_NeoPixel.h>
#define N_LEDS 15
#define PIN     6

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

const byte tasterPin = 7;
int lichtmodus = 0;
bool aktTasterStatus, altTasterStatus, ohneVerzoegerung;
const byte potPin = A0;
uint32_t intervall;
int pos = 0, dir = 1; // Position, direction of "eye"

#define INTER_FLASH_DELAY 30
#define INTER_FLASH_COUNT 10
#define INTER_FADE_DELAY 10

void setup() {
  strip.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(F("Anfang"));
  intervall = analogRead(potPin);
  Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
  Serial.println(intervall);
}

void setFarbe (const byte n, byte r, byte g, byte b)
{
  for (byte i = 0; i < n; i++)
  {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }
}

void verzoegerung(uint32_t zeit)
{
  if (ohneVerzoegerung) return;
  uint32_t entprellMillis = 0, vorhin = millis();
  while (1)
  {
    uint32_t jetzt = millis();
    altTasterStatus = aktTasterStatus;
    aktTasterStatus = digitalRead(tasterPin);

    if ((aktTasterStatus != altTasterStatus) && (jetzt - entprellMillis >= 30))
    {
      entprellMillis = jetzt;
      if (!aktTasterStatus)
      {
        lichtmodus++;
        ohneVerzoegerung = true;  // bei einem Wechsel des Lichtmodus möglichst schnell weiter
        Serial.print(F("Neuer Lichtmodus: "));
        Serial.println(lichtmodus);
        break;
      }
    }

    if (jetzt - vorhin >= zeit)
    {
      break;
    }
  }
}

void loop()
{
  ohneVerzoegerung = false;
  verzoegerung(0);  // damit die Tasten immer abgefragt werden
  switch (lichtmodus)
  {
    case 0:
      intervall = analogRead(potPin);
      Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
      Serial.println(intervall);

      // Rather than being sneaky and erasing just the tail pixel,
      // it's easier to erase it all and draw a new one next time.
      for (uint16_t j = 0; j < N_LEDS; j++) strip.setPixelColor(j, 0);

      // Draw 5 pixels centered on pos.  setPixelColor() will clip any
      // pixels off the ends of the strip, we don't need to watch for that.
      strip.setPixelColor(pos - 1, 0x696969);
      strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
      strip.setPixelColor(pos + 1, 0x696969);
      if (!ohneVerzoegerung) strip.show();
      verzoegerung(intervall);

      // Bounce off ends of strip
      pos += dir;
      if (pos < 0) {
        pos = 1;
        dir = -dir;
      } else if (pos >= N_LEDS) {
        pos = N_LEDS - 2;
        dir = -dir;
      }
      break;
    case 1:
      for (uint16_t n = 0; n < N_LEDS; n++)
      {
        strip.setPixelColor(n, 138, 43, 226);
      }
      if (!ohneVerzoegerung) strip.show();
      break;
    case 2:
      for (byte n = 0; n < N_LEDS; n++)
      {
        setFarbe(N_LEDS, 0, 0, 255);     // alle blau
        if (!ohneVerzoegerung) strip.show();
        verzoegerung(INTER_FLASH_DELAY);
        setFarbe(N_LEDS, 0, 0, 0);       // alle aus
        if (!ohneVerzoegerung) strip.show();
        verzoegerung(INTER_FLASH_DELAY);
      }
      break;
    case 3:
   
      FadeInOut(0xff, 0xff, 0xff);
     
      break;
    default:
      lichtmodus = 0;
      Serial.print(F("Neuer Lichtmodus: "));
      Serial.println(lichtmodus);
  }
}

void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 0; k < 256; k = k + 1) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r,g,b);
    if (!ohneVerzoegerung) strip.show();
    verzoegerung(INTER_FADE_DELAY);
  }

  for (int k = 255; k >= 0; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r,g,b);
    if (!ohneVerzoegerung) strip.show();
    verzoegerung(INTER_FADE_DELAY);
  }
}
void setAll(byte red, byte green, byte blue)
{
  for(int i = 0; i < N_LEDS; i++ )
  {
    setPixel(i, red, green, blue);
  }
strip.show();
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}


Alle LEDS werden nun gleichmäßig hoch und runter gedämmt..

es ist bestimmt noch nicht wirklich schön und im sonne des Erfinders.
Ich werde mich nun damit beschäftigen wieso es auf einmal geht und schauen ob ich es verstehe und anpassen kann...

Dennoch danke ich euch viel Mals für die starken nerven für mich und die ganze Hilfe...


ach und @Tommy um dein Beitrag nicht umkommentiert zu lassen.
Hier die Fehlermeldung

Code: [Select]


Arduino: 1.8.7 (Mac OS X), Board: "Arduino Nano, ATmega328P (Old Bootloader)"

/Users/User/Documents/Arduino/lauflicht_mit_fade_falsch/lauflicht_mit_fade_falsch.ino: In function 'void FadeInOut(byte, byte, byte)':
lauflicht_mit_fade_falsch:136:32: error: no matching function for call to 'Adafruit_NeoPixel::setPixelColor(float&, float&, float&)'
     strip.setPixelColor(r, g, b);
                                ^
In file included from /Users/User/Documents/Arduino/lauflicht_mit_fade_falsch/lauflicht_mit_fade_falsch.ino:1:0:
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:206:21: note: candidate: void Adafruit_NeoPixel::setPixelColor(uint16_t, uint8_t, uint8_t, uint8_t)
   void              setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b);
                     ^
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:206:21: note:   candidate expects 4 arguments, 3 provided
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:207:21: note: candidate: void Adafruit_NeoPixel::setPixelColor(uint16_t, uint8_t, uint8_t, uint8_t, uint8_t)
   void              setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b,
                     ^
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:207:21: note:   candidate expects 5 arguments, 3 provided
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:209:21: note: candidate: void Adafruit_NeoPixel::setPixelColor(uint16_t, uint32_t)
   void              setPixelColor(uint16_t n, uint32_t c);
                     ^
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:209:21: note:   candidate expects 2 arguments, 3 provided
lauflicht_mit_fade_falsch:145:32: error: no matching function for call to 'Adafruit_NeoPixel::setPixelColor(float&, float&, float&)'
     strip.setPixelColor(r, g, b);
                                ^
In file included from /Users/User/Documents/Arduino/lauflicht_mit_fade_falsch/lauflicht_mit_fade_falsch.ino:1:0:
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:206:21: note: candidate: void Adafruit_NeoPixel::setPixelColor(uint16_t, uint8_t, uint8_t, uint8_t)
   void              setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b);
                     ^
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:206:21: note:   candidate expects 4 arguments, 3 provided
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:207:21: note: candidate: void Adafruit_NeoPixel::setPixelColor(uint16_t, uint8_t, uint8_t, uint8_t, uint8_t)
   void              setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b,
                     ^
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:207:21: note:   candidate expects 5 arguments, 3 provided
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:209:21: note: candidate: void Adafruit_NeoPixel::setPixelColor(uint16_t, uint32_t)
   void              setPixelColor(uint16_t n, uint32_t c);
                     ^
/Users/User/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h:209:21: note:   candidate expects 2 arguments, 3 provided
exit status 1
no matching function for call to 'Adafruit_NeoPixel::setPixelColor(float&, float&, float&)'



agmue

Abkürzung ohne setPixel() und setAll():

Code: [Select]
void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 0; k < 256; k = k + 1) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    for (int j = 0; j < N_LEDS; j++ ) strip.setPixelColor(j, strip.Color(r, g, b));
    if (!ohneVerzoegerung) strip.show();
    verzoegerung(INTER_FADE_DELAY);
  }

  for (int k = 255; k >= 0; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    for (int j = 0; j < N_LEDS; j++ ) strip.setPixelColor(j, strip.Color(r, g, b));
    if (!ohneVerzoegerung) strip.show();
    verzoegerung(INTER_FADE_DELAY);
  }
}
(ungetestet)
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

postmaster-ino

Hi

Sehe ich jetzt erst ... warum sind r,g,b float?
Sämtliche diese Werte annehmenden Methoden wollen dort ein Byte haben.
Auch ist mir der Sinn hinter int für die Pixelnummer nicht ganz klar, wobei unsigned int keinen Speicher spart und bei Beiden wohl der Wertebereich nicht ausgeschöpft wird.
Ein unsigned int (oder byte bei der geringen Anzahl an Pixeln) hätte aber durchblicken lassen, daß Du verstanden hast, was Da abläuft.

Naja - Hauptsache: Es läuft. Verbessern kann man IMMER, traurig, aber wahr :)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

#114
Apr 22, 2019, 03:22 pm Last Edit: Apr 22, 2019, 03:23 pm by agmue
Sehe ich jetzt erst ... warum sind r,g,b float?
Weil sonst die Berechnung fehlschlägt. Bei Ganzzahlenarithmetik muß man die Reihenfolge in beispielsweise
r = k * red / 256; ändern.

Ein unsigned int (oder byte bei der geringen Anzahl an Pixeln) hätte aber durchblicken lassen, daß Du verstanden hast, was Da abläuft.
Da k negativ werden kann, dürfte das nicht so einfach zu machen sein.

Die Funktion stammt aus dem vom TO verlinkten Beispiel und tut erstmal, was sie soll.

Naja - Hauptsache: Es läuft. Verbessern kann man IMMER, traurig, aber wahr :)
Eben. Wer die Schönheit des Programmierens erlernen möchte, sollte dieses Thema sowieso meiden. Auch Mephisto will mal seinen Spaß haben :smiley-twist:

Möchtest Du dem TO Ganzzahlenarithmetik und den Wertebereich von Variablen erläutern wollen, so werde ich Dich nicht davon abhalten. Nur richtig sollte es bitte sein.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

postmaster-ino

Hi

Den Umstand, daß k negativ werden kann, halte ich für einen Fehler der Programmierer des Beispiel, da 0 für r/g/b wohl 'Nichts' bedeuten soll - ein negativer Wert ergibt hier keinen Sinn - oder Dieser ist mir noch nicht unter gekommen.

Sollte ich Mist schreiben, gibt's hier ja durchaus Leute, Die Das korrigieren können :) (und werden)
Wegen int: Nur, weil überall (auch in den Beispielen) mit delay() um sich geworfen wird, macht's Das nicht besser - Gleiches gilt für int.

MfG

PS: Mit Mephisto wird mir von Wikipedia ein Sprengkopftyp(siehe Taurus (Marschflugkörper)#Taurus KEPD-350) vorgeschlagen ... Du machst mir Angst ;)
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

#116
Apr 22, 2019, 05:38 pm Last Edit: Apr 22, 2019, 05:39 pm by agmue
PS: Mit Mephisto wird mir von Wikipedia ein Sprengkopftyp(siehe Taurus (Marschflugkörper)#Taurus KEPD-350) vorgeschlagen ... Du machst mir Angst ;)
Ich bin da eher bei der Literatur, genauer beim Mephistopheles in Goethes Faust. Ich bin sozusagen durch die Einführung der Funktion verzoegerung als Ersatz für delay mit dem Programmierteufel einen Pakt eingegangen, in der Hoffnung, den TO auf diesem Umweg zum Verständnis von millis bringen zu können. Möglicherweise hat Gott ja den Teufel erfunden, damit wir Menschen Gott überhaupt sehen können. Ohne Schwarz können wir Weiß nicht erkennen. Wer solch einen Pakt eingeht, der schaut nicht auf die von Dir erwähnten Nebensächlichkeiten.

:smiley-twist:  :smiley-twist:  :smiley-twist:

Grundsätzlich stimme ich Dir aber durchaus zu. Allerdings würde ich die Vermittlung an den TO eher an das Ende des Themas verlagern. Aber wenn Du es jetzt für besser hältst, laß Dich bitte nicht aufhalten.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Aceli

Nabend.   Vielen Dank @agmue.
dein Sketch ausschnitt ohne setAll und SetPixel funktioniert..dennoch schaue ich mir mal an wieso weshalb.
mir ist nur eben aufgefallen das sie noch ab und an flackern aber die korrekte Verkabelung folgt und wird dann nochmal alles getestet.


eine Einschätzung wäre noch super. im Case 0 ist ja die Knight Rider Funktion.
Diese lässt die LEDS ja quasi hart nachrücken. Kann man den vorhanden Sketch im Case 0 noch so umschreiben das quasi die 1 und 3 Led gedämmt wird. quasi ein weichen Übergang machen?

oder sollte ich dann nach einen ganz anderen Sketch suchen weil dieser das nicht vorsieht?

postmaster-ino

Hi

Mittlerweile müsstest Du doch halbwegs mitbekommen haben, wie die WS2812B angesteuert werden.
Wenn Dir der Ablauf in case '0' nicht zusagt - ändere Ihn.
Wenn Du zwei/drei/zwölf Dimmstufen dazwischen haben möchtest, dann packe Die dazwischen.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up