INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Multitasking mit millis statt delay
15.04.2015, 09:25
Beitrag #1
Multitasking mit millis statt delay
Hallo,

ich steuere des öfteren RGB LED Streifen per PWM an und nutze dazu folgende Funktion:

Code:
void LauflichtAnimation1(uint32_t c, uint8_t wait) {
    
  colorWipeAlle1(0);
  for (int j=0; j<1; j++) {  //do 10 cycles of chasing
    for (int q=0; q < strip_1.numPixels(); q++) {
      for (int i=0; i < strip_1.numPixels(); i=i+1) {  
        strip_1.setPixelColor(i+q, 0);

      }

      strip_1.show();
          delay(wait);

      for (int i=0; i < strip_1.numPixels(); i=i+1) {
        strip_1.setPixelColor(i+q, c);        //turn off, bei c bleiben sie an
        
      }
    }
  }
  
}


void colorWipeAlle1(uint32_t c) {                              // Alle LEDs aus (0) oder alle LEDs in einer Farbe (strip_1.Color(0, 255, 0))
  for(uint16_t i=0; i<strip_1.numPixels(); i++) {
      strip_1.setPixelColor(i, c);
      strip_1.show();
  }
}

Damit kann ich allerdings bedingt durch das Delay und die For-Schleifen immer nur einen Streifen ansteuern oder aber zwei nacheinander laufen lassen.

Ich möchte jedoch zwei Streifen parallel mit unterschiedlichen Szenen ansteuern, um für aufwendigere Projekte nicht immer mehrere Controller verwenden zu müssen.

Daher habe ich die Funktion millis() entdeckt, womit dies zu realisieren wäre.

Ich habe es mal probiert so umzusetzen:

Code:
void LauflichtAnimation1(uint32_t c, uint8_t wait) {   // Zwei Streifen gleichzeitig laufen lassen, rückwärts

        uint8_t z = 0;
        uint8_t x;
        uint8_t q;
    
    if(x==0)
    {
  colorWipeAlle1(0);
  for (int j=0; j<1; j++) {  //do 10 cycles of chasing
    for (int q=0; q < strip_1.numPixels(); q++) {
      for (int i=0; i < strip_1.numPixels(); i=i+1) {  
        strip_1.setPixelColor(i+q, 0);
      }
      strip_1.show();
      x = 1;
    }
         // delay(wait);
      
     if (millis() - previousMillis > wait) {
       z = 1;
     }
      if(z) {
      for (int i=0; i < strip_1.numPixels(); i=i+1) {
        strip_1.setPixelColor(i+q, c);        //turn off, bei c bleiben sie an
      }
       previousMillis = millis();   // aktuelle Zeit abspeichern
       z = 0;
       x = 0;
      }
   }
  }
  
}

Allerdings blinkt die 1. LED dann nur.

Wie ist die millis Funktion richtig einzubinden?

LG
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.04.2015, 10:51
Beitrag #2
RE: Multitasking mit millis statt delay
Sollte sich sowas nicht auch mit Timer-Interrupts lösen lassen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.04.2015, 11:25 (Dieser Beitrag wurde zuletzt bearbeitet: 15.04.2015 11:26 von Bitklopfer.)
Beitrag #3
RE: Multitasking mit millis statt delay
Hallo LEDstar,
ich hätte da eine Idee...und zwar gehe ich mal das die LED's immer voll eingeschaltet werden. Und zwar du ziehst einen Timer auf der die Leuchtdauer einer LED bestimmt z.B. LEDrot = 500 . Dann läßt du entweder einen Hardware-Timer mit Interrupt laufen oder schaust das wenn z.B. 10mS vergangen sind nach welche Timervariable nicht 0 ist und dekrementierst die um 1.

Der Code würd dann in etwa so aussehen

if(LEDrot != 0)
{
LEDrot = TRUE; // Led einschalten wenn nicht 0
}
else
{
LEDrot = FALSE; // Led ausschalten wenn 0
}

Jetzt mußt nur noch wenn die LED eingeschaltet werden soll die LEDrot Variable ungleich 0 setzen.

Und das runterzählen alle X mS nicht vergessen.

Nach diesem System habe ich mal was unter C mit dem AVR Studio auf nem Atmel Chip programmiert...da ging es um Timeout's.

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  blinken mit millis Gonmaus 13 667 08.09.2017 21:12
Letzter Beitrag: Bitklopfer
  NeoPixels: Sketch will nicht - Problem mit delay? Zabsi 5 326 22.08.2017 15:17
Letzter Beitrag: Tommy56
  Taster an Interrupt - Prellen geschickter vermeiden als millis() zu prüfen? Flap 19 1.957 04.08.2017 08:10
Letzter Beitrag: Binary1
  2 Servos ohne delay steuern Ratlos 27 2.088 26.07.2017 20:43
Letzter Beitrag: MicroBahner
  LEDs ansteuern ohne Delay mir MIDI abfrage OnkelPelle 11 865 20.07.2017 22:35
Letzter Beitrag: hotsystems
  Ich komme mit millis nicht weiter !!! Gonmaus 8 730 09.07.2017 21:24
Letzter Beitrag: Tommy56
  delay(...) im Code ok? donut 4 461 08.06.2017 20:16
Letzter Beitrag: donut
  2 Befehle gleichzeitig, Millis()-Befehl rakadami 24 1.735 13.05.2017 20:47
Letzter Beitrag: MicroBahner
  Brauche Hilfe für meine Abfüllanlage/ millis() Slash96 8 775 10.05.2017 21:04
Letzter Beitrag: MicroBahner
  Brauche Zeitverzögerung delay/millis/timer? Spiecky 17 1.263 15.04.2017 09:41
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste