Pixels.clear macht nicht was es soll

Hallo zusammen,
in meiner Freizeit versuche ich ein wenig mit einem Arduino UNO klar zukommen.
Im Moment sitze ich an einer Steuerung für LED-Streifen.

Ausgangsmaterial:
LED Streifen 5V 1 meter 144 LEDs
350 ohm Widerstand
Arduino UNO

Der Elektrische Aufbau

  • und - vom Arduino uno zum LED-streifen.
    D9 vom Arduino UNO zum Widerstand und vom Wid. zum Eingang des LED-Streifen.

Was soll passieren:

10 Pixel vom LED-Streifen sollen der Reihe nach angehen.
Danach sollen alle LEDs mit pixels.clear() gelöscht werden
und im Anschluß soll dann alles von vorn beginnen.
Damit man sieht, was passiert, habe ich Pausen von 300ms
eingefügt.

Was tatsächlich passiert:

Die LEDs laufen bis zum 10. Pixel durch aber beim Löschen
bleibt der ersten Pixel an. Ich kann diesen nur löschen,
wenn ich die auskommentierten Zeilen aktiviere.

Erste Frage:
pixels.clear() soll den Angaben nach alle LEDs löschen.
Warum wird die erste LED nicht gelöscht?

Zweite Frage:

Gibt es eine Möglichkeit, beim Einschalten erst alle LEDs
zu setzen und erst danach mit pixels.show() zu aktivieren?

Ich bin für jede Hilfe Dankbar.

Pittiplatsch

#include <Adafruit_NeoPixel.h>

#define PIN 9                                                                           
#define NUMPIXELS 10                                                                    
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);       

int pause=300;                                                                            
byte H=3;                                                                                

void setup() 
{
 pixels.begin();                                                                          
}

void loop() 
{
 pixels.clear();
/*
 pixels.setPixelColor(0, pixels.Color(0,0,0));       // löscht erste LED wenn Aktiviert                                  
 pixels.show();
*/
 delay (pause);
 for (int a = 0; a < NUMPIXELS; a++)
 {
  pixels.setPixelColor(a, pixels.Color(0,0,H));                                           
  pixels.show();
  delay (pause);
 }
}

Nicht wirklich, denn es löscht nur den Speicher. Alleine pixels.show(); schiebt die Daten vom Speicher raus zu den Pixeln.

Falsche Reihenfolge im Ablauf.

Ja.

Probiere mal dies:

#include <Adafruit_NeoPixel.h>

#define PIN 9
#define NUMPIXELS 10
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 300;
byte H = 30;

void setup()
{
  pixels.begin();
  pixels.fill(0x200000);
  pixels.show();
}

void loop()
{
  delay (pause);
  for (int a = 0; a < NUMPIXELS; a++)
  {
    pixels.setPixelColor(a, pixels.Color(0, 0, H));
    pixels.show();
    delay (pause);
  }
  pixels.clear();
  pixels.show();
}

Besser?

pixels.show() überträgt den "Bildspeicher" zum WS2812-Streifen.
Du kannst den "Bildspeicher" mittels
"pixels.setPixelColor(a, pixels.Color(0,0,H)); "
füllen.
EIn LED kann gelöscht werden indem einfach mit 0,0,0 geladen wird.

Eine FOR schleife die einfach alle LED auf 0,0,0 setzt braucht nicht lange.

In Deinem Sketch kann ich nichts erkennen das den beschriebenen Effekt erklährt.

byte H=3;

So Dunkel?

Danke für die schnelle Antwort, aber jetzt leuchtet nur der erste Pixel und weiter
passiert nichts.

Pittiplatsch

Hallo Uwe,
die Helligkeit war für den Test erst einmal ausreichend.
Und zum pixels.clear(); es werden ja alle LEDs bis auf die erste gelöscht.
Das Problem ist warum wird die erste nicht gelöscht?
Der von mir eingestellte Sketch macht ja Anfangs das was er soll jedoch nicht beim löschen.
Pittiplatsch

Ich habe das Programm korrigiert, bitte nochmal testen.

Hallo agmue,
die LEDs leuchten anfangs alle 10 in Rot, ändern sich dann der Reihe nach in Blau
und erst jetzt werden alle LEDs gelöscht. Der zweite durchlauf ist dann nur in Blau
und alle LEDs löschen sich dann wieder.
Aber ich war ja auch nicht faul und habe das Problem so gelöst;



#include <Adafruit_NeoPixel.h>

#define PIN 9                                                                           
#define NUMPIXELS 10                                                                    
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);       

int pause=300;                                                                            
byte H=3;                                                                                

void setup() 
{
 pixels.begin();                                                                          
}

void loop() 
{
 pixels.clear();
 pixels.show();
 delay (pause);
 for (int a = 0; a < NUMPIXELS; a++)
 {
  pixels.setPixelColor(a, pixels.Color(0,0,H));                                           
  pixels.show();
  delay (pause);
 }
}

Danke an alle Problem gelöst.

Ich hatte Dich verstanden, daß Du es so haben möchtest.

Das ist viel besser, als wenn ich es für Dich löse :smiley: