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
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.
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?
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
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.