Hallo,
nach langer Suche im www frage ich nun euch was ich nicht bedacht habe bei meinem kleinen Code.
Ich bin neu in der Arduino-Szene und kenne mich sogut wie gar nicht mit dem Programmieren von dem kleinen aus.
Vorhanden ist folgendes:
-Arduino Nano
-1m 144LEDs WS2812B Strip
[mehr brauch ich nicht]
Ziel:
-ein Programm mit einem Lauflicht mit Schweif in eine Richtung und ein weiteres mit allen LEDs, welche gleichzeitig langsam aufleuchten und wieder abdunkeln. Beides in Dauerschleife bis ein Taster betätigt wird.
Der Taster soll die beiden Programme umschalten können und einen "Aus"-Zustand davor haben.
Heißt:
Stromquelle AN-> Arduino AN Licht AUS
Taster drücken ->Programm 1 (Hier:Lauflicht) EIN
Taster drücken ->Programm 2 (Hier:langsam aufhellen/abdunkeln) EIN
Taster drücken ->Licht AUS
und das dann so oft ich will. Bei mir scheiterts am letzten Punkt. Er will nicht wieder in den ersten Schritt meiner Abfolge springen in der das Licht AUS sein soll und ich wieder erneut starten kann.
PS.: Falls jemand Verbesserungen zu allem anderen hat, nehme ich dies gerne mit!
#include "FastLED.h"
#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif
// Konstanten
const int tasterPin = 13; // Taster an Pin 2 angeschlossen
// Variablen
int lmode = 0; // Variable für die verschiedenen festgelegten Farben
int tasterStatus = LOW; // Variable zu speichern des Tasterstatus
#define DATA_PIN 3
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS 144
#define BRIGHTNESS 64
CRGB leds[NUM_LEDS];
void setup() {
pinMode(tasterPin, INPUT); // Setzt den TasterPin als Eingang
delay(1000); // 1 second delay for recovery
Serial.begin(9600);
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}
void loop()
{
// Abfrage ob der Taster gedrückt ist
tasterStatus = digitalRead(tasterPin);
// Wenn Taster gedrückt ist...
if (tasterStatus == HIGH)
{
lmode++; // Lichtmodus +1
delay(300); // 300ms warten
}
//+++++++++++++++ LEUCHTPROGRAMME +++++++++++++++++
// Modus 0 = Licht aus
if (lmode == 0)
{
{
EVERY_N_MILLISECONDS(20)
{
FastLED.show();
}
}
}
// Modus 1 = Blau
else if (lmode == 1)
{
{
EVERY_N_MILLISECONDS(20)
{
fade2();
FastLED.show();
}
}
}
// Modus 2 = Rot
else if (lmode == 2)
{
{
EVERY_N_MILLISECONDS(20)
{
FadeInOut(0x00, 0x00, 0xff);
FastLED.show();
}
}
}
// Anzahl der Leuchtmodi auf 3 begrenzen. (0 bis 2)
else
{
lmode = 0;
}
}
void fade2()
{
fadeToBlackBy( leds, NUM_LEDS, 10);
byte pos = (beat8(10)*NUM_LEDS) / 255;
leds[pos] = CHSV( 160, 255, 255);
}
void FadeInOut(byte red, byte green, byte blue){
float r, g, b;
for(int k = 0; k < 256; k=k+1) {
r = (k/256.0)*red;
g = (k/256.0)*green;
b = (k/256.0)*blue;
setAll(r,g,b);
showStrip();
}
for(int k = 255; k >= 0; k=k-2) {
r = (k/256.0)*red;
g = (k/256.0)*green;
b = (k/256.0)*blue;
setAll(r,g,b);
showStrip();
}
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}
void showStrip() {
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}