Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Excel für WS2812 RGB-LED-Array-Animationen

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
ws2812 8x8 RGB-LED-Matrix
× 1
Überbrückungsdrähte männlich/weiblich
Meine drei sind Black-Gnd, Red-5v und Green-Data
× 3
9-V-Batterie (generisch)
× 1
9V zu Barrel Jack Connector
× 1
Male-Header 5 Position- 1 Row- Long (0,1" )
Nur drei Pins sind erforderlich
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)
Lötdraht, bleifrei

Über dieses Projekt

Nachdem ich überprüft hatte, dass es Online-Unterstützung gab, bestellte ich eine WS2812 8x8 RGB-LED-Matrix in der Erwartung, dass sie als XY-Koordinatenstruktur adressiert wird, nicht als Daisy Chain (Band) von 64 LEDs, die in 8 Reihen von 8 gewickelt sind!

Eine Suche nach „WS2812 Led animation“ ergab wenig, was ich sofort und leicht verstehen konnte. Als ich ein von Kevin Darrah produziertes YouTube-Video fand, adressierte er eine 16 x 16-Matrix (256 LEDs verkettet), als wäre es ein XY-Koordinatensystem.

Sein Excel-Dienstprogramm kompilierte Textcode zum Kopieren/Einfügen in seine Skizze, in dem sich alle erforderlichen Funktionen befanden; es müssen keine Bibliotheken importiert werden.

Wenn er Zellen innerhalb seines Dienstprogramms auswählte und RGB-Werte hinzugefügt wurden, wurden sie ohne Unterscheidung auf diese ausgewählten Zellen angewendet; nicht das, was ich wollte, also habe ich es neu gestaltet und umgebaut. Das bedeutete auch, dass ich seine Skizze für 8x8-Kompatibilität ändern musste.

Als ich mehr von meinem WS2812 verlangte, musste ich meine Excel-Anwendung LED_Utility.xlsm ständig ändern.

Die Excel-Arbeitsmappe bietet jetzt:

  • LED-RGB-Eigenschaften müssen individuell angesprochen werden.
  • Dynamisches Ändern dieser Eigenschaften durch Programmierung.
  • XY-Verlagerung dieser Eigenschaften, um Bewegung zu simulieren.
  • Adressierbare RGB-Werte sowie Änderung der XY-Position.
  • Sowohl 8x8 als auch 16x16 LED-Adressierung.
  • Eine kleine Sammlung von RGB-Werten zum schnellen Nachschlagen.

Mein Ziel ist es insbesondere:

  • Entwickle ein rotes hohles Quadrat und schalte es ein und aus.
  • Überziehe ein anderes Quadrat mit einer Schicht in einer anderen Farbe und wechsle zwischen ihnen ab.
  • Bauen Sie das Rote Quadrat an und spielen Sie damit.
  • Überlegen Sie sich Gedanken zur Verwendung von Funktionen zum Halten von Anzeigeelementen; Ich baue eine verblassende Spirale.
  • Erstelle ein Design, bei dem Farben ein- und ausblenden.
  • Bringen Sie Bewegung in das Design.
  • Adressieren Sie 16x16-Arrays.

Ich bin mir bewusst, dass Programmierkenntnisse Probleme verursachen. Ich habe einige Anleitungen angeboten, schlage jedoch vor, Nachforschungen anzustellen oder jemanden zu bitten, der Sie persönlich beraten könnte.

AN BEGINNEN

Montieren Sie die Hardware

Wenn Ihre Matrix ohne Header-Pins geliefert wird, löten Sie die Bank der Header-Pins an der Rückseite der Matrix an der unteren Stelle an (DIN, +5V, GND). Verbinden Sie den DIN-Pin mit Pin 8 auf der rechten Seite des Arduino und die anderen beiden mit passenden Stellen auf der anderen Seite der Platine.

Für dieses Board und das Dienstprogramm ist XY (0, 0) oben links.

Das Excel-Dienstprogramm

Öffnen Sie die Datei LED_Utility.xlsm. Sie sehen drei Blätter, „Eight“, „Sixteen“ und „ColMap“.

Das letzte ist ein kleines Beispiel von RGB-Codes, die als Referenz bereitgestellt werden.

Ich habe LED_Utility.xlsm auf schreibgeschützt gesetzt, um sowohl das Überschreiben zu verhindern als auch die Verwendung von „SaveAs“ zu fördern, um eine Datei für eine mögliche Wiederverwendung aufzubewahren. Einige andere "Fehlerfallen" wurden ebenfalls eingebaut.

Wählen Sie das Arbeitsblatt „Acht“ aus.

Beachten Sie, dass das rechte Raster mit Nullen gefüllt ist. Das ist wichtig, da die Skizze keine Nullwerte akzeptiert.

Es gibt vier Schaltflächen, wie oben gezeigt (auf „Sechzehn“ sind sie wahrscheinlich rechts neben dem Bildschirm, eine unter der anderen, funktionieren aber wie unten beschrieben).

Textcode erzeugen:

„Anzeigen“ zeigt das RGB der Werte im linken Raster an. Es verarbeitet nur Werte von 0-255. Bei Werten über 255 oder anderen Variablen wird eine Warnung angezeigt.

„Var Map“ akzeptiert Zahlen und Variablen, bietet jedoch keine Anzeige.

„Wrap Map“ ist zweistufig. Es akzeptiert RGB-Werte, die normalerweise für eine „Show“-Anzeige eingegeben werden. Es fügt dann eine Modulusfunktion für die Sketch-Codierung hinzu, um einen Überlauf der Matrix zu ermöglichen. Zweitens können Variablen hinzugefügt werden, müssen aber später in der Skizze programmiert werden. Darauf gehe ich hier nicht ein.

Jeder generiert "roten" Text unter den Rastern (in beiden Arbeitsblättern), der mit einer Skizze kompatibel ist, die ihn akzeptiert.

„Clear“ macht offensichtlich beide Raster ungültig.

Diese werden alle später beschrieben.

Wenn Sie mit der arbeiten Excel-Dienstprogramm, ich empfehle, dass Sie Datei/Speichern unter... verwenden, nachdem Sie Ihren Code generiert, damit Sie Ihr Design nicht irgendwann neu erstellen müssen anderer Punkt, und vor allem, wenn das Design einigermaßen komplex ist. Auch Ihr ursprüngliches LED_Utility.xlsm wurde auf schreibgeschützt gesetzt, um es davor zu schützen überschrieben.

Die Skizze

Der Code wird angeboten unten mit warnhinweis mit einer schreibgeschützten Eigenschaft speichern.

Öffnen Sie die Arduino IDE und laden Sie die Skizze ‚LED_Arduino.ino‘.

Sie werden sehen, dass:

  • Zeile 3 definiert den verwendeten Arduino-Pin. Dieses Set als Pin 8.
  • Zeile 4 definiert die LED-Einheiten auf der Platine. Das sind 64.
  • Zeile 5 multipliziert diese Zahl jedoch mit 3, um den RBG-Zähler zu berücksichtigen, also 192.
  • Zeilen 8, 10 und 25 definieren die verwendeten Funktionen.

Zwischen den Zeilen 3 und 19 wurde der Originaltext geändert, aber Sie können ihn bearbeiten, um eine 16x16-Matrix zu adressieren. Das heißt, ich habe LED_Ardino16.ino in der Software bereitgestellt und LED_Utility.xlsm wird es aufnehmen.

Häufig empfehle ich Ihnen, die ‚LED_Arduino.ino‘ zu öffnen und dann mit einem Namen auf „Speichern unter“ zu gehen. Dadurch wird sichergestellt, dass ‚LED_Arduino.ino‘ unverändert bleibt, wenn Sie die entsprechende Eigenschaft nicht auf ‚Schreibgeschützt‘ gesetzt haben. [Ich habe festgestellt, dass für meine neu erstellte Datei immer noch die schreibgeschützte Eigenschaft festgelegt ist; geben Sie das frei, um zukünftige Bearbeitungen und Speicherungen sicherzustellen].

Gleichzeitig muss bei einer neu erstellten Skizze wahrscheinlich einer oder beide der Port und das Board neu definiert werden; Es wird eine Fehlermeldung angezeigt, die jedoch möglicherweise nicht sofort klar ist.

Projekt 1

Laden Sie die LED_Arduino.ino in die Arduino IDE und speichern Sie sie als Red_Square (ino wird automatisch hinzugefügt).

Zunächst schlage ich vor, ein 3x3 rotes Quadrat zu bauen und fügen Sie diesen Code in Zeile 40 der Skizze ein. Die Zellen N8, O8, P8, N11, P11, N14, O14 und P14 enthalten den Wert 255.

Wenn der rote Text von LED_Utility,

mapLEDXY(2,2,255,0,0);mapLEDXY(2,3,255,0,0);mapLEDXY(2,4,255,0,0);mapLEDXY(3,2,255,0,0); mapLEDXY(3,4,255,0,0);mapLEDXY(4,2,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0); 

in Zeile 40 kopiert wird, wird der Text darunter natürlich nach unten verschoben.

Wenn Sie die Skizze auf Ihren Arduino hochladen, schaltet Ihre Matrix dieses Quadrat ein und aus.

Bevor Sie fortfahren, überlegen Sie:

  • Beide Raster löschen.
  • Ändere einige Farben innerhalb dieses Quadrats.
  • Fügen Sie ein andersfarbiges Quadrat um das Original hinzu.

Projekt2

Ich schlage vor, dass Sie die Skizze Red_Square.ino öffnen und als Colour_Sq speichern (‚.ino‘ wird automatisch hinzugefügt), um zu verhindern, dass Red_Square.ino überschrieben wird.

Wenn Colour_Sq.ino in die IDE geladen ist, gehen Sie zu Red_Square im Dienstprogramm und ändern Sie die mittleren Quadrate. MakeO8, O10, O14 und O16 ‘255’. N11 und P11 sind ‚0‘, aber N12 und P12 sind ‚255‘. Drücken Sie auf „Anzeigen“.

Nachdem Sie den neuen Code in hinzugefügt haben, erwarte ich Zeile 47 in der IDE, müssen Sie diesem Codeblock folgen:

RGB_update(-1, 0, 0, 0);delay(1000);clearLEDs();RGB_update(-1, 0, 0, 0); Verzögerung(1000); 

Beachten Sie, dass Sie den Verzögerungswert nach Belieben ändern können; 1000 entspricht 1 Sekunde.

Projekt3

Laden Sie Red_Square.ino neu und speichern Sie es als Grow.

Erstellen Sie das rote Quadrat im Dienstprogramm neu. Um dieses Quadrat fügen Sie Werte Ihrer Wahl hinzu, um einen Rahmen zu erstellen. Sie können zwischen 0 und 255 liegen, aber niedriger als 32 können sehr schwach sein. Dies ist meine Kreation in ‚LED_Utility.xlsm‘:

Löschen Sie nun die Werte für das innere rote Quadrat und drücken Sie „Anzeigen“. Kopieren Sie den generierten Code in Zeile 47 in der IDE und kopieren Sie danach die Zeilen 42 bis 46. Laden Sie auf den Arduino hoch, um abwechselnd ein inneres rotes Quadrat und dann eins, das von verschiedenen Farben umgeben ist, zu wechseln.

Versuchen Sie, auf eine andere Grenze zu erweitern, wenn Sie möchten.

Projekt4

Ihnen ist vielleicht aufgefallen, dass es beim Hinzufügen von Code zu „Loop“ dazu kommt, dass er langwierig wird und möglicherweise später schwierig zu bearbeiten ist.

Hier baue ich eine Spirale.

Das Bild stammt aus der Arbeitsmappe „spir5.xlsm“. Es ist der Höhepunkt von 4 früheren Arbeitsbüchern.

„spir1.xlsm“ war die Mitte mit hellen (255) Blöcken, „spir2.xlsm“ verwendete die Werte des inneren 4x4-Quadrats, wobei „spir3.xlsm“ der 27-Quadrat-Block war usw. In jeder Phase habe ich den Code kopiert zu meiner Skizze, aber nicht zu "Schleife".

Stattdessen habe ich 5 void-Funktionen unterhalb von „loop“ erstellt und sie innerhalb von „loop“ referenziert:

Void loop(){Sp1();Sp2();Sp3();Sp4();Sp5();clearLEDs();delay(1000);} 

Meine erste Funktion, void Sp1(), ist:

 void Sp1(){mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255, 0,0);RGB_update(-1, 0, 0, 0);delay(100);clearLEDs();RGB_update(-1, 0, 0, 0);delay(10);} 

Jede nachfolgende Funktion ist mit Ausnahme der beiden Zeilen von „mapLEDXY…“ gleich.

In diesem Beispiel mag es trivial erscheinen, vorzuschlagen, „spir4.xlsm“ zu öffnen, um die Farben der äußeren Spitzen zu bearbeiten, um eine dedizierte Funktion zu bearbeiten, anstatt innerhalb der „Schleife“ zu bearbeiten.

An der Grenze zum Lächerlichen, angenommen, Sie möchten die Buchstaben des Wortes „MISSISSIPPI“ nacheinander nacheinander anzeigen. Es gibt 11 Zeichen, was bedeutet, dass 77 Codezeilen für 'void loop()' zu verarbeiten sind. Wenn Sie sich entscheiden, das „S“ zu ändern, müssen Sie 4 Änderungen vornehmen. Das Wort enthält nur 4 Zeichen. Daher ist es sinnvoll, für jeden eine Funktion zu erstellen und diese entsprechend aus „loop“ aufzurufen.

Projekt5

Dieses Projekt berücksichtigt eine weitere Funktion des LED_Utility, „Var Map“. Hier werden Variablen eingeführt und daher sind einige grundlegende Programmierkenntnisse erforderlich.

Die Syntax „For Loop“ wird ebenso verwendet wie die Bedingung „If“.

Das „für“ wird verwendet, um einen RGB-Wert zu erhöhen oder zu verringern, wie zum Beispiel:

for (int r=0; r<=256; r++) {} orfor (int r=255; r>=0; r--) {}  

„Wenn“ ändert das Verfahren nach Bedarf.

Beginnen wir einfach, und ich meine einfach.

Erstellen Sie ein 2x2 rotes Quadrat in der Mitte von LED_utility und "Show", und hier ist der Code:

mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0);  

Ändern Sie nun alle 255 Werte in ‚r‘. Drücken Sie auf „Anzeigen“ …. Oooow! Das mag es nicht. Das ist in Ordnung, es ist ein Schutz, den ich hinzugefügt habe. Drücken Sie „Var Map“ und überprüfen Sie den generierten Code:

mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0); 

die 255er wurden durch 'r' ersetzt.

Öffnen Sie in der IDE die archivierte LED_Arduino.ino und speichern Sie sie als "Änderungen".

Geben Sie in Zeile 40 ein:

for (int r=0; r<256;r++){}/// gefolgt von:for (int r=255;r>=0;r--){}  

Beachten Sie, dass nach jeder 'for'-Anweisung eine Leerzeile steht.

Fügen Sie in Zeile 41 Ihren Excel-Code ein:

mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0);folgen Sie dem mit:RGB_update(-1, 0, 0, 0);delay(50); 

Kopieren Sie nun denselben 4-zeiligen Codeblock und fügen Sie ihn in diesen zweiten „for“-Block ein.

Nach diesem „for“-Block fügen Sie unter dem „}“ „delay(200);“ hinzu. Das fand ich notwendig, damit meine Augen wissen, dass sich der zweite Block geschlossen hatte!

Beim Hochladen erhöht sich der rote Block auf volle Helligkeit und nimmt dann ab, schaltet sich aus und wiederholt sich dann.

Projekt6

Lassen Sie uns nun die „Wenn“-Bedingung verwenden.

Stellen Sie das vorherige rote Quadrat in LED_utility wieder her, umgeben Sie es jedoch mit Blöcken eines "Himmelblaus", indem Sie 255 sowohl für die G- als auch für die B-Werte verwenden. Verwenden Sie „Anzeigen“.

Lassen Sie die roten 255 in Ruhe, aber ändern Sie alle G 255 in ein "g" und die B 255 in ein "b",

und dann „Var Map“ drücken.

Laden Sie „LED_Arduino.ino“ neu in die IDE und speichern Sie als „FadeBorder“.

Jetzt werden wir einige Probleme haben. Wir haben zwei Variablen, 'g' und 'b', und jeder muss ein Wert zugewiesen werden. Sie müssen auch im Programm deklariert werden. Ich beabsichtige, das „g“ in einer „for“-Anweisung zu deklarieren, aber ich muss das „b“ früher in der Skizze deklarieren. In der Skizze in Zeile 5 ist die Deklaration BYTE RGB[192]. Darunter ‚int b=0;‘ eingeben.

Zur Erklärung kann man nicht zwei „for“-Schleifen verwenden, wie es später noch notwendig sein wird. Hier muss jeder „b“-Wert gleich dem „g“-Wert sein, der von der „for“-Schleife erzeugt wird.

Meine „Schleife“ ist wie folgt aufgebaut, jedoch ohne meinen Map-Code:

void loop() {delay(50);for (int g=0; g<256;g++){b=g;[Add Map Code here]RGB_update(-1, 0, 0, 0 );Verzögerung(50);}für (int g=255;g>=0;g--){b=g; [Hier Kartencode hinzufügen]RGB_update(-1, 0, 0, 0);delay(50);}} 

Beachten Sie, dass der B-Wert mit dem G-Wert mit der Anweisung „b=g;“ verknüpft ist. Der R-Wert bleibt statisch bei 255, während der Rand in der Helligkeit nach oben und unten verblasst.

Projekt7

Es ist jetzt an der Zeit, die „if“-Anweisung zu verwenden.

Erstellen und "zeigen" Sie Folgendes mit 255, wobei Variablen im rechten Raster erscheinen. Beachten Sie, dass in den Zellen, die an die roten Zellen angrenzen, ein winziges „L“ erscheint. Dadurch kann das Programm bei Bedarf die Kontrolle über diese Zellen übernehmen.

Dieses Mal blenden die LEDs grün und rot aus, bis der Wert 64 erreicht ist, und dann ändern sich diese Zellen in der Mitte zu gelb, wobei die Helligkeit der Platine weiter zunimmt. Dann wird der Vorgang umgekehrt.

Auch hier werde ich die Grundstruktur meiner „Schleife“ anbieten. Ich habe diese Skizze ‚FadeColourChange.ino‘ genannt.

void loop() { delay(50);for (int r=0; r<256;r++){g=r;if(g>64){ g=65; l=r;}[AddMap-Code hier]RGB_update(-1, 0, 0, 0); Verzögerung (50);}für (int r=255;r>=0;r--){if(r<65){g=r; l=0;}[MapCode hier hinzufügen]RGB_update(-1, 0, 0, 0);delay(50);}} 

Projekt8

Für dieses letzte Projekt werde ich die Farben nicht ändern, sondern Bewegung einführen; Ich habe einen Pfeil, der sich über das Spielbrett bewegt, aber von links wieder auftaucht.

Hier möchte ich nur Code mit „Show“ generieren.

Da ich möchte, dass sich der Pfeil von seiner aktuellen Position zu jeder nächsten Position bewegt, muss ich den „x“-Wert ändern.

Dies ist Code, der bei G29:G33 generiert wurde:

mapLEDXY(0,3,0,255,255);mapLEDXY(1,1,255,128.128);mapLEDXY(1,3,0,255,255);mapLEDXY(1,5,255,128,128);mapLEDXY(2,2,255,128,128);mapLEDXY(2,3 ,0,255,255);mapLEDXY(2,4,255,128.128);mapLEDXY(3,3,255,128,128); 

Da ‚1‘ mein kleinster Wert für X-Koordinaten ist, bezeichne ich das als ‚x‘ und dekrementiere alle anderen Werte um 1.

mapLEDXY(x+0,3,0,255,255);mapLEDXY(x+1,255,128.128);mapLEDXY(x+1,3,0,255,255);mapLEDXY(x+1,5,255,128.128);mapLEDXY(x+2, 2,255,128,128);mapLEDXY(x+2,3,0,255,255);mapLEDXY(x+2,4,255.128,128);mapLEDXY(x+3,3,255,128,128); 

Mein ‚for (int x…loop‘) funktioniert gut, außer dass die Pfeilspitze für ein paar Durchläufe der Schleife in die untere Reihe überläuft!

Lösung! Wenn ein Wert '8' überschreitet, benötige ich seinen Modulwert. Das hat mich gezwungen, die Schaltfläche "Karte umwickeln" zu erstellen. Der Code für eine LED sieht jetzt so aus:

mapLEDXY((x +1) % 8, (y +1) %8, 255, 128, 128);

Um ein XY-Layout anzugehen, ist es meiner Meinung nach am besten, zwei ‚for‘-Schleifen zu verschachteln, auch wenn eine nicht verwendet wird (ja, ich habe eine unangenehme Alternative gefunden).

for(int x=0;x<8;x++){for(int y=0;y<8;y++){[mapcode]}} 

Wenn ich in der zweiten Schleife 'y<1' mache, wird das 'y' ignoriert. Umgekehrt hat die Änderung von 'y' in 8 und 'x' in 0 einen anderen Effekt.

Als letzten Gedanken akzeptiert „Wrap Map“ RGB-Variablen. Siehe oben, wo ich verwiesen habe. Jemand mit grundlegender Programmierung sollte damit umgehen können. Ich habe eine INO-Skizze hinzugefügt, ArrowVar.ino, bei der sich die Helligkeit der Pfeilspitze als kleine Demo ändert.

16x16-Matrix-Nutzung.

Alles oben Erwähnte gilt für die 16x16 WS2812-Matrix. Es muss jedoch die Skizze „LED_Arduino16.ino“ verwendet werden.

Die bereitgestellten Skizzen sind für die 8x8-Matrix ausgelegt, mit Ausnahme einer, der „Spiral16.ino“. Es liefert ein größeres Display als das ‚Spiral.ino‘.

Diese Spirale, 16x16 Matrix, hatte 2 Blatt Druckerpapier als Lichtdiffusor. Die Anzeige wurde für etwa 10 Sekunden angehalten, um ein vernünftiges Bild aufzunehmen.

Um Ihren Code zu entwickeln, öffnen Sie LED_Utility.xlsm und wählen Sie die Registerkarte „Sechzehn“ unten auf der Seite.

Wenn, wie bei mir, dein Display zu groß ist und du scrollen musst, dann verwende eine Zoom-Out-Option. Selbst dann ist etwas Scrollen erforderlich, um Ihren Code zu kopieren.

Erweiterungen?

Ist es möglich, Matrizen anderer Größen zu adressieren?

Ich frage mich, warum mein ‚LED_Arduino.ino‘ und ‚LED_Arduino16.ino‘ in ihren Eröffnungszeilen so unterschiedlich sind. Ich habe bestimmte Zeilen in meinem ersten auskommentiert; beide Skizzen funktionieren wie ich es will.

Ich bin nicht dabei, ein Arbeitsblatt für ein ‚8x32‘ zu schreiben, obwohl ich gerade ein Board erworben habe. Ich werde Sie zu „The Sketch . leiten " Oben. Es gibt Parameter, die angesprochen werden müssen. Seien Sie auch bei den Zeilen 15 und 18 besonders.

NB:Ich überlege auch kleinere Optionen als ein UNO-Board.

Code

  • LED_Arduino
LED_ArduinoC/C++
Diese Skizze bildet die Grundlage des Projekts. Beim Speichern sollte es auf schreibgeschützt und für die weitere Verwendung auf 'Speichern unter' für die Archivierung gesetzt werden, um ein Überschreiben zu verhindern und eine einfache erneute Bearbeitung zu ermöglichen // nur digitaler Pin 8 funktioniert gerade #define numberOfLEDs 64 // Gesamtzahl der RGB-LEDs [256]byte RGB[192]; // Nehmen Sie Ihre Anzahl der LEDs und multiplizieren Sie sie mit 3 [768] // FUNKTIONEN HIERvoid RGB_update (int LED, Byte ROT, Byte GRÜN, Byte BLAU); // Funktion zum Ansteuern von LEDsvoid mapLEDXY (int x, int y, Byte ROT, Byte GRÜN, Byte BLAU) {int RGBlocation =0; // if (y % 2 ==0) { // gerade Spalte [Uncomment] RGBlocation =x + y * 8; //[16] //} else { //ungerade Spalte [Uncomment] //RGBlocation =7 - x + y * 8; //[15] und [16] // } [Uncomment] RGB[RGBlocation * 3] =BLAU; RGB[RGBlocation * 3 + 1] =ROT; RGB[RGBlocation * 3 + 2] =GRÜN;}void clearLEDs() { memset(RGB, 0, sizeof(RGB));}void setup() { pinMode (WS2812_pin, OUTPUT); clearLEDs(); RGB_update(-1, 0, 0, 0);}//setup0void loop() {//MapLEDXY-Zeile(n) direkt über dem RGB_update darunter einfügen.RGB_update(-1, 0, 0, 0); Verzögerung (1000); clearLEDs(); RGB_update(-1, 0, 0, 0); delay(1000);}//loop//WS2812 Driver Functionvoid RGB_update(int LED, byte RED, byte GREEN, byte BLUE) {// LED ist die LED-Nummer beginnend mit 0 // RED, GREEN, BLUE ist die Helligkeit 0 ..255 Sollwert für dieses LED-Byte ExistingPort, WS2812pinHIGH; // lokale Variablen hier, um pinWrites zu beschleunigen if (LED>=0) { // die REG GREEN BLUE Werte in das RGB[] Array RGB[LED * 3] =GRÜN; RGB[LED * 3 + 1] =ROT; RGB[LED * 3 + 2] =BLAU; } noInterrupts(); // die Interrupts beenden, während wir den Bitstrom aussenden... ExistingPort =PORTB; // den Status des gesamten PORT B ​​speichern - schreiben wir in den gesamten Port, ohne die anderen Pins an diesem Port zu vermasseln WS2812pinHIGH =PORTB | 1; // dies gibt uns ein Byte, mit dem wir den gesamten PORTB mit dem WS2812-Pin HIGH setzen können int bitStream =numberOfLEDs * 3; // Gesamtbytes im LED-String // Diese for-Schleife läuft durch alle Bits (8 bei a .) time), um die WS2812-Pin EIN/AUS-Zeiten für (int i =bitStream - 1; i>=0; i--) einzustellen { PORTB =WS2812pinHIGH; // Bit 7 zuerst den Pin HIGH setzen - er geht immer hoch, unabhängig davon von einem 0/1 // hier ist der knifflige Teil, überprüfen Sie, ob das Bit im Byte hoch / niedrig ist, und dann richtig, dass der Status zum Pin // (RGB[i] &B10000000) die anderen Bits in RGB[i . entfernt ]. wenn es eine 1 ist, ODER das mit dem vorhandenen Port, wodurch der Pin HIGH bleibt, wenn 0 wird der Pin LOW PORTB =((RGB[i] &B10000000) &&B10000000) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); // das sind NOPS - diese lassen uns die Uhr verzögern Zyklen für genaueres Timing PORTB =ExistingPort; // Okay, hier wissen wir, dass wir unabhängig vom 0/1-Bit-Zustand LOW sein müssen __asm__("nop\n\t""nop\n\t""nop\n\ t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); // minimale LOW-Zeit für Pin unabhängig vom 0/1-Bit-Zustand // dann mach es wieder für das nächste Bit und so weiter... siehe das letzte Bit für eine kleine Änderung PORTB =WS2812pinHIGH; // Bit 6 PORTB =((RGB[i] &B0100000) &&B0100000) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH; // Bit 5 PORTB =((RGB[i] &B00100000) &&B00100000) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH; // Bit 4 PORTB =((RGB[i] &B00010000) &&B00010000) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH; // Bit 3 PORTB =((RGB[i] &B00001000) &&B00001000) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH; // Bit 2 PORTB =((RGB[i] &B000000100) &&B000000100 | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH; // Bit 1 PORTB =((RGB[i] &B00000010) &&B00000010) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH; // Bit 0 __asm__("nop\n\t"); // bei diesem letzten Bit ist die Prüfung viel schneller, daher musste hier ein NOP hinzugefügt werden PORTB =((RGB[i] &B0000001) &&B00000001) | VorhandenerPort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =ExistingPort; // Beachten Sie, dass es nach dem Schreiben des Pins LOW keine NOPs gibt, da die FOR-Schleife Taktzyklen verwendet, die wir anstelle des NOPS verwenden können} // for loop Interrupts (); // die Interrupts aktivieren // alles fertig!} // RGB_update stornieren
Led_Utility.xlsm
Diese Anwendung generiert den verschiedenen Text zum Kopieren/Einfügen in die Skizze.https://github.com/CobraCat/LED_Utility
Skizzen.zip
Dies sind einige oder mehrere Skizzen, die während der Entwicklung verwendet wurden. Sie sind als 'Support' verfügbar.https://github.com/CobraCat/LED_Utility

Herstellungsprozess

  1. LCD-Panel mit Arduino für Flugsimulator
  2. Schalter/LED-Panel mit Arduino für FS2020
  3. Excel für WS2812 RGB-LED-Array-Animationen
  4. Drei Schritte für globale IoT-Sicherheit
  5. Drei digitale Fertigungstrends für 2020
  6. Drei Tipps für KMUs, die ins Ausland expandieren
  7. Drei Lektionen für Einzelhändler in einem Jahr der Störung
  8. Bauen Sie ein Go Away! Roboter - Einfaches Starter-Projekt für Kinder
  9. Drei Tipps für die Wartung von Industrieanlagen
  10. Drei Tipps für den Kauf schwerer Industrieausrüstung