LED Panel - allen Pixeln gleichzeitig eine bestimmte Farbe zuweisen - GELÖST

Ich bin ein absoluter Neuling. Könnte mir bitte helfen?

Hardware: Arduino UNO R3; 2 x LED Panel mit 64 programmierbaren WS2812-LEDs

Die Bibliothek habe ich installiert und das LED-Panel läuft.

Funktion:
Wie kann ich zwei identische LED Panele auf folgende Weise steuern?

  • Beide Panele (mit je 64 Pixeln) sollen gleichzeitig eine bestimmte Farbe für 1000 ms anzeigen;
  • Bei beiden Panelen das Licht für 500 mx ausschalten;
  • Die ersten zwei Zeilen 10 Mal wiederholen;
  • Stopp;

Bitte, wenn möglich, den kompletten Code mit void setup() und void loop() angeben, sonst tu ich mir schwer.
Wenn ich das weiß, kann ich den Rest selber anpassen.

Danke!

Das was Du suchst, ist ein Dienstleister, der gegen Bezahlung Deine Arbeit macht.

Hier bekommst Du Hilfe zur Selbsthilfe, also zum lernen, wie man das selbst programmiert.

Gruß Tommy

Hallo,

Du könntest Dir ein paar Beispiele aus der Lib ansehen, welche Lib auch immer Du verwendest Die haben Setup und loop mit dinn, schon mal gut für Dich und laufen auch. Dann musst Du verstehen wie man einer einzelnen LED eine Farbe zuordnet. Je nach lib gibt es auch Methoden alle LED gleich anzusteuern, dazu Doku lesen. Den Rest bekommst Du dann selber hin.

Heinz

@TO: Welche Lib hast Du installiert (Link bitte).

Gruß Tommy

Wenn du die library von AZDelivery (U 64 LED Matrix Panel CJMCU-8x8 Modul für Raspberry Pi – AZ-Delivery) verwendest, ist bereits ein Beispiel dabei, bei dem jede LED durchgegangen wird und auf eine bestimmte Farbe gesetzt. (testcolors_16x32)
Wenn du dieses Beispiel einfach etwas umschreibst, so dass jeder LED einfach die gleiche Farbe zugewiesen wird, dann wäre das Panel einfärbig.

Das ganze müsste dann ungefähr so aussehen:

matrix.Color333 yourColor = matrix.Color333(r, g, b)

// Draw one color
  for(uint8_t x=0; x < 64; x++) {
    for(uint8_t y=0; y < 64; y++) {
      matrix.drawPixel(x, y, yourColor);
    }
  }

Ich konnte das jetzt natürlich nicht ausprobieren, aber so müsste das in etwa funktionieren.

Arduino_Junky:
Wenn du die library von AZDelivery (U 64 LED Matrix Panel CJMCU-8x8 Modul für Arduino und Raspberry Pi) verwendest, ist bereits ein Beispiel dabei, bei dem jede LED durchgegangen wird und auf eine bestimmte Farbe gesetzt. (testcolors_16x32)

Danke für eure Antworten.
@Arduino_Junky
Ich habe die Libaries von deinem LInk installiert, es gab auch dieses Beispiel (testcolors_16x32), aber ich konnte es nicht auf den Arduino laden. Fehlermeldung: exit status 1 - Error compiling for board Arduino Uno.
Kann es sein, dass da was nicht stimmt. Ich habe ja ein 8x8 Panel und kein 16x32 panel.
Aber ich konnte einen anderen Code zum Laufen bringen.
Mein LED-Panel von AZ-Delivery uns sieht so aus wie das von deinem Link und in deren Handbuch steht, man soll diese Library Adafruit_NeoPixel.h verwenden. Ich hoffe das ist richtig so, jedenfalls funktioniert es.

#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LIGHTS  64

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

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
    uint32_t low = strip.Color(0, 0, 0); 
    uint32_t high = strip.Color(25, 0, 0);
  
    // Turn them off
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, high);
        strip.show();
    }   
    delay(1);
    
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, low);
        strip.show();
    }   
    
     delay(100);
}

Alle LEDs schalten sich an und aus, aber die LEDs reagieren zu langsam für meine Bedürfnisse. Ich habe ein Video mit Slo-Mo aufgenommen, aber man sieht es auch deutlich mit freiem Auge.

Meine Frage, liegt die Ursache der langsamen Reaktion am Code, oder an der Hardware?
Falls es am Code liegt, wie kann man das beheben?

@Arduino_Junky: Könnte man deinen Code für mein 8x8 Panel verwenden? Wäre dann die Reaktionsgeschwindigkeit höher?

Oder liegt es womäglich an der Konfiguration? Die Stromversorgung läuft über Arduino und keine sonstigen Teile wie Mosfet in Verwendung.

Danke für eure HIlfe!

Hier ein Vedeo mit dem Blinken in Originalgeschwindigkeit.

Mit strip.setPixelColor() setzt Du die Farbe für jeweils eins der Pixel in Deinem Stripe. Die Bibliothek speichert diese Information, sie wird aber noch nicht an die LED übermittelt.
Die Übertragung der gesetzten Farben an alle LEDs erfolgt mit strip.show().
Wenn Du show() also innerhalb der Schleife nach jedem Setzen direkt aufrufst, wird jedesmal wenn Du nur eine Farbe änderst, der Zustand aller 64 LEDs übertragen. Das kostet Zeit.

   for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, low);
        // Nicht hier:
        // strip.show();
    }  
    // sondern hier für alle gemeinsam:
    strip.show();

@wno158 Danke, das war genau der richtige HInweis. Jetzt funktioniert es einwandfrei.
Es lag also nicht an der Hardware, oder an der Konfituration, sondern am Code. Danke!

Hier noch mal der Code für Anfänger wie mich, mit Kommentaren.

/* Mithilfe des Arduino-Forums erstellt */

/*
// Zur Nachahmung:
// 1. Adafruit_NeoPixel.h Bibliothek (Library) importieren.
// Daten Pin 8 verwenden oder in der Zeile "#define PIN 8" die Zahl 8 abändern, je nach verwendetem Pin
// Die zwei anderen Kabel bei GRN und bei 5V hineinstecken.
// In der Zeile "#define NUM_LIGHTS  64" die Zahl 64 entspricht der Anzahl der LEDs - bei Bedarf die Zahl anpassen
// Farbe abändern: In der Zeile "uint32_t high = strip.Color(5, 0, 0);" die Werte in der Klammer abändern (Rot, Grün, Blau) (Werte zwischen 0-255 verwenden)
// Blinkgeschwindigkeit in diesen zwei Zeilen zu ändern "delay(15);" (Wert in Millisekungen; 1000 = 1 Sekunde)
*/


#include <Adafruit_NeoPixel.h>    // 1. Adafruit_NeoPixel.h Bibliothek (Library) importieren.
#define PIN 8                     // Daten Pin 8 verwenden oder in der Zeile "#define PIN 8" die Zahl 8 abändern, je nach verwendetem Pin
#define NUM_LIGHTS  64            // Die Zahl 64 entspricht der Anzahl der LEDs - bei Bedarf die Zahl anpassen

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

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
    uint32_t low = strip.Color(0, 0, 0); 
    uint32_t high = strip.Color(5, 0, 0);  // Hier die Lichtfarbe abändern. (Rot, Grün, Blau) (Werte zwischen 0-255 verwenden)
  
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, high);
    }   
    strip.show();
    
    delay(100); // Zeitdauer in der das Licht an ist.
    
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, low);
        // strip.show();
    }   
    strip.show();
        
     delay(100);  // Zeitdauer in der das Licht aus ist.
}

Wenn Du show() also innerhalb der Schleife nach jedem Setzen direkt aufrufst, wird jedesmal wenn Du nur eine Farbe änderst, der Zustand aller 64 LEDs übertragen. Das kostet Zeit.

Zur Zeit.
Das Protokoll der Datenübertragung ist folgendermaßen definiert. Am Anfang ein mindestens 50µS langer Impuls und dann 1 Bit alle 1,25µS (800kHz) bei 64 Pixel sind das 64LED * 24 bit*1,25µS + 50µS = 1970µS also ca 2mS. Wenn Du das nicht einmal machst sonder 64 mal ist die Zeit die 64 Pixel ca 126mS, also nur ca 8 mal pro Sekunde.
Der Unterschied ist ca 2mS (nicht wahrnehmbar, das scheint gleichzeitig) und 126mS was eine merklichen Schweif ergibt.

Grüße Uwe

scharfet:
Es lag also nicht an der Hardware, oder an der Konfituration, sondern am Code. Danke!

Das passiert bei programmierbaren Teilen schon mal öfters. :wink: :wink: :wink:
Grüße Uwe

@noiasca Danke für den Hinweis. Wenn ich dich richtig verstanden habe ist es möglich die Farbe im void setup() zu definieren. Ich habe es mir angesehen, aber ich konnte es noch nicht erstehen.

Könntes du mir sagen wie ich den Code abändern müsste, um die LED-Farbe nur einmal zu definieren?