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
Schleife (Durchlauf) abbrechen wann ich es will
22.01.2019, 10:17 (Dieser Beitrag wurde zuletzt bearbeitet: 22.01.2019 10:18 von EXCLUZIVE.)
Beitrag #1
Schleife (Durchlauf) abbrechen wann ich es will
Hallo Community,

ich habe ein Projekt mit dem NeoPixel LED Ring gestartet und habe einige Variationen programmiert, mein Problem ist aber das wenn eine Variation durchläuft ich die nicht wechseln kann wann ich es will, sondern erst warten muss bis die Schleife durchgelaufen ist.

Vielleicht kann mir jemand dabei helfen, habe es schon mit break versucht, aber ohne Erfolg.

Code:
#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

#define PIN 6
#define NUMPIXELS 8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

SoftwareSerial BTSerial(2, 3); //RX | Tx

char data;
int helligkeit=255;

void setup() {
  Serial.begin(9600);
  Serial.println("Start communication");
  BTSerial.begin(38400);

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  strip.setBrightness(255);

}

void loop() {
  if(BTSerial.available()>0)  {
    data = BTSerial.read();
    BTSerial.println(data);
  }
    
    switch(data) {
      case '0': //aus
          colorWipe(strip.Color(0, 0, 0),0);
      break;  

      case '1': //Stark
            helligkeit = min( 255, helligkeit + 25);
            Serial.println(helligkeit);
            strip.setBrightness(helligkeit);
            strip.show();
            data = ' ';
      break;

      case '2': //Schwach
            helligkeit = max( 30, helligkeit - 25);
            Serial.println(helligkeit);
            strip.setBrightness(helligkeit);
            strip.show();
            data = ' ';
      break;
      
      case 'a': //rot
          colorWipe(strip.Color(255, 0, 0),50);
      break;

      case 'b': //dunkel orange
          colorWipe(strip.Color(255, 25, 0),50);
      break;

      case 'c': //orange
          colorWipe(strip.Color(255, 50, 0),50);
      break;
      
      case 'd': //hellorange
          colorWipe(strip.Color(255, 75, 0),50);
      break;

      case 'e': //Gelb
          colorWipe(strip.Color(255, 155, 0),50);
      break;
      
      case 'f': //Grün
          colorWipe(strip.Color(0, 255, 0),50);
      break;
    
      case 'g'://Hellgrün
          colorWipe(strip.Color(50, 255, 50),50);
      break;  
      
      case 'h'://Hellblau_1
          colorWipe(strip.Color(75, 255, 255),50);
      break;  

      case 'i'://Hellblau_2
          colorWipe(strip.Color(0, 200, 255),50);
      break;  

      case 'j'://Hellblau_3
          colorWipe(strip.Color(0, 60, 255),50);
      break;  

      case 'k'://Blau
          colorWipe(strip.Color(0, 0, 255),50);
      break;

      case 'l'://Dunkelblau
          colorWipe(strip.Color(75, 0, 255),50);
      break;    
      
      case 'm'://Lila
          colorWipe(strip.Color(150, 0, 255),50);
      break;
      
      case 'n'://Hell_lila
          colorWipe(strip.Color(200, 25, 255),50);
      break;

      case 'o'://Pink
          colorWipe(strip.Color(255, 0, 255),50);
      break;

      case 'p'://Weiss
          colorWipe(strip.Color(255, 255, 255),50);
      break;  

      case 'q': // Farb wechsel
          colorchange(100);  //speed von farbwechsel  
      break;

      case 'r': //Blink
        colorWipe(strip.Color(255, 0, 0), 50);  // Red
        colorWipe(strip.Color(0, 255, 0), 50);  // Green
        colorWipe(strip.Color(0, 0, 255), 50);  // Blue
        theaterChase(strip.Color(  0,   0, 127), 50); // Blue
        theaterChase(strip.Color(127,   0,   0), 50); // Red
        theaterChase(strip.Color(0,   127,   0), 50); // Green
      break;  

      case 's': //Regenbogen
        rainbowCycle(25);    
      break;  

      case 't': //Zufall
            long randNumber = random(16);
              if(randNumber==0)
                data='a';
              if(randNumber==1)
                data='b';
              if(randNumber==2)
                data='c';
              if(randNumber==3)
                data='d';
              if(randNumber==4)
                data='e';
              if(randNumber==5)
                data='f';
              if(randNumber==6)
                data='g';
              if(randNumber==7)
                data='h';
              if(randNumber==8)
                data='i';
              if(randNumber==9)
                data='j';
              if(randNumber==10)
                data='k';
              if(randNumber==11)
                data='l';
              if(randNumber==12)
                data='m';
              if(randNumber==13)
                data='n';
              if(randNumber==14)
                data='o';
              if(randNumber==15)
                data='p';        
         break;      
        
    }  
  
  delay(10);    

}

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.setBrightness(helligkeit);
        strip.show();
        data = ' ';
    delay(wait);
  }
}
//Wichtig für den Regenbogen
void colorchange(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*1+j) & 255));
    }
        strip.show();
        data = ' ';
    delay(wait);
  }
}

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

  for(j=0; j<256*10; 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();
        data = ' ';
    delay(wait);
  }
}

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();
        data = ' ';

      delay(wait);

      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 10:26
Beitrag #2
RE: Schleife (Durchlauf) abbrechen wann ich es will
Welche Schleife willst Du denn abbrechen?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 10:29
Beitrag #3
RE: Schleife (Durchlauf) abbrechen wann ich es will
(22.01.2019 10:26)Tommy56 schrieb:  Welche Schleife willst Du denn abbrechen?

Gruß Tommy

Also ich habe die Variationen:
Code:
case 'q': // Farb wechsel
          colorchange(100);  //speed von farbwechsel  
      break;

      case 'r': //Blink
        colorWipe(strip.Color(255, 0, 0), 50);  // Red
        colorWipe(strip.Color(0, 255, 0), 50);  // Green
        colorWipe(strip.Color(0, 0, 255), 50);  // Blue
        theaterChase(strip.Color(  0,   0, 127), 50); // Blue
        theaterChase(strip.Color(127,   0,   0), 50); // Red
        theaterChase(strip.Color(0,   127,   0), 50); // Green
      break;  

      case 's': //Regenbogen
        rainbowCycle(25);    
      break;

und das sind die "Schleifen" dafür:
Code:
void colorchange(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*1+j) & 255));
    }
        strip.show();
        data = ' ';
    delay(wait);
  }
}

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

  for(j=0; j<256*10; 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();
        data = ' ';
    delay(wait);
  }
}

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();
        data = ' ';

      delay(wait);

      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 10:45
Beitrag #4
RE: Schleife (Durchlauf) abbrechen wann ich es will
Die innere Schleife (Farben setzen) kannst Du lassen, die läuft schnell genug durch.

Die äußere Schleife solltest Du weg lassen. Du hat ja schon eine große Schleife: loop

Schau Dir BlinkWithoutdelay an und baue die Zeitsteuerung mit millis() auf.
Dann kannst Du in jedem Durchlauf unterbrechen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 10:48
Beitrag #5
RE: Schleife (Durchlauf) abbrechen wann ich es will
(22.01.2019 10:45)Tommy56 schrieb:  Die innere Schleife (Farben setzen) kannst Du lassen, die läuft schnell genug durch.

Die äußere Schleife solltest Du weg lassen. Du hat ja schon eine große Schleife: loop

Schau Dir BlinkWithoutdelay an und baue die Zeitsteuerung mit millis() auf.
Dann kannst Du in jedem Durchlauf unterbrechen.

Gruß Tommy

Also mein Wunsch ist es wenn z.B Variation 1 läuft, ich sofort wechseln kann und nicht warten muss, und das kriege ich nicht hin, und leider verstehe ich dein Vorschlag nicht, da ich nicht gerade eine 1+ in Programmieren bin.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 10:57
Beitrag #6
RE: Schleife (Durchlauf) abbrechen wann ich es will
Dann schaue Dir BlinkWithoutDelay in den Beispielen Deiner IDE an and suche nach der Nachtwächtererklärung.
Das Verstehen können wir Dir nicht abnehmen. Das musst Du selbst erledigen. Wenn Du konkrete Frage dazu hast, kannst Du sie stellen. Ich verstehe es nicht ist keine konkrete Fage.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 12:35
Beitrag #7
RE: Schleife (Durchlauf) abbrechen wann ich es will
(22.01.2019 10:48)EXCLUZIVE schrieb:  Also mein Wunsch ist es wenn z.B Variation 1 läuft, ich sofort wechseln kann und nicht warten muss, und das kriege ich nicht hin, und leider verstehe ich dein Vorschlag nicht, da ich nicht gerade eine 1+ in Programmieren bin.

Um Dein Programm schrittweise weiterzuentwickeln, könntest Du Dich fragen, was es denn gerade macht, wenn es nicht antwortet. Eigentlich hast Du die Frage ja sogar schon beantwortet: Es arbeitet in einer langen Schleife in einer der Effekt-Funktionen.

Da siehst Du dann zum Beispiel bei theaterChase, daß der Effekt 10mal abgespielt wird, bevor die Funktion beendet wird und Dein Programm wieder in die Hauptschleife zurückkehrt, wo es neue Kommandos entgegennimmt.

Du könntest jetzt theaterChase so ändern, daß es den Effekt nur einmal abspielt, und Dein Programm wäre schon deutlich antwortfreudiger.

Damit die Ausgabe aber weiter so aussieht wie vorher, baust Du dann einen Zähler in loop () ein, der von 10 runterzählt und theaterChase jedesmal aufruft, solange er noch > 0 ist.

Den gleichen Zähler kannst Du für alle Effekte nehmen, die mehr als einmal durchlaufen werden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 15:18
Beitrag #8
RE: Schleife (Durchlauf) abbrechen wann ich es will
Statische Variablen können dir hier auch sehr helfen!

Hier kannst du sehen, wie sie funktionieren - und hast auch gleich einen Hinweis auf die Lösung deines Problems.

In der heutigen Zeit ist gesunder Menschenverstand so etwas Ähnliches wie eine Superkraft - aber keine nützliche.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Berücksichtigung des A0-Einganges in if-Schleife Joergi-1911 3 242 17.02.2019 16:33
Letzter Beitrag: Tommy56
Wink for Schleife im Void setup() Rockman 12 708 20.01.2019 15:17
Letzter Beitrag: Arduinero
  Schleife in der Schleife nanoheld 2 272 06.01.2019 17:08
Letzter Beitrag: Fips
  Verständnisfrage schleife Rasa 12 607 06.01.2019 17:00
Letzter Beitrag: Tommy56
  Anfänger hängt in der Schleife mt14516 2 517 24.09.2018 20:54
Letzter Beitrag: MicroBahner
  Schleife bei Zeit x abbrechen BitsAndBytes 7 999 23.09.2018 00:30
Letzter Beitrag: BitsAndBytes
  Schleife per Tastendruck unterbrechen und andere Schleife starten Thor Wallhall 13 1.607 19.07.2018 21:50
Letzter Beitrag: Thor Wallhall
  Unverständnis bei FOR-Schleife Telefonmann 3 811 22.02.2018 14:29
Letzter Beitrag: Telefonmann
  Variablenname über Schleife deklarieren golden_eagle 9 1.800 12.02.2018 22:36
Letzter Beitrag: golden_eagle
  Schleife nach else beenden Chef_2 24 3.280 08.02.2018 23:28
Letzter Beitrag: Franz54

Gehe zu:


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