RGB Animation über Serial Steuern

Hallo miteinnander, bin relativ neu im Arduino Programmieren und versuche ein kleines Projekt zu realisieren, mein vorhaben ist es die WS2812 über Nextion Display zu steuern, das heist sobald ein Animationsprogram auf dem Nextion aktiviert wird soll diese Animation immer wieder abgespielt werden, leider tut er nur einmal die animation druchlaufen und kehr wieder zurück zum ausgang, das ganze soll auch nur dann aktive sein wenn Pin 14 auf HIGH steht.
Leider funktioniert das ganze so nicht wie ich mir das vorstelle.
Vielleicht kann da jemmand einem Anfänger weiterhelfen.

Schönen gruß

#include "FastLED.h"
#define NUM_LEDS 40
#define PIN 12
int schalter = 14;

CRGB leds[NUM_LEDS];

void setup()
{
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  pinMode(schalter, INPUT);
}

void loop() {
  setAll(10, 10, 10);
  if (Serial.available() > 0 && schalter == HIGH) {
    int inByte = Serial.read();
    switch (inByte) {
      case 'a':
        fade();
        break;
      case 'b':
        police();
        break;
      case 'c':
        snow();
        break;
      default:
        break;
    }
  }
}

//=========================================================//
void snow() {
  SnowSparkle(5, 0, 0, 20, random(100, 1000));
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red, green, blue);

  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
}

void police() {
  Strobe(255, 0, 0, 10, 35, 400);
  Strobe(0, 0, 255, 10, 40, 400);
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) {
  for (int j = 0; j < StrobeCount; j++) {
    setAll(red, green, blue);
    showStrip();
    delay(FlashDelay);
    setAll(0, 0, 0);
    showStrip();
    delay(FlashDelay);
  }

  delay(EndPause);
}

void fade() {
  FadeInOut(255, 0, 0); // red
}

void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 20; 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 >= 20; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }
}

void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

Hallo,
“Leider funktioniert das ganze so nicht wie ich mir das vorstelle.”

So lange Dein Sketch NICHT- in CodeTags (Editor </>) eingestellt ist, funktioniert das auch nicht.
Gruß und Spaß
Andreas

ja bin neu hier, hab eben gemerkt das was fehlt, bekomm aber ne fehlermeldung wenn ich den Beitrag abändern will, steht was von 5 Minuten :confused:

LED.ino (2.37 KB)

Hallo,
http://forum.arduino.cc/index.php/topic,148850.0.html

dort Punkt 7

Gruß und Spaß
Andreas

Jetzt aber, danke für den hinweis

Hallo,
kanst ja mal probieren...

#include "FastLED.h"
#define NUM_LEDS 40
#define PIN 12
int schalter = 14;

int merker = 0;

void loop() {
  setAll(10, 10, 10);
  if (Serial.available() > 0 && schalter == HIGH) {
    merker = 1;
    test();
  }
    
   if (merker == 1)
   {
     test();
   }
  }


void test()
{
 int inByte = Serial.read();
    switch (inByte) {
      case 'a':
        fade();
        break;
      case 'b':
        police();
        break;
      case 'c':
        snow();
        break;
      default:
        break;
    } 
}

Gruß und Spaß
Andreas

funktioniert leider auch nicht

Probier doch erst mal, das ganze ohne Nextion zu realisieren. Du kannst ja erst mal Eingaben im seriallen Monitor machen.
Wenn das funktioniert, dann die Steuerung durchs Nextion aufbauen.

Welchen Arduino hast Du? Wenn einen Mega, dann wird das Display wohl an Serial1 hängen, wenn einen UNO damm mußt Du Softserial nutzen.
An Serial wird es nicht hängen, darüber wird Dein Arduino programmiert.

Hast Du Dir Dokumentationen zum Nextion angeschaut hier oder hier? Die Kommunikation dürfte anders verlaufen.

Gruß Tommy

Ja also das mit Nextion kommt später, im moment alles über Serialmonitor, hab den Teensy 3.2,
im moment ist es so, wenn ich die pinabfrage zum schalter weglasse, dann nimmt er befehle über serial an, aber die entsprechend angewählte Animation wird nur einmal druchlaufen und springt wieder in den loop zurück, ich möchte natürlich auch kein Fertiges Program haben wie der Kollege aus dem anderen forum meinte, ich möchte einfach dazulernen.

Wenn jedoch die pinabfrage mit ins Spiel kommt, reagiert er auf keine Befehle mehr.

Hier nach dem vorschlag aktualisierter Code

#include "FastLED.h"
#define NUM_LEDS 40
#define PIN 12
int schalter = 14;

int merker = 0;

CRGB leds[NUM_LEDS];

void setup()
{
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  pinMode(schalter, INPUT);
}


void loop() {
  setAll(10, 10, 10);
  if (Serial.available() > 0 && schalter == HIGH) {
    merker = 1;
    test();
  }

  if (merker == 1)
  {
    test();
  }
}

void test()
{
  int inByte = Serial.read();
  switch (inByte) {
    case 'a':
      fade();
      break;
    case 'b':
      police();
      break;
    case 'c':
      snow();
      break;
    default:
      break;
  }
}


//=========================================================//
void snow() {
  SnowSparkle(5, 0, 0, 20, random(100, 1000));
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red, green, blue);

  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
}

void police() {
  Strobe(255, 0, 0, 10, 35, 400);
  Strobe(0, 0, 255, 10, 40, 400);
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) {
  for (int j = 0; j < StrobeCount; j++) {
    setAll(red, green, blue);
    showStrip();
    delay(FlashDelay);
    setAll(0, 0, 0);
    showStrip();
    delay(FlashDelay);
  }

  delay(EndPause);
}

void fade() {
  FadeInOut(255, 0, 0); // red
}

void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 20; 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 >= 20; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }
}

void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

Medolino73:
...ich möchte natürlich auch kein Fertiges Program haben wie der Kollege aus dem anderen forum meinte,...

Das hat sich für mich so gelesen.
Wenn nur die Antwort kommt: funktioniert leider auch nicht.
Sorry, wenn ich mich geirrt habe.

Ist denn dein Schalter immer auf "HIGH" ?

Ja also jetzt hab ich mal eine Ausgabe auf Serial eingefügt um den zustand des Schalters zu sehen, bekomm aber immer einen wert von 14 ausgegeben, egal ob der Schalter geschaltet ist oder nicht. steh im moment voll aufm schlauch, hier mal der etwas abgeänderte code

#include "FastLED.h"
#define NUM_LEDS 40
#define PIN 12

const int schalterPin = 14;
int merker = 0;
int schalterZustand = 0;

CRGB leds[NUM_LEDS];

void setup()
{
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  pinMode(schalterPin, INPUT);
}


void loop() {
  setAll(10, 10, 10);
  
  schalterZustand = digitalRead(schalterPin);
  Serial.println(schalterPin);
  
  if (Serial.available() > 0 && schalterZustand == HIGH) {
    merker = 1;
    test();
  }

  if (merker == 1)
  {
    test();
  }
}

void test()
{
  int inByte = Serial.read();
  switch (inByte) {
    case 'a':
      fade();
      break;
    case 'b':
      police();
      break;
    case 'c':
      snow();
      break;
    default:
      break;
  }
}


//=========================================================//
void snow() {
  SnowSparkle(5, 0, 0, 20, random(100, 1000));
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red, green, blue);

  int Pixel = random(NUM_LEDS);
  setPixel(Pixel, 0xff, 0xff, 0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel, red, green, blue);
  showStrip();
  delay(SpeedDelay);
}

void police() {
  Strobe(255, 0, 0, 10, 35, 400);
  Strobe(0, 0, 255, 10, 40, 400);
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) {
  for (int j = 0; j < StrobeCount; j++) {
    setAll(red, green, blue);
    showStrip();
    delay(FlashDelay);
    setAll(0, 0, 0);
    showStrip();
    delay(FlashDelay);
  }

  delay(EndPause);
}

void fade() {
  FadeInOut(255, 0, 0); // red
}

void FadeInOut(byte red, byte green, byte blue) {
  float r, g, b;

  for (int k = 20; 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 >= 20; k = k - 2) {
    r = (k / 256.0) * red;
    g = (k / 256.0) * green;
    b = (k / 256.0) * blue;
    setAll(r, g, b);
    showStrip();
  }
}

void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

Hier: "Serial.println(schalterPin);" muss

das stehen: "Serial.println(schalterZustand);"

Hallo,
"Serial.available() > 0 && schalterZustand == HIGH"

Das das eine UND- Bedingung ist, ist Dir schon klar?

Gruß und Spaß
Andreas

jaja, natürlich, es soll so sein, das nur wenn der schalter auf High steht, der auch die Anweisung über Serial weitegibt auf die entsprechende animation .

PS Serial.println(schalterPin); soll natürlich Serial.println(schalterZustand); heisen, so gibt er ja nur den Pin aus, ich dummerchen

Und wo steht der Schalter ?

Schalter steht immer auf HIGH, was auch einmalig die Animation aktiviert und kehrt zum loop zurück, wieso der aber immer auf HIGH steht ?? hab ich echt kein ahnung

Medolino73:
Schalter steht immer auf HIGH, was auch einmalig die Animation aktiviert und kehrt zum loop zurück, wieso der aber immer auf HIGH steht ?? hab ich echt kein ahnung

Was hast du da dran ?
Taster oder Schalter, zeig mal ein Bild.

Du kannst es doch probeweise mit einem Draht prüfen.

Ja hab ein Draht auf Breatboard zum testen

Medolino73:
Ja hab ein Draht auf Breatboard zum testen

Ok, dann nimm einen 4,7 kOhm Pulldown-Widerstand an den Pin gegen GND.

Der fehlt dann bei dir.

Achso, der muß gegen GND, dachte wenn geschaltet wird, muß der auch auf HIGH also 5V mir fehlt gerade die Logic dahinter.
Aber auf GND funktionierts.