Millis in einer Funktion

Hallo Leute, kann mir jemand Helfen?

Würde gerne mit den Neopixel was machen.
Eine Blink Funktion, die mit Millis läuft.
Die Neopixels Sollen 5 mal kurz blinken( 100 ms ), dann immer 2 Sekunden Pause. Dann wieder 5 mal blinken, 2Sek pause usw.

Sitze seit Stunden da, aber nichts klappt so richtig wie ich mir das vorstelle.

Hier mal das aktuellste “Geschreibsel”

Vor dem Setup habe ich noch folgendes Stehen für die Millis :

unsigned long previousMillisStrobe = 0;

Der Aufruf und die Verarbeitung dieser Funktion laufen Perfekt im restlichen Code.
Es geht einzig um diese Funktion, schaffe es nicht, das beschriebene umzusetzen ohne diese nervigen Delays zu benutzen
Hoffe jemand von euch kann mir helfen :wink: Danke schonmal :slight_smile:

void Blinken(byte R, byte G, byte B,  byte Hell) {


  strip.setBrightness(Hell);


  unsigned long currentMillisStrobe = millis();

  
  for (int i = 0; i < Anzahl_Pixel; i++) {
    strip.setPixelColor(i, R, G, B);
    strip.show();
  }
  
  if ((unsigned long)(currentMillisStrobe - previousMillisStrobe) >= 1000) {

    strip.clear();
    strip.show();
  
    previousMillisStrobe = millis();


   

  }

  

}

Was dieser Code macht : Die Pixel leuchten permanent und alle 1 Sek geht aus für eine extrem kleine Zeit, sieht aus wie ein Blitzen… Versuche waren alle Erfolglos…

Hi

In Deinem Code sind viele Leerzeilen - macht den Kram schwer lesbar.
Leerzeilen sind keine Rudeltiere - wenn mehr als Eine, können die ‘Mehr’ auch direkt weg

Setze das .show() außerhalb der FOR-Schleife - Damit sendest Du die Farb-Daten an den LED-Streifen - also bei der FOR-Schleife sendest Du BEI JEDEM PIXEL den kompletten Streifen raus.

Auch scheint ‘etwas’ von Deinem Sketch zu fehlen - So kann man Dir nur recht schwer helfen.

MfG

Du benötigst einen Status, ob die Leds gerade ein oder aus sind. Dazu verwende ich EINaus:

void Blinken(byte R, byte G, byte B,  byte Hell, unsigned long intervall) {
  static unsigned long previousMillisStrobe = 0;
  static bool EINaus = false;
  unsigned long currentMillisStrobe = millis();
  if ((unsigned long)(currentMillisStrobe - previousMillisStrobe) >= intervall) {
    previousMillisStrobe = currentMillisStrobe;
    if (EINaus) {
      strip.clear();
    } else {
      for (byte i = 0; i < Anzahl_Pixel; i++) {
        strip.setBrightness(Hell);
        strip.setPixelColor(i, R, G, B);
      }
    }
    strip.show();
    EINaus = !EINaus;
  }
}

Es ginge auch getPixelColor.

Die Festlegung von previousMillisStrobe als globale Variable ist möglich. Da sie aber nicht außerhalb der Funktion Bedeutung haben dürfte, würde ich sie eher lokal festlegen. Dann kannst Du den selben Variablennamen auch in einer anderen Funktion verwenden. Du darfst nur static nicht vergessen.

Danke für die Antworten

Danke dir, agmue :) Hast mir sehr weitergeholfen, funktioniert ;)