Ich bräuchte eure Hilfe beim Programmieren, da ich ein absoluter Amateur bin was das angeht.
Für mein Projekt habe ich 9 LEDs um eine Alu-Röhre geklebt. Jetzt möchte ich erreichen, dass die LEDs zufällig blinken, also sowohl eine zufällige Anordnung als auch die Pause zwischen den LEDs. Als würde es quasi irgendwo gewittern und hier und da blitzt es mal.
Könnt ihr mir dabei helfen das umzusetzen?
Wie kann ich die LED und den Delay zufällig festlegen?
Ich weiß nicht genau wie ich den Zufallsgenerator anwende bzw. mit den Befehlen kombinieren, also wie ich z.b. für strip.setPixelColor(x,255,255,255); anstatt dem "X" eine zufällige Zahl einfüge
Habe es jetzt geschafft eine LED zum blinken zu bringen, jedoch ist es immer die gleiche im gleichen Abstand. Der Abstand ist logisch der ist ja noch nicht zufällig aber wieso ist es immer die gleiche LED?
Hier einmal der komplette Code des Programms:
#include <Adafruit_NeoPixel.h>
#define PIN 6
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// put your setup code here, to run once:
strip.begin();
strip.show();
}
void loop() {
// put your main code here, to run repeatedly:
int Count=5;
int NUM_LEDS;
int OnlyOne;
int setAll;
for (int i=0; i<Count; i++)
{
strip.setPixelColor(random(NUM_LEDS),255,255, 255);
strip.show();
delay(1000);
strip.setPixelColor(random(NUM_LEDS),0,0,0);
strip.show();
delay(1000);
}
}
Habe NUM_LEDS jetzt auf 250 gesetzt.
Daran lag es übrigens ^^
Jetzt ist nur noch das Problem dass die LEDs teilweise sehr lange anbleiben weil sie ja auch zufällig wieder ausgeschaltet werden.
Gibt es etwas womit man die vorherige LED direkt wieder ausschalten kann?
-->NUM_LEDS gehört eigentlich in den #define-Bereich und enthält die Anzahl der LEDs, in Deinem Fall also 9...
Außerdem müsste die Zeile:
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
(die 60 sagt dem Controller, er soll 60 LEDs verwalten)
so hier aussehen:
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
Gibt es etwas womit man die vorherige LED direkt wieder ausschalten kann?
-->Natürlich...indem Du random(NUM_LEDS) einer Variable zuweist, und dann mit dieser Variable arbeitest anstatt mit der Funktion
Hallo,
ich hab gleiches Problem...
da ich Neuling bin wäre ich dankbar für den kompletten Code. Könnt Ihr den nochmal posten?
Oder jemand die Änderungen nochmal erklären? Danke und liebe Grüße.
Hey, danke für die Antwort.
was muss ich machen das die Geschwindigkeit langsamer läuft? Das Random von 2111 auf 10000 bringt zwar etwas, aber dann Blink Pixel 2 dauerhaft fast ununterbrochen...
Also aktuell habe ich 12stück dran gehabt möchte aber auf 128 hoch... Habe mal ein bisschen probiert. Beim Random ab 4500 kommt es beim Pixel 2 zu dauerhaften Blinken (3mal pro sek schätze ich. )darunter ist es ok. Random von 4500 ist mir aber noch zu schnell... was kann ich tun jemand ne Idee?
masterboy1985:
Also aktuell habe ich 12stück dran gehabt möchte aber auf 128 hoch...
Zwischen 9 und 128 ist natürlich ein großer Unterschied. Die WS2812B sind vom Datenprotokoll relativ zu APA102 lahm und strip.show(); muß blockierend programmiert werden. Daher ist es ratsam, mit der Art der Programmierung und den Zeiten etwas zu spielen, bis man das optisch ansprechende Ergebnis erzielt. Ich probiere nun mit 128 Pixeln WS2815 (gleiches Protokoll zu WS2812B).
Da ich zu faul bin, 128 Pins aufzuschreiben, mache ich led variabel und berechne es mit einer in der Klasse globalen Variablen. Das geht vermutlich schöner, aber da enden meine Kenntnisse :-[
strip.show(); rufe ich nur bei einer Veränderung auf.
Der berechnete Zufall von random() könnte besser sein, für ein paar Blitze genügt es aber wohl.
Das Problem, wenn das Seed() laufend aufgerufen wird, Sich aber der mitgegebene Wert nur marginal ändert:
Durch das Seed wird der STARTWERT festgelegt - ab hier gibt's neue Zufallszahlen!
Wenn ich IMMER seed(100); ausführen lassen werde ich IMMER die gleiche Zufallszahl danach bekommen.
Aus Deinem A0 können maximal 1024 Werte kommen - somit hast DU Deinen Random so oder so auf maximal 1024 Werte kastriert!
In der Praxis sind die Werte des offenen A0 'irgendwo in der Mitte' - grob geschätzt <300 Werte, Die Du bekommen wirst - für 10 Pixel wird's wohl reichen können, bei 128 hast Du aber mit Mühe die doppelte Anzahl an Zufallszahlen - Da werden dann wohl ein/zwei doppelt oder gar nicht vorkommen.
Damit wird hier wohl zum Thema 'Der berechnete Zufall von random() könnte besser sein, für ein paar Blitze genügt es aber wohl.' der Fehler, wie eigentlich immer, vor dem Monitor sitzen.
Mit der Funktion, Die der Tommy56 gepostet hat, wird der Seed wesentlich besser, da 32x immer das am stärksten rauschende Bit des A0 (sogar einstellbar) zur Start-Zahlen-Generierung benutzt wird.