Ein freundliches Hallo in die Runde!
Seit kurzer Zeit arbeite ich an einem kleinen Neopixel Projekt und hab den Großteil meiner Probleme aus dem Weg geräumt. Ich bin was Arduino betrifft ein Anfänger würde ich behaupten - kein Blutiger mehr, aber definitiv noch im Anfangsstadium.
Der Aufbau ist eine Art Würfel im Infinity Mirror Stil, es sind 24 Strips á 15 cm mit je 8 LED verbaut => 192 LED. Wen das ganze interessiert der sucht auf YT mal nach "Rhombic Dodecahedron" von Adam Savage & Matt Parker.
Ein 5V 20A Netzteil liegt vor, angesteuert wird das ganze mit einem Mikro. Aufbau wie üblich mit 1000uF Kondensator und 400Ohm Widerstand auf D-IN.
Zur Steuerung werden 3-4 Push Buttons sowie ein paar Drehpotis verwendet.
Nun ist mir gestern aufgefallen:
Die strip.fill() Funktion tut sich ab ~120 Pixeln schwer. Ich hatte versucht, meine Pixel 120-144 "aufzudimmen", woraufhin sich aber Pixel 120 - 192 aufgedimmt haben. Dachte es liegt am Micro, ein Mega macht die gleichen Probleme.
Per "strip.setPixelColor" hat es wiederum funktioniert.
Edit
danke an noiasca für das Klarstellen der Funktion strip.fill();, ich hatte das "count" als letzten Parameter komplett vergessen!
Da ich später plane, die LEDs über mehrere verschiedene Funktionen mittels Push Button durchzuschalten und per Poti ggf. einzelne Farben heraus oder herein zu dimmen, hab ich meine Funktionen geplant.
Jetzt ist es nur so: Der Würfel ist "abenteuerlich" verkabelt. Durch seine nicht gewöhnliche Form laufen die DIN-DOUT Verkabelungen kreuz und quer (für den kürzesten Weg), so dass die obere Seite die Pixel 120-144, eine Randseite die Pixel 145 - 192 bedient.
Ist es möglich, den Spaß irgendwie einfach zu remappen, ohne über 192 Variablen zu gehen? Man könnte es ggf noch kürzen auf 24 Variablen, das ging, aber vllt geht es ja noch einfacher. Oder das remappen lieber sparen, wenn ich genau weiß, wo welche LED liegt?
Dies ist mein aktueller Stand. Ich hab mit Potis und Buttons schon rumprobiert und weiß, wie ich die einbinden kann. Die "delay"s sind auch erstmal nur für die Tests der einzelnen "Gestaltungen", später will ich mit Timern arbeiten (dass mir auch ja die Buttons- und Potis erkannt bleiben :D)
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN 6
#define NUMPIXELS 192
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 100
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}
void loop() {
strip.clear();
BuildUp();
BuildMidUp();
BuildRingLow();
BuildLow();
delay(5000);
strip.clear();
strip.show();
delay(1000);
}
//Dim up the upper ring
void BuildUp(){
for(int i=0; i<121; i++){
for(int h=0; h<8; h++){
strip.setPixelColor(104+h, i, i, i);
strip.setPixelColor(112+h, i, i, i);
strip.setPixelColor(120+h, i, i, i);
strip.setPixelColor(96+h, i, i, i);
}
strip.show();
delay(10);
}
}
//Walk down from up to middle
void BuildMidUp(){
for(int j=0; j<8; j++){
strip.setPixelColor(47-j, 120, 120, 120);
strip.setPixelColor(71-j, 120, 120, 120);
strip.setPixelColor(72+j, 120, 120, 120);
strip.setPixelColor(128+j, 120, 120, 120);
strip.setPixelColor(183-j, 120, 120, 120);
strip.setPixelColor(184+j, 120, 120, 120);
strip.show();
delay(DELAYVAL);
}
}
//Middle ring walks from connection to middle of strip
//Low-Mid sides walk down
void BuildRingLow(){
for(int k=0; k<8; k++){
strip.setPixelColor(39-k, 120, 120, 120);
strip.setPixelColor(48+k, 120, 120, 120);
strip.setPixelColor(63-k, 120, 120, 120);
strip.setPixelColor(136+k, 120, 120, 120);
strip.setPixelColor(160+k, 120, 120, 120);
strip.setPixelColor(175-k, 120, 120, 120);
if(k == 0){
strip.setPixelColor(95-k, 120, 120, 120);
strip.setPixelColor(88+k, 120, 120, 120);
strip.setPixelColor(80+k, 120, 120, 120);
strip.setPixelColor(87-k, 120, 120, 120);
strip.setPixelColor(144+k, 120, 120, 120);
strip.setPixelColor(151-k, 120, 120, 120);
strip.setPixelColor(152+k, 120, 120, 120);
strip.setPixelColor(159-k, 120, 120, 120);
}
if(k == 2){
strip.setPixelColor(95-k/2, 120, 120, 120);
strip.setPixelColor(88+k/2, 120, 120, 120);
strip.setPixelColor(80+k/2, 120, 120, 120);
strip.setPixelColor(87-k/2, 120, 120, 120);
strip.setPixelColor(144+k/2, 120, 120, 120);
strip.setPixelColor(151-k/2, 120, 120, 120);
strip.setPixelColor(152+k/2, 120, 120, 120);
strip.setPixelColor(159-k/2, 120, 120, 120);
}
if(k == 4){
strip.setPixelColor(95-k/2, 120, 120, 120);
strip.setPixelColor(88+k/2, 120, 120, 120);
strip.setPixelColor(80+k/2, 120, 120, 120);
strip.setPixelColor(87-k/2, 120, 120, 120);
strip.setPixelColor(144+k/2, 120, 120, 120);
strip.setPixelColor(151-k/2, 120, 120, 120);
strip.setPixelColor(152+k/2, 120, 120, 120);
strip.setPixelColor(159-k/2, 120, 120, 120);
}
if(k == 6){
strip.setPixelColor(95-k/2, 120, 120, 120);
strip.setPixelColor(88+k/2, 120, 120, 120);
strip.setPixelColor(80+k/2, 120, 120, 120);
strip.setPixelColor(87-k/2, 120, 120, 120);
strip.setPixelColor(144+k/2, 120, 120, 120);
strip.setPixelColor(151-k/2, 120, 120, 120);
strip.setPixelColor(152+k/2, 120, 120, 120);
strip.setPixelColor(159-k/2, 120, 120, 120);
}
strip.show();
delay(DELAYVAL);
}
}
//Lower Side walks from connection Point to middle.
void BuildLow(){
for(int l=0; l<4; l++){
strip.setPixelColor(0+l, 120, 120, 120);
strip.setPixelColor(7-l, 120, 120, 120);
strip.setPixelColor(8+l, 120, 120, 120);
strip.setPixelColor(15-l, 120, 120, 120);
strip.setPixelColor(16+l, 120, 120, 120);
strip.setPixelColor(23-l, 120, 120, 120);
strip.setPixelColor(24+l, 120, 120, 120);
strip.setPixelColor(31-l, 120, 120, 120);
strip.show();
delay(DELAYVAL);
}
}
Ich will später in den Funktionen entsprechend die Potis einspielen für die Lichthelligkeit.
Nur wenn ich es mir richtig vorstelle, kann ich jeden Strip hier prinzipiell einzeln per Funktion definieren, und zwar so, dass ich über eine Variablenübergabe direkt festlegen kann:
- Laufrichtung (Hoch, runter, von außen nach innen, von innen nach außen)
- Dim-Up/Dim Down
- Blinkelichter
Wobei letzteres, also rumgeblinke, vermutlich eher über eine getrennte Funktion laufen sollte.
Der Push-Button soll dann einfach nur die Fälle regeln, ob die Laufrichtung geändert wird, ob Dim-Up/down stattfinden soll etc... und per Poti kann ich dauerhaft einstellen, ob ich nun Blau, Rot, Grün oder weiß haben mag - und in welcher Intensität.
Ich weiß noch nicht, ob es Sinnig ist, die "Hue" Einstellung der Strips zu nutzen, da ich vermute, dass diese etwas... schwieriger per Poti zu regeln ist. Auch hier wäre ich für Hinweise dankbar ![]()
Besten Dank schon einmal im Voraus. Ich habe nichts dergleichen bei meiner Suche im Forum (und Google) gefunden, hoffe ich habe dabei nichts übersehen.
