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
  Statt 1 SMS gleich unendliche bergfrei 7 175 17.10.2016 18:49
Letzter Beitrag: bergfrei
  Delay nurmili 2 220 10.07.2016 16:55
Letzter Beitrag: nurmili
  Problem mit Delay und Millis funnyzocker 1 461 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Mehrere Abläufe gleichteitig mit "Millis" MarkusSpielt 3 675 11.04.2016 18:23
Letzter Beitrag: MarkusSpielt
  Kann ich in eine For Schleife einen delay einbauen JanGamer11 6 616 05.01.2016 12:34
Letzter Beitrag: Hilgi
  Rampe ohne Delay DC-Motor de_flexus 3 1.945 22.11.2015 13:07
Letzter Beitrag: frank2000
  Doppelblitz ohne Delay cleko 3 863 12.11.2015 08:02
Letzter Beitrag: Bitklopfer
  Leds blinken lassen mit if-Abfrage und millis ferdi 11 1.527 24.10.2015 08:54
Letzter Beitrag: Bitklopfer
  Langes delay - wie macht man das? Gelegenheitsbastler 17 2.442 02.09.2015 20:48
Letzter Beitrag: Gelegenheitsbastler
  mal wieder ein kleines Problem mit blinken ohne delay :) Sbbfreack 6 1.734 06.07.2015 15:59
Letzter Beitrag: Sbbfreack

Gehe zu:


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