LED auf einem Stripe zufällig anschalten

hi, ich bin relativ neu mit Arduino Programmierung und habe da gleich mal eine Frage.
Kann man es realisieren, das man die LEDs auf einem RGB Stripe in zufälliger Reihenfolge alle anschalten kann?

Rene

Die LEDs werden tun, was das Programm verlangt.
Es steht eine random()-Funktion zur Verfügung

Abhängig von deiner Programmierung auf einem Arduino o.ä. geht das bestimmt.

es gibt ja eine funktion das man auf einem einzeln adressierbaren strip alle LED gleichzeitig anmacht. aber ich weis halt nicht ob man da diese random funktion mit einbinden kann.

Ja?

"Alle an", ist nicht sonderlich zufällig.

Tipp:
Wenn eine Funktion/Methode nicht das tut, was man möchte, schreibt man sich eine eigene, die das dann tut.

Je nachdem welche Led-Stipes du verwendest, gibt es auch passende Libraries die aiederum Beispiele enthalten. Diese schaust du dir einfach an und kannst darauf deinen Sketch aufbauen.

dann zeig mal wie du alle einschaltest und definiere in welchem Zeitraum das ganze Wechseln soll.

Dann kann man dir vermutlich auch weiterhelfen.

ich bin halt noch sehr neu. es ist ja wichtig das random zum beispiel nicht mehrmals die selbe zahl erzeugt so das nicht ein und die selbe led mehrmals angeht. meine vorstellung ist halt, das zum beispiel 10 leds auf dem strip in unterschiedlicher reihenfolge nach einander angehen. ich kann ja dann durch random eine zahl erzeugen lassen die die position der LED repräsentiert und diese dann angeht aber wie gesagt müßte dazu random nicht mehrmals gleiche zahlen angeben

Hallo,
welche lib verwendest Du ? Bei der FastLED Lib gibt es ein einfaches Beispiel wie man nur eine einzelne LED einschaltet. Schau Dir das an und verstehe was da gemacht wird und lass mal eine andere LED aufleuchten. Wenn das klappt musst Du jetzt nur die Nummer der LED nicht als festen Wert verarbeiten sondern als zufällig ermittelten.
Nicht vergessen die alte LED wider auszuschalten, sonnst sind irgendwann alle an . :wink: aber das sieht sicher auch ganz gut aus.
Heinz

Hallo,
dann kannst Du dir merken welche LED schon an ist, bzw welche Nummer von random schon mal erzeugt wurde. Dazu kannst Du ein Bool Array anlegen und prüfen ob die neue Nummer schon mal verwendet wurde. 0 noch nicht verwendet 1 gabs schon. , wenn ja erzeugst Du eine neue Nummer. usw.

Random darf das!
Es darf sogar 2 Stunden lang die gleiche Zahl liefern.

Was du machen könntest:
Eine Permutation über alle mögliche/gewünschten Kombination entwickeln. (Kombinatorik?)
Diesen Permutator könntest du mit einem "Index" versehen, und so sicherstellen , dass keine Wiederholungen auftreten können.

das ist dann nicht mehr zufällig!
Außerdem nicht zu ende gedacht: Was soll geschehen wenn schon mal 10 LEDs aufgeleuchtet haben?

das ist mal "LEDs auf einem RGB Stipe in zufällige Farbe"

#include <Adafruit_NeoPixel.h>

constexpr byte pixelPin = 8;
constexpr byte numpixels = 15;
constexpr uint16_t interval = 500; // Time (in milliseconds) to pause between pixels

Adafruit_NeoPixel pixels(numpixels, pixelPin, NEO_GRB + NEO_KHZ800);


void setup() {
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
  pixels.clear(); // Set all pixel colors to 'off'
  pixels.setBrightness(50);
  randomSeed(A0);
}

void loop() {
  pixels.fill(((uint32_t)random(256) << 16) + (random(256) << 8) + random(256));
  pixels.show();
  delay(interval); // dirty delay ... aber wurscht für den 4 Zeiler
}

Hallo,
@noiasca man könnte die 10 LEDs in einer zufälligen Reihenfolge alle angehen lassen , ohne das eine ein zweites mal dran ist. Wenn alle an sind gehts von vorne los.

@Rentner mir ist klar das dir das klar ist. Das sind Überlegungen die eigentlich der TO machen soll.

Geblinke von 10 LEDs, wobei innerhalb von 10 Durchläufen eine LED kein zweites mal aufscheint:

#include <Adafruit_NeoPixel.h>

constexpr byte pixelPin = 8;
constexpr byte pixelNum = 10;
constexpr uint16_t interval = 500; // Time (in milliseconds) to pause between pixels

Adafruit_NeoPixel pixels(pixelNum, pixelPin, NEO_GRB + NEO_KHZ800);

bool alreadyShown[pixelNum];
byte iteration = 0;

void setup() {
  Serial.begin(115200);
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
  pixels.clear(); // Set all pixel colors to 'off'
  pixels.setBrightness(50);
  randomSeed(A0);
}

void loop() {
  blinki();
}

void debug()
{
  for (auto &i : alreadyShown)
  {
    Serial.print(i);
    Serial.print('\t');
  }
  Serial.println();
}

void blinki()
{
  byte actual = 255;
  debug();
  while (true)
  {
    actual = random(pixelNum + 1) ;
    if (alreadyShown[actual] == false) break; // wir haben einen noch nicht gezeigten Pixel
  }
  Serial.println(actual);
  alreadyShown[actual] = true;
  pixels.clear();
  pixels.setPixelColor(actual, ((uint32_t)random(256) << 16) + (random(256) << 8) + random(256));
  pixels.show();
  iteration++;
  if (iteration >= pixelNum)
  {
    Serial.println(F("löschen"));
    iteration = 0;
    memset(alreadyShown, 0, pixelNum); // Speicher löschen
  }
  delay(interval); // dirty delay
}

das ziel ist es ja, dass zum schluss alle leuchten. wie man einzele an und abschaltet weiss ich und wie man den ganzen strip auf einmal anmacht weiss ich auch, nur halt nicht wie man die einzelnen LEDs zufällig anschaltet und sie dann auch an bleiben

Hallo,
das solltest Du aber selber herausbekommen. Wenn Du weisst wie man eine einschaltete. Halt eben keine mehr ausschalten . Dann sind sie irgendwann alle an.

Hast Du die frage nach der verwendeten lib schon beantwortet ?
Heinz

hab da auch die adafriut.das ist klar das die anbleiben sollen, aber wenn random auch zahlen wiederholt ausgibt kann es ja stundne dauern eh die letzte dann an ist.

Ja. Das ist beim Zufall so (auch beim Pseudo-Zufall von random). Ich warte nun schon 61 Jahre auf sechs Richtige - die sind immer noch nicht alle da :slightly_smiling_face:

Ein langweiliges Problem....

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

template<typename Type, size_t anzahl, Type endeMarker = -1 >
struct Feld
{
  Type feld[anzahl];
  size_t pool;
  Feld()
  {
    init();
  }
  void init()
  {
    pool = anzahl;
    int i = 0;
    for(Type &f:feld) f=i++;
  }
  operator Type()
  {
    if(!pool) return endeMarker;
    unsigned i = random(0,pool);
    Type temp = feld[i];
    feld[i] = feld[pool---1];
    return temp;
  }
};

Feld<int,10,-1> feld;

void serialEvent()
{
  if(Serial.read() == 'i') feld.init();
}



void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;
}

void loop() 
{
  int zahl;
  if((zahl = feld) >= 0) cout << zahl << endl;
  delay(500);
}

Die Vorstellung dahinter, ist recht einfach....
Man schafft sich ein Feld an potentiellen Möglichkeiten.
Wenn man das Feld fragt, liefert es eben einen aus dem Pool der Möglichkeiten und streicht diesen aus dem Pool, oder es liefert einen Ende Marker, wenn der Pool aufgebraucht/leer ist.

i wie init, startet eine neue Show.

➜ ist das nicht schöner?

    feld[i] = feld[--pool];