Aufbauendes Lauflicht auf Knopfdruck FastLED

Hallo,
könnte mir jemand bei diesem Code behilflich sein.
Ich hätte gerne ein sich Aufbauendes Lauflicht das dann ca 1sek steht dann aus geht und wieder von vorne beginnt.
Und ausgelöst durch ein Knopfdruck.
Habe mir das was aus anderen Zusammengebastelt aber will nicht ganz so.
Muß auch nicht mit FastLED sein, Neopixel oder Adafruit.. geht auch
PS: bin kein Programmierer, nur learning by doing.

Danke

#include <FastLED.h>
#define NUM_LEDS 46 
#define DATA_PIN 2
int buttonPin = 4;     // the number of the pushbutton pin
CRGB leds[NUM_LEDS];
void setup() { 
  LEDS.addLeds<WS2812,DATA_PIN,GRB>(leds,NUM_LEDS);
  LEDS.setBrightness(100);
  pinMode(buttonPin, INPUT);
}
void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }
void loop() {
  int buttonState = digitalRead(buttonPin);
  static uint8_t hue = 0;
  if(buttonState == HIGH)
  for(int i = 0; i < NUM_LEDS; i++)
  {
     leds[i] = CRGB(255, 102, 0);
    FastLED.show(); 
    fadeall();
     delay(10);
  }
  for(int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(0, 0, 0);
    FastLED.show(); 
    fadeall();
      delay(10);
  }
  if(buttonState == LOW)
  {
    for(int i = 0; i < NUM_LEDS; i++)
    leds[i] = CRGB(0, 0, 0);
    FastLED.show(); 
    }
}

Überprüfe nochmal Anzahl LEDs und Ports.
Die Zeiten nach Belieben ändern...
Am Ende wird gewartet bis die Taste losgelassen wird.

#include <FastLED.h>

#define NUM_LEDS 46
#define DATA_PIN 2
int buttonPin = 4;     // the number of the pushbutton pin

CRGB leds[NUM_LEDS];

void setup() 
{
	LEDS.addLeds<WS2812,DATA_PIN,GRB>(leds,NUM_LEDS);
	LEDS.setBrightness(100);
	pinMode(buttonPin, INPUT);
}

void fadeall() 
{ 
	for(int i = 0; i < NUM_LEDS; i++) 
	{ 
		leds[i].nscale8(250); 
	} 
}


void loop() 
{
	int buttonState = digitalRead(buttonPin);
  	// ? static uint8_t hue = 0;

  	if(buttonState == HIGH)
  	{
  		for(int i = 0; i < NUM_LEDS; i++)
  		{
			leds[i] = CRGB(255, 102, 0);
			FastLED.show();
			//fadeall();
			//delay(10);
			delay(200);
  		}

		// Wartezeit
		delay(3000);

		// der Reihe nach ausmachen...
		/*
		for(int i = 0; i < NUM_LEDS; i++)
  		{
			leds[i] = CRGB(0, 0, 0);
			FastLED.show();
			//fadeall();
			delay(10);
  		}
		*/

		// ... oder ausblenden
		for(int i = 0; i <= 255; i++)	// über die Schleife wird die Helligkeit zurückgesetzt
  		{
			fadeall();
			FastLED.show();
			delay(10);
  		}

		/*
		if(buttonState == LOW)
		{
			for(int i = 0; i < NUM_LEDS; i++)
    				leds[i] = CRGB(0, 0, 0);
			FastLED.show();
		}
		*/

		buttonState = digitalRead(buttonPin);
		while(buttonState == HIGH)
			delay(10);
	}

	delay(10);
}

Hallo OtmarK,
vielen Dank, damit kann ich schon Experimentieren.

Benutze den Arduino Nano.
Den Button hab ich angeschloßen an GND und D2 <- Ist das überhaupt richtig? Reagiert nicht :frowning:

Beim Einschalten legt das Lauflicht gleich los! Kann man das unterbinden? Also wirklich nur wenn Button gedrückt ist.

Und kann man das Lauflicht wenn es Voll ist einfach Ausschalten, also nicht abblenden?

Danke
Gruss Robert

Hallo Robert,

das geht so nicht. D2 ist der DatenPin für die LED-Leiste. D4 wäre dein Eingang für den Button.
#define DATA_PIN 2
int buttonPin = 4; // the number of the pushbutton pin
Wenn du dir da unsicher bist, schau im Code, was mit den Pins gemacht wird.
pinMode(buttonPin, INPUT);

Bevor du was ausprobierst, gehe das Sketch/die Befehle mal durch ob du alles verstanden hast. Eventuell musst du auch mal was nachlesen (dazulernen :wink: )

Schau mal im Code. Da ist ein Kommentar "// der Reihe nach ausmachen...". Wenn du die nachfolgende Schleife einkommentiert (aufrufst), werden die LEDs der Reihe nach, mit 10 ms Verzögerung, ausgemacht.
(Der auskommentierte Aufruf von fade() mach hier keinen Sinn. Habe ihn drin gelassen weil er in deinem Code schon drin war).
Wenn Du das machst ist die Schleife nach dem Kommentar "// ... oder ausblenden" natürlich sinnlos, da die LEDs ja schon aus sind. Also kannst du dafür diese Schleife auskommentieren.

Mach dir mit Serial.begin(9600) die Schnittstelle auf und füge einige Ausgaben in den Ablauf ein.
z.B Serial.println("Taster betätigt");
Dann kannst du im Terminal sehen was dein Sketch gerade macht, bzw. wo es hängt.

Hab das Ganze übrigens mit dem ESP32 getestet und die PROG-Taste benutzt (die ich negieren musste). Aber das spielt keine Rolle. Das sollte schon so laufen.

Edit: Du solltest nicht unter Spannung umverdrahten! Hast du einen Widerstand ( 300 bis 500 Ohm) in der Datenleitung deines LED-Streifens?

Hallo,
wenn der Taster nach minus schaltete sollte das

PinMoode(Pin,INPUT_PULLUP)

sein wenn kein externer Widerstand verwendet ist sonst hängt der Eingang bei offenen Taster in der Luft

Wenn der Taster dann gedrückt wird ist mit

int buttonState = digitalRead(buttonPin)

der Wert von buttonState =0

invertiert mit "!"

int buttonState = !digitalRead(buttonPin);

wird dann eine 1 draus und die Logik stimmt

schöner wäre dann noch

bool buttonState = digitalRead(buttonPin);

Heinz

Ich schau mir das alles mal näher an.
Zur besseren Verständnis.
Ich möchte gerne das Nachbauen für meine Vespa
siehe Video von min. 01:33 - 01:40

Zuerst mal auf Knopfdruck und dann sehen wir weiter.

Hi

Da Du damit dann nicht mehr auf die Straße darfst (Eingriff in die Beleuchtungsanlage), blinkt die Vespa halt auf dem Hof - auch gut.
Ganz nebenbei muß der Balken binnen 200ms komplett gefüllt sein, darf aber nur am Stück aus gehen - auch wissen die Sheriffs, welches Vespa-Modell einen solchen Blinker 'von Haus aus' hat - Die kommen dann 'Mal Gucken'.

Wartezeit zwischen den einzelnen LEDs <=200ms/(Anzahl_LEDs-1)

Dann nur noch prüfen, ob der Knopf gedrückt ist, wenn ja, mit dem Aufbau beginnen, wenn alle An sind, Wartezeit, dann Alles aus, erneute Wartezeit.
Dann wieder Vorne anfangen.
Vll. noch was einbauen, daß man Links und Rechts blinken kann - kann elektrisch der gleiche Stripe sein, Du musst dann nur andere LEDs ansprechen.
Auch wirst Du wohl vorne und hinten einen Stripe vorsehen.

MfG

Ja, das mit StVO ist mir bekannt. Diese wird in Kroatien auf einer Insel gefahren. Da geht das in Ordnung :wink:

Habe das jetzt mal soweit am laufen. Auf Knopfdruck tut es soweit.
Grundgerüst steht :slight_smile:
Jetzt muss ich es nur noch so Umsetzen wie du es geschrieben hast.

#include <FastLED.h>

#define NUM_LEDS 46 
#define DATA_PIN 2

int buttonPin = 4;     // the number of the pushbutton pin
CRGB leds[NUM_LEDS];

void setup() { 
  LEDS.addLeds<WS2812,DATA_PIN,GRB>(leds,NUM_LEDS);
  LEDS.setBrightness(100);
  pinMode(buttonPin, INPUT_PULLUP);
}

void fadeall() { 
  for(int i = 0; i < NUM_LEDS; i++) { 
    leds[i].nscale8(250); 
  } 
}

void loop() {
  int buttonState = digitalRead(buttonPin);
  // static uint8_t hue = 0; // <-- does not seem to be used anywhere

  if(buttonState == LOW) { // <-- missing "{" here
    for(int i = 0; i < NUM_LEDS; i++)
    {
      leds[i] = CRGB(255, 102, 0);
      FastLED.show(); 
      fadeall();
      delay(10);
    }
    for(int i = 0; i < NUM_LEDS; i++)
    {
      leds[i] = CRGB(0, 0, 0);
      FastLED.show(); 
      fadeall();
      delay(10);
    }
  } // <-- missing "{" here
  else // <-- you can use "else" here (since a button is either LOW or HIGH ;-)
  if(buttonState == HIGH)
  {
    for(int i = 0; i < NUM_LEDS; i++) { // <-- missing "{" here
      leds[i] = CRGB(0, 0, 0);
    } // <-- missing "{" here
    FastLED.show(); 
  }
}

Gibts denn irgendwo eine Seite wo steht was das bedeutet oder macht?
int i = 0; i < NUM_LEDS; i++ <-- was ist den das für eine Programmiersprache?
gehört das zu FastLED oder Arduino

Hi

Bei 46 LEDs brauchst Du 460ms (ok, 450) - wirkt Das nicht schnarch lahm?
Kann mich Da auch irren - mittlerweile fährt ja schon jeder Golf mit so Blinkern rum - da freut man sich fast schon, wenn Mal Einer 'normal' blinkt (ok: wenn 'se Mal blinken ...).

Schön, daß Du bereits Erfolge erzielst :slight_smile:

MfG

PS: Aber das Mopped darf Dort schon aus eigener Kraft ... also nicht an einem Esel angebunden :wink:

PS: Das nennt sich wohl C++.
Als Erstes definierst Du eine neue Variable - hier 'i' vom Typ int (-32768...32767).
Dahinter steht die Bedingung der Schleife - wenn 'i' kleiner als NUM_LEDS ist - wenn Das nicht gegeben ist, ist die Schleife eh vorbei!
Als Drittes, was dann (außer dem Abarbeiten der Schleife) passieren soll - hier wird i um 1 erhöht.
Man kann davon auch 'was' weglassen - sogar Alles, bis auf die zwei ; - dann hat man eine Endlos-Schleife - Das sind aber Spezialitäten, Die Dir geschlagene C++'er eher näher bringen sollten.

robiv8:
Gibts denn irgendwo eine Seite wo steht was das bedeutet oder macht?

Control structure > For

Die »for«-Schleife (ein C-Buch!)

Ich Danke schon mal für die vielen TIPs
Werde mich ein wenig einlesen.

@postmaster-ino
Die Esel Zeiten sind schon seit 40-50 Jahren vorbei, Leider. Mann wünscht sich doch immer öfter diesen Ruhigen, Stresslosen und unhektischen Zeiten zurück.
Nur so by the way, egal auf welcher Insel, Wüste, Dschungel oder Berge du in Kroatien bist. Voller LTE Empfang.
Meine Eltern haben in der Großstadt Stuttgart teilweise Funklöcher in der Stadt. "Kopfschüttel"
Während DE über Maut oder Elektronisches Parken per Handy Nachdenkt und Testet läuft das schon seit den 90er Erfolgreich in Cro
:wink:

Hi

Naja - für so was halten wir uns halt die CDU - Das schafft sonst auch kein halbwegs intelligentes Volk auf dem Planeten ...
Davon abgesehen ... ich wüsste gar nicht, ob mein Handy/mein Vertrag überhaupt was mit LTE anfangen könnte :wink:
Und wenn, wäre mir Das wohl auch nicht bewusst.
Ruhige Zeiten ... zumindest die Vor-Handy-Eppoche wäre teilweise wieder ganz angenehm :wink:

MfG