Gewitter Blitze

Hallo liebe Programmiergemeinde

Ich bin völlig am verzweifeln und hoffe ihr könnt mit helfen.

ich arbeite mit einem arduino uno und versuche seit geraumer zeit gewitterblitze zu programmieren.
jedoch gelingt es mir nicht auch nur eine LED weiß blinken zu lassen :frowning:
blinken tun sie alle nur halt nicht willkürlich und auch nicht weiß.
ich nutze als LED ein 5m band mit 300 ws2812b LED´s mit zusätzlicher 10A netzversorgung.

mein Sketch sieht wie folgt aus:


#include <Adafruit_NeoPixel.h>

#define PIN 6
#define NUM_LEDS 200
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_RGBW + NEO_KHZ800);

class Blinken {
    byte led;
    uint32_t intervall;
    uint32_t vorhin;
    bool status;
  public:
    static byte zaehler;    // globale Variable innerhalb der Klasse
    Blinken()
      : led(0), intervall(0), vorhin(0), status(0) {}

    void init() {
      led = zaehler;
      zaehler++;
      vorhin = millis();
      intervall = random(3111, 9111);
    }

    void runLed() {
      if (status == LOW) {
        if (millis() - vorhin >= intervall)
        {
          strip.setPixelColor(led, 255, 255, 255);
          status = HIGH;
          vorhin = millis();
          strip.show();
        }
      } else {
        if (millis() - vorhin >= 50) {
          strip.setPixelColor(led, 0, 0, 0);
          status = LOW;
          vorhin = millis();
          strip.show();
        }
      }
    }
};

byte Blinken::zaehler = 0;    // Variable mit Anfangswert
Blinken blinken[NUM_LEDS] {};

void setup() {
  strip.begin();
  for (Blinken &b : blinken) b.init();
}

void loop() {
  randomSeed(analogRead(A0));
  for (Blinken &b : blinken) b.runLed();
}

die zahl der LED´s steht auf 200 weil sonst der dynamische Speicher nicht ausreicht

Wisst ihr woran es liegen könnte?

MFG

Nimm einen ESP8266 und installiere WLED.

Dann hast du Gewitterblitze.

.....und 1000 andere Sachen und ne Handyapp und und und und. Da muss man nix mehr selber programmieren und es ist sehr komfortabel.

Beste Grüße,
Chris

ja geht aber um die herausforderung :slight_smile:

und außerdem hab ich davon noch weniger ahnung :smiley:

Für WLED braucht man auch 1000x weniger Ahnung.

Aber gut, wenn der Weg das Ziel ist, dann bist du hier richtig!

Beste Grüße,
Chris

sicherlich ist er das aber die wolken müssen bis Halloween fertig sein :smiley:

...mit WLED ist das in 15min erledigt, wenn man will

Warum in Gottes Namen willst du 200 von deinen Klassen anlegen?
Jede braucht 10 Byte, damit bleiben dir 48 Byte Stack.
Bekommst du nicht eine gruslige Nachricht beim Kompilieren?

Wo soll der Speicher für die LED Daten herkommen?

Nein, WLED kann nicht den Speicher vergrößern,
die benutzte Strategie kann auf einem UNO nicht mit 200 LEDs+Blinkern funktionieren.

Siehe oben: -> ESP8266

Ist das Netzteil genügend stark?

Grüße Uwe

hab nu rausbekommen dass es mit 60 led klappt jetzt hatte ich die idee einfach den streifen in 5 mal 1m stücke zu teilen(was ich eh tun müsste )und dann 5 ausgänge über das progrmm zu steuwern denn das fällt kaum auf dass die sequenz sich an 5 punkten wiederholt jedoch auch da macht der arduino gar nichts.....
ein streifen mit 60 led kein problem sobald ich den zweiten streifen an pin 7 hänge und da programm starte macht keiner der beiden streifen etwas

das netzteil hat 12A also ausreichend habs ja hinbekommen alle leds gleichzeitig leuchten zu lassen nur eben nicht alle 300 im random in weiß

12A sind für 300 WS2812 zu wenig. Du brauchst 18A.

Wie oft speist Du die Versorgungsspannung in den Streifen ein?

es werden aber niemals alle gleichzeitig angesteuert es blinken pro streifen selbst nach 2 stündigem durchlauf nie mehr als 10 von 60 gleichzeitig

kann mir jemand sagen wie ich mehrere ausgänge über ein und dasselbe programm geschaltet bekomme?
sprich 6 pinne mit demselben output?
hab den pin 6 im define bereich hinterlegt
noch besser wäre wenn alle 6 streifen unabhängig voneinander im zufall blinken würden hab nur absolut keine idee wie das gehen soll:(

Schreibe doch in einer zufälligen Auswahl, auf einen zufälligen Pixel, und lösche ihn danach wieder.

Mal ein Code-Schnipsel-Beispiel aus meinem Würfel

if(!random(100)){                                               // nur in einem von 100 Fällen ausführen
    strip.setPixelColor(random(ledAnzahl-1),random(255),random(255),random(255));
    strip.show();
    delay(7);                                                     // länge des aufblitzen in Millisekunden
    strip.clear();
  }

Die Farbe kannst du auch statisch auf Weis setzen.

leg dir nicht 200 Objekte deiner Klasse an, sondern nur 10.
Ergänze die Klasse mit einer Zufallszahl für den Pixel wenn du dein blinken startest (statt dem Objektzähler den du aktuell hast).

damit ergeben sich dann nicht blockierndes "blinken" für maximal 10 Pixels gleichzeitig.

edit


//https://forum.arduino.cc/t/gewitter-blitze/1032129/18

#include <Adafruit_NeoPixel.h>

#define PIN 6
//#define PIN 12
#define NUM_LEDS 200
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_RGBW + NEO_KHZ800);

class Blinken {
    byte led = 0;
    uint32_t intervall = 500;
    uint32_t vorhin = 0;
    bool status = false;
  public:
    //static byte zaehler;    // globale Variable innerhalb der Klasse
    Blinken()
      : led(0), intervall(0), vorhin(0), status(0) {}

    void init() {
      //led = zaehler;
      //zaehler++;
      //vorhin = millis();   // beim initialiseren ist es ohnehin nahe 0
      //intervall = random(3111, 9111);
    }

    void runLed() {
      if (status == LOW) {
        if (millis() - vorhin >= intervall)
        {
          intervall = random(300, 900);       // Zufallszeit für nächsten Aufruf anpassen, da du jetzt ja weniger Objekte hast
          led = random(NUM_LEDS);              // Pixel für dieses mal blinken
          strip.setPixelColor(led, 255, 255, 255);
          status = HIGH;
          vorhin = millis();
          strip.show();
        }
      } else {
        if (millis() - vorhin >= 50) {
          strip.setPixelColor(led, 0, 0, 0);
          status = LOW;
          vorhin = millis();
          strip.show();
        }
      }
    }
};
//byte Blinken::zaehler = 0;    // Variable mit Anfangswert
Blinken blinken[10] {};

void setup() {
  strip.begin();
  for (Blinken &b : blinken) b.init();
}

void loop() {
  randomSeed(analogRead(A0));
  for (Blinken &b : blinken) b.runLed();
}

keine Low Memory Warnung mehr:

Sketch uses 3276 bytes (10%) of program storage space. Maximum is 32256 bytes.
Global variables use 145 bytes (7%) of dynamic memory, leaving 1903 bytes for local variables. Maximum is 2048 bytes.

Wenn noch nicht geschehen, schalte dir die Compiler Warnings in deinen Arduino Einstellungen ein.

wofür ist der pin 12 definiert?

n/r: ich habs mit meinem Board getestet, da hängen die Pixel am 12er.
Tut es was es machen soll, wenn nicht was genau nicht?