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
wiedermal delay - sorry
05.12.2014, 22:57
Beitrag #1
Bug wiedermal delay - sorry
Hi an alle!

Habe jetzt tagelang hier und woanders gesucht und nix wirklich hilfreiches gefunden...
Betrifft das delay-Problem.
Will einen Aufbau von LEDs (WS2812b) steuern lassen, verschiedenartig durch entsprechende Programme welche mit einem Taster aufgerufen werden.
Leider wird durch die delays der einzelnen Funktionen (50 ms Wartezeit bis die nexte LED schaltet) alles angehalten und nach dem alle LEDs angesprochen wurden bleibt die letzte "Situation" gespeichert. Erst dann funktioniert der Taster und ich kann in den nexten Case schalten...
Bitte um Hilfe, die delays in den einzelnen void´s (ColorWipe oder TheaterChase usw) müssen ersetzt werden....
Denkanstöße wie "Blink without delay" haben nicht geholfen....!
Vllt ist von Vorteil das ich gerne in jeder Funktion das delay auf 50ms haben kann. Also könnte vllt auch eine einzige Timerfunktion oder ähnliches reichen die nach jedem setzen einer LED ausgeführt wird.

Code:
// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
// press the button it will change to a new pixel animation.  Note that you need to press the
// button once to start the first animation!

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.

#define PIXEL_PIN    6    // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 49

// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;



void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);
  
  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 9)
        showType=0;
      startShow(showType);
    }
  }

  // Set the last button state to the old state.
  oldState = newState;
  
  
  
  
}

void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
            break;
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
            break;
    case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
            break;
    case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
            break;
    case 7: rainbow(20);
            break;
    case 8: rainbowCycle(20);
            break;
    case 9: theaterChaseRainbow(50);
            break;
  }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
    
      delay(wait);
    
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
      
        delay(wait);
      
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.12.2014, 08:11
Beitrag #2
RE: wiedermal delay - sorry
Hallo,

wenn du unbedingt bei den delays beleiben willst, musst du wohl oder übel immer zwischndurch den Schalter erneut abfragen. Alternativ den Schalter über Interrupt überwachen. Allerdings wird der Wechsel des Programmes auch dann immer erst nach Durchlauf der Schleife stattfinden.

Blink without delay bietet hier tatsächlich die brauchbarste Grundlage, an jeder Stelle das Programm zu wechseln.

Gruß Rainer
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 23:19
Beitrag #3
RE: wiedermal delay - sorry
Mir kommt spontan die Frage wie klein du delay min machen kannst, damit der Taster sicher entprellt ist... Hast du das mal probiert?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2015, 11:38 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2015 12:08 von rkuehle.)
Beitrag #4
RE: wiedermal delay - sorry
Moin,

ich glaube 20 MS zum Entprellen des Tasters sind ein bisschen knapp. Ich nutze immer 100 bis 200 ms. Eine Beschaltung wie zB. hier: http://we-mod-it.com/board1-modding/boar...entprellt/ vorausgesetzt.

So wie der Code geschrieben ist, würde, egal ob mit delay() oder Ersatzfunktion, immer erst die jeweilige Funktion komplett abgearbeitet werden (müssen).
Möchtest du jedoch zB. von ColorWipe() zu rainBow() wechseln, bevor ColorWipe() vollständig abgearbeitet wurde, wirst du um eine Interruptabfrage im LOW-Mode auf den Taster nicht herum kommen. In der InterruptServiceroutine (ISR) setzt du dann showType um eins hoch und einen Zeitwert auf millis() (zB. globale Variable volatile unsigned long lastklick ).Dann setzt du in der ISR noch eine volatile "KickOff" - Variable die du in der Funktion abfragen kannst.
In der jeweiligen Funktion selbst fragst du dann ab
Code:
while (millis() - lastklick <= 50) if (KickOff==true) break;
KickOff=false;
return;
solange wie Zeit noch nicht vergangen mache nix, es sei denn KickOff ist gesetzt (Taster gedrückt). Ansonsten eben die Zeit warten, KickOff auf false und raus aus der Funktion.
So könnte es gehen.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2015, 12:38 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2015 12:39 von Wampo.)
Beitrag #5
RE: wiedermal delay - sorry
Hy,

sowas ähnliches hab ich hier auch schon gefragt. Vielleicht hilft dir der Thread n bissl weiter.
Auf der zweiten Seite!

http://www.arduinoforum.de/arduino-Threa...-6er-Modus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2015, 12:54
Beitrag #6
RE: wiedermal delay - sorry
Vielleicht kannst Du das gebrauchen.
Damit kann man mit dem Taster vorzeitig aus dem Delay raus.
Anstelle der delays diese Funktion aufrufen
Code:
// ----------------------------------------------------------------------------------------------
int Abbruch = 10;  // Taster Abbruch Pin 10
word mSek = 0;
// ############################################################################
void setup() {
  pinMode(Abbruch, INPUT_PULLUP); // Taster 10 Eingang mit Pullup-Widerstand
}  
// ############################################################################
void loop() {
  // Programm
  Delay_Abbruch(2000); // ca 2Sek. ohne Abbruch
  // Programm
}  
// ############################################################################
void Delay_Abbruch(unsigned long Zeit) {
  mSek = 0;
  while(mSek < Zeit) { // Zeit in mSek.
    delayMicroseconds(1000); //Feinabgleich für 1 mSek
    mSek++;  
    if (digitalRead(Abbruch) == LOW) {
      break;
    }
  }  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2015, 17:26 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2015 17:27 von MaHa1976.)
Beitrag #7
RE: wiedermal delay - sorry
vielleicht hilft auch mein Sketch zu IR Fernbedienung... ich mache den Farbwechsel mit sanftem Überblenden und kann auch jederzeit den aktuellen Farbverlauf abbrechen um in einen anderen zu wechseln...

und dann könntest du bei Adafruit auf der Homepage mal schauen... die haben da auch ganz viele Beispiele...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2015, 13:35
Beitrag #8
RE: wiedermal delay - sorry
Ich frage mich, ob der OP überhaupt noch mitliest. Er hat vor einem Monat seine Frage gestellt und sich seitdem nicht mehr gemuckst...

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Delay nurmili 2 219 10.07.2016 16:55
Letzter Beitrag: nurmili
  Problem mit Delay und Millis funnyzocker 1 459 26.06.2016 09:54
Letzter Beitrag: hotsystems
  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.944 22.11.2015 13:07
Letzter Beitrag: frank2000
  Doppelblitz ohne Delay cleko 3 858 12.11.2015 08:02
Letzter Beitrag: Bitklopfer
  Langes delay - wie macht man das? Gelegenheitsbastler 17 2.437 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
  Blink ohne Delay - Merkwürdiger Fehler rave 7 1.835 11.05.2015 06:29
Letzter Beitrag: Bitklopfer
  Multitasking mit millis statt delay LEDstar 2 1.251 15.04.2015 11:25
Letzter Beitrag: Bitklopfer
  Alternative zu delay gesucht Gelegenheitsbastler 3 1.232 28.03.2015 19:51
Letzter Beitrag: Gelegenheitsbastler

Gehe zu:


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