HELP ME -- altbekanntes Mysterium Millis()

Hallo Forum,

ich wollte euch um Hilfe bitten.

Ich komm nicht recht weiter...
Nutze mit Arduino Neopixels
Code funktioniert, steuere ich über App
Problem : Hab eine Funktion erstellt, mit Delays, die sich immer wieder aufhängt sobald ein neues Signal reinkommt wenn gerade ein Delay abgearbeitet wird vom Prozessor.
Würde gerne die Delays in der Funktion durch Millis() ersetzen, klappt aber nicht so recht.

Das ist nur ne Funktion die im loop aufgerufen wird.

Kann mir jemand helfen das mit Millis zu schreiben ? Wäre sehr dankbar !!

Viele Grüße

Franz

void Modernn(byte R, byte G, byte B, int hell, int Zeit) {


  strip.setBrightness(hell);

  


  strip.setPixelColor(0, R, G, B, 255);
  strip.setPixelColor(11, R, G, B, 255);   strip.show();   if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW ))) {
    // strip.clear();
    return; delay(Zeit);
  }
  strip.clear();

  strip.setPixelColor(1, 0, 0, 0, 255);
  strip.setPixelColor(10, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW ))) {
    //strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(2, 0, 0, 0, 255);
  strip.setPixelColor(9, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW ))) {
    //  strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(3, 0, 0, 0, 255);
  strip.setPixelColor(8, 0, 0, 0, 255);  strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW ))) {
    // strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(4, 0, 0, 0, 255);
  strip.setPixelColor(7, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    // strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(5, 0, 0, 0, 255);
  strip.setPixelColor(6, 0, 0, 0, 255);  strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    // strip.clear();
    return;
  } delay(Zeit);


  strip.clear();



  strip.setPixelColor(5, 0, 0, 0, 255);
  strip.setPixelColor(6, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    // strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(4, 0, 0, 0, 255);
  strip.setPixelColor(7, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    //  strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(3, 0, 0, 0, 255);
  strip.setPixelColor(8, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    //  strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(2, 0, 0, 0, 255);
  strip.setPixelColor(9, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    //  strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(1, 0, 0, 0, 255);
  strip.setPixelColor(10, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    // strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  strip.setPixelColor(0, 0, 0, 0, 255);
  strip.setPixelColor(11, 0, 0, 0, 255);   strip.show(); if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) {
    // strip.clear();
    return;
  } delay(Zeit);
  strip.clear();

  if ((bt.available() > 0  || ( BtStatePin == false && digitalRead(BtPin) == LOW )) ) return;

}

Ich bin mir sicher, dass dein Probem in den paar Codezeilen liegt, die du nicht gepostet hast.

Und formattier den Sketch ordentlich.

Nicht mehrere Dinge in eine Zeile

Franz_grundi:
Kann mir jemand helfen das mit Millis zu schreiben ?

Beispielsweise so:

void Modernn(byte R, byte G, byte B, int hell, uint16_t zeit) {
  uint32_t jetzt = millis();
  static uint32_t vorher = jetzt;
  static uint8_t led = 0;
  static int8_t schritt = 1;
  if (jetzt - vorher >= zeit) {
    vorher = jetzt;
    strip.setBrightness(hell);
    if (led == 0) {
      strip.clear();
    }
    strip.setPixelColor(led, R, G, B, 255);
    strip.setPixelColor(ANZAHLDERPIXEL - 1 - led, R, G, B, 255);
    strip.show();
    led += schritt;
    if (led >= ANZAHLDERPIXEL / 2) schritt *= -1;
  }
}

Die Animation macht möglicherweise nicht exakt, was Du möchtest, aber Du hast ja nach der Verwendung von millis gefragt.

Also den gesamten Sktch und sag uns auch welchen Arduino Du hast.
Grüße Uwe

Vielen Dank, agmue für den Code. Funktioniert und damit kann ich was anfangen :smiley:

Ich benutze einen Arduino Nano mit Hc05, Uwe

Franz_grundi:
Funktioniert und damit kann ich was anfangen :smiley:

Freut mich!

Leider schaltet strip.show() bei Neopixeln (WS2812) immer die Interrupts ab und blockiert damit den µC, beispielsweise Daten anzunehmen. Bei 12 Pixeln dürfte es nicht so schlimm sein. Wenn Du aber mehr Pixel anschließen möchtest, empfehle ich Dir den Typ Dotstar (APA102) oder vergleichbar mit Daten und Takt getrennt.