LEDs ausschalten mit Fastled

Hallo Zusammen,

ich habe folgendes Problem:
ich möchte mit einem Taster ein Lauflicht mit Fastled an und ausschalten. Es soll auch immer mit der ersten LED beginnen.
Es hängt jetzt aber beim ausschalten. Das bekomme ich nicht hin.
Danke für eure Hilfe!

#include "FastLED.h"

//Data-pins: Ausgänge für die LED-Strips
       
#define DATA_PIN_1    2        // 1.Strip
#define DATA_PIN_2    3        // 2.Strip
#define DATA_PIN_3    4        // 3.Strip  
#define DATA_PIN_4    5        // 4.Strip
#define DATA_PIN_5    6        // 5.Strip

#define LED_TYPE    WS2811     //Chip-Typ des-LED Bandes
#define COLOR_ORDER GRB        // "Color-Order" --> Farben Reihenfolge

//Helligkeit und Framerate festlegen
#define BRIGHTNESS          96
#define FRAMES_PER_SECOND  60

//Anzahl der Strips auf dem jeweiligen LED-Band
#define NUM_LEDS1    34

//Anzahl der Leds dem jeweiligen Band zuordnen
CRGB leds1[NUM_LEDS1];

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin0 = A0;    // the number of the pushbutton pin
const int ledPin0 = 13;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
 delay(3000);
 pinMode(buttonPin0, INPUT);
 pinMode(ledPin0, OUTPUT);

 // set initial LED state
 digitalWrite(ledPin0, ledState);
 
 FastLED.addLeds<LED_TYPE,DATA_PIN_1,COLOR_ORDER>(leds1, NUM_LEDS1).setCorrection(TypicalLEDStrip);
 FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
 // read the state of the switch into a local variable:
 int reading = digitalRead(buttonPin0);

 // check to see if you just pressed the button
 // (i.e. the input went from LOW to HIGH),  and you've waited
 // long enough since the last press to ignore any noise:

 // If the switch changed, due to noise or pressing:
 if (reading != lastButtonState) {
  
   // reset the debouncing timer
   lastDebounceTime = millis();
 }

 if ((millis() - lastDebounceTime) > debounceDelay) {
   // whatever the reading is at, it's been there for longer
   // than the debounce delay, so take it as the actual current state:

   // if the button state has changed:
   if (reading != buttonState) {
     buttonState = reading;

     // only toggle the LED if the new button state is HIGH
     if (buttonState == HIGH) {
       ledState = !ledState;
       
     }
   }
 }

 // set the LED:
 digitalWrite(ledPin0, ledState);
 if (ledState==HIGH){
  
   FastLED.show();
   FastLED.delay(1000/FRAMES_PER_SECOND);
   fadeToBlackBy( leds1, NUM_LEDS1, 50);
   int pos1 = beatsin16(20,0,NUM_LEDS1);
   leds1[pos1] += CRGB( 255,0,0);}
 
 
 
 if (ledState==LOW){
   FastLED.clear ();

   }
 
 // save the reading.  Next time through the loop,
 // it'll be the lastButtonState:
 lastButtonState = reading;
}

Warum verwendest du keine Code-Tags für den Sketch ?

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

togru:
Es hängt jetzt aber beim ausschalten. Das bekomme ich nicht hin.

Das sollte mit "schwarz bzw. Black" funktionieren.

Danke, aber es funktioniert mit FastLED.clear (); FastLED.show (); oder indem man einfach die Farbe 'schwarz' verwendet.

Jetzt hat sich ein weiteres Problem ergeben.
Ich möchte mit 5 Tastern 5 Strips ansteuern. Die Strips werden über ein Netzteil versorgt.
Über entsprechend 5 Arduino Outputs werden die Dataanschlüsse des LED-Bandes angesteuert.

Es kommt nun aber zu 'Ausfällen' einzelner LEDs wenn alle Lauflichter an sind.
Hat jemand eine Idee woran das liegen kann?

void loop() {
  
  //TASTER 1
  
  // read the state of the switch into a local variable:
  int reading1 = digitalRead(button1);

  
  // If the switch changed, due to noise or pressing:
  if (reading1 != lastButtonState1) {
    delay(350);
   buttonState1 = reading1;
  }

      // only toggle the LED if the new button state is HIGH
      if (buttonState1 == HIGH) {
        ledState1 = !ledState1;
        
      }
    
  

  // set the LED:
  digitalWrite(buttonled1, ledState1);
  if (ledState1==HIGH){
   
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds1, NUM_LEDS1, 80);
    int pos1 = beatsin16(7,0,NUM_LEDS1);
    leds1[pos1] += CRGB( 255,0,0);}
  
  
  
  if (ledState1==LOW){
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds1, NUM_LEDS1, 80);
    int pos1 = beatsin16(7,0,NUM_LEDS1);
    leds1[pos1] += CRGB( 0,0,0);
        }
  
  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState1 = reading1;
  
  
  
  
  
  //TASTER 2
  
  // read the state of the switch into a local variable:
  int reading2 = digitalRead(button2);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
   if (reading2 != lastButtonState2) {
    delay(350);
   buttonState2 = reading2;
  }

      // only toggle the LED if the new button state is HIGH
      if (buttonState2 == HIGH) {
        ledState2 = !ledState2;
        
      }

  // set the LED:
  digitalWrite(buttonled2, ledState2);
  if (ledState2==HIGH){
   
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds2, NUM_LEDS2, 60);
    int pos2 = beatsin16(5,0,NUM_LEDS2);
    leds2[pos2] += CRGB( 255,0,0);}
  
  
  
  if (ledState2==LOW){
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds2, NUM_LEDS2, 60);
    int pos2 = beatsin16(5,0,NUM_LEDS2);
    leds2[pos2] += CRGB( 0,0,0);
    }
  
  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState2 = reading2;
  
  
  
  //TASTER 3
  
  // read the state of the switch into a local variable:
  int reading3 = digitalRead(button3);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
   if (reading3 != lastButtonState3) {
    delay(350);
   buttonState3 = reading3;
  }

      // only toggle the LED if the new button state is HIGH
      if (buttonState3 == HIGH) {
        ledState3 = !ledState3;
        
      }

  // set the LED:
  digitalWrite(buttonled3, ledState3);
  if (ledState3==HIGH){
   
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds3, NUM_LEDS3, 80);
    int pos3 = beatsin16(7,0,NUM_LEDS3);
    leds3[pos3] += CRGB( 255,0,0);}
  
  
  
  if (ledState3==LOW){
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds3, NUM_LEDS3, 80);
    int pos3 = beatsin16(7,0,NUM_LEDS3);
    leds3[pos3] += CRGB( 0,0,0);
    }
  
  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState3 = reading3;
  
  
  //TASTER 4
  
  // read the state of the switch into a local variable:
  int reading4 = digitalRead(button4);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
   if (reading4 != lastButtonState4) {
    delay(350);
   buttonState4 = reading4;
  }

      // only toggle the LED if the new button state is HIGH
      if (buttonState4 == HIGH) {
        ledState4 = !ledState4;
        
      }

  // set the LED:
  digitalWrite(buttonled4, ledState4);
  if (ledState4==HIGH){
   
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds4, NUM_LEDS4, 80);
    int pos4 = beatsin16(5,0,NUM_LEDS4);
    leds4[pos4] += CRGB( 255,0,0);}
  
  
  
  if (ledState4==LOW){
   FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds4, NUM_LEDS4, 80);
    int pos4 = beatsin16(5,0,NUM_LEDS4);
    leds4[pos4] += CRGB( 0,0,0);
    }
  
  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState4 = reading4;
  
  
  //TASTER 5
  
  // read the state of the switch into a local variable:
  int reading5 = digitalRead(button5);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
   if (reading5 != lastButtonState5) {
    delay(350);
   buttonState5 = reading5;
  }

      // only toggle the LED if the new button state is HIGH
      if (buttonState5 == HIGH) {
        ledState5 = !ledState5;
        
      }

  // set the LED:
  digitalWrite(buttonled5, ledState5);
  if (ledState5==HIGH){
   
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds5, NUM_LEDS5, 80);
    int pos5 = beatsin16(5,0,NUM_LEDS5);
    leds5[pos5] += CRGB( 255,0,0);}
  
  
  
  if (ledState5==LOW){
    FastLED.show();
    FastLED.delay(1000/FRAMES_PER_SECOND);
    fadeToBlackBy( leds5, NUM_LEDS5, 80);
    int pos5 = beatsin16(5,0,NUM_LEDS5);
    leds5[pos5] += CRGB( 0,0,0);
    }
  
  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState5 = reading5;

}

Evtl. reicht der Strom von deinem Netzteil nicht aus.
Poste mal ein paar mehr Informationen, z.B. Daten des Netzteils und wieviel Leds du ansteuerst.
Und du solltest immer den kompletten Sketch posten.
Meist liegt das Problem am geheimen Teil des Sketches.

Der Strom reicht aus. Ich habe ein 30V/10A, da sollte das kein Problem sein. Das LED-Band arbeitet mit 5V. Es handelt sich um dieses: https://www.amazon.de/Meter-Digitaler-LED-Streifen-Chip/dp/B00N4ZDTXS/ref=sr_1_1?ie=UTF8&qid=1490853073&sr=8-1&keywords=3%2C5+meter+5V+digitaler+led+streifen+(60

Hier der erste Teil des Codes: Danach kommt dann die Loop Schleife von oben. Der ganze Code ist am Stück zu lang...

#include "FastLED.h"

//Data-pins: Ausgänge für die LED-Strips
        
#define DATA_PIN_1    2        // 1.Strip
#define DATA_PIN_2    3        // 2.Strip
#define DATA_PIN_3    4        // 3.Strip  
#define DATA_PIN_4    5        // 4.Strip
#define DATA_PIN_5    6        // 5.Strip

#define LED_TYPE    WS2811     //Chip-Typ des-LED Bandes
#define COLOR_ORDER GRB        // "Color-Order" --> Farben Reihenfolge

//Helligkeit und Framerate festlegen
#define BRIGHTNESS          96
#define FRAMES_PER_SECOND  60

//Anzahl der Strips auf dem jeweiligen LED-Band
#define NUM_LEDS1    34
#define NUM_LEDS2    51
#define NUM_LEDS3    23 
#define NUM_LEDS4    34 
#define NUM_LEDS5    29

//Anzahl der Leds dem jeweiligen Band zuordnen
CRGB leds1[NUM_LEDS1];
CRGB leds2[NUM_LEDS2];
CRGB leds3[NUM_LEDS3];
CRGB leds4[NUM_LEDS4];
CRGB leds5[NUM_LEDS5];

//Variablen für die INPUT pins der Taster--> Analog pins des Arduinos 
const int button1 = A0;    //  --> Taster 1
const int button2 = A1;    //Taster 2 ...
const int button3 = A2;
const int button4 = A3;
const int button5 = A4;    // Taster 5
const int resetbutton = A5;  //Reset Taster Input

//Taster-LED Pins Ausgang (Digitale Pins)
const int buttonled1 = 13;      // ---> Taster Led 1
const int buttonled2 = 8;      //TAster-Led 3...
const int buttonled3 = 9;
const int buttonled4 = 10;
const int buttonled5 = 11;     //Taster LED 5

// Variables will change:
int ledState1 = LOW;         // the current state of the output pin
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
int buttonState1;             // the current reading from the input pin
int lastButtonState1 = LOW;   // the previous reading from the input pin
int buttonState2;             // the current reading from the input pin
int lastButtonState2 = LOW;   // the previous reading from the input pin
int buttonState4;             // the current reading from the input pin
int lastButtonState4 = LOW;   // the previous reading from the input pin
int buttonState3;             // the current reading from the input pin
int lastButtonState3 = LOW;   // the previous reading from the input pin
int buttonState5;             // the current reading from the input pin
int lastButtonState5 = LOW;   // the previous reading from the input pin
int buttonState6;             // the current reading from the input pin
int lastButtonState6 = LOW;   // the previous reading from the input pin


void setup() {
  delay(3000); // 3 second delay for recovery
  
  //INPUT-Pins deklarieren
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(button5, INPUT);
  pinMode(resetbutton, INPUT);
  
  //OUTPUT-Pins deklarieren
  pinMode(buttonled1, OUTPUT);
  pinMode(buttonled2, OUTPUT);
  pinMode(buttonled3, OUTPUT);
  pinMode(buttonled4, OUTPUT);
  pinMode(buttonled5, OUTPUT);

  // set initial LED state
  digitalWrite(buttonled1, ledState1);
  digitalWrite(buttonled2, ledState2);
  digitalWrite(buttonled3, ledState3);
  digitalWrite(buttonled4, ledState4);
  digitalWrite(buttonled5, ledState5);
  
  FastLED.addLeds<LED_TYPE,DATA_PIN_1,COLOR_ORDER>(leds1, NUM_LEDS1).setCorrection(TypicalLEDStrip);  //fügt den LED-Strip hinzu
  FastLED.addLeds<LED_TYPE,DATA_PIN_2,COLOR_ORDER>(leds2, NUM_LEDS2).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<LED_TYPE,DATA_PIN_3,COLOR_ORDER>(leds3, NUM_LEDS3).setCorrection(TypicalLEDStrip); 
  FastLED.addLeds<LED_TYPE,DATA_PIN_4,COLOR_ORDER>(leds4, NUM_LEDS4).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<LED_TYPE,DATA_PIN_5,COLOR_ORDER>(leds5, NUM_LEDS5).setCorrection(TypicalLEDStrip);
  
  // set master brightness control 
  FastLED.setBrightness(BRIGHTNESS);
}

Und jetzt die Gretchenfrage: Wie machst du aus 30 Volt die 5 Volt für die Led-Stripes ?

Deine 10 A sind knapp an der Grenze, also so einfach "sollte wohl ausreichen" ist das nicht.

Es ist noch ein Versuchsaufbau mit Schaltnetzteil an dem ich einfach 5Volt einstellen kann. Strom reicht auch aus. Das Netzteil würde ich als Fehlerquelle ausschließen... ::slight_smile:

Dann ist es die Verkabelung. Störungen von ausserhalb. "Ausschließen" kannst du sowas nicht! Das sagen alle, bei denen das Problem bestand! Spannugen gemessen an der letzen Led? Wie hoch?

Die Frage ist eben auch die: liefert das 30V Netzteil die 10 A auch bei 5V? ist es genügend gepuffert, um die Pulsströme die Du da durch die PWM, mit der die Strips gesteuert werden, hast, auch abzufangen?

LG Stefan

togru:
Es ist noch ein Versuchsaufbau mit Schaltnetzteil an dem ich einfach 5Volt einstellen kann. Strom reicht auch aus. Das Netzteil würde ich als Fehlerquelle ausschließen... ::slight_smile:

Hast du die Spannung mal im Betrieb gemessen ?
Am Besten mit einem Oszilloskop.

Der von dir beschriebene Fehler tritt oft bei Spannungseinbrüchen auf.

Dann werde ich das mal tun.
Softwaretechnisch seht ihr keinen Fehler?

togru:
Es kommt nun aber zu 'Ausfällen' einzelner LEDs wenn alle Lauflichter an sind.
Hat jemand eine Idee woran das liegen kann?

WS2811 habe ich nicht, aber WS2812 sind bezüglich der Länge der Datenleitung empfindlich. Bei APA102 (Daten und Takt getrennt) habe ich mit abgeschirmten Kabeln Verbesserungen erzielen können.

togru:
Es ist noch ein Versuchsaufbau mit Schaltnetzteil an dem ich einfach 5Volt einstellen kann. Strom reicht auch aus. Das Netzteil würde ich als Fehlerquelle ausschließen... ::slight_smile:

Strom reicht nicht aus wenn alle LED weiß angesteuert werden sind das fast 13A.

Du kannst das Netzteil ausschließen indem Du einen oder 2 der 5 Streifen abklemmst (Netzteil und Datenkeitung).

Grüße Uwe