Lichteffekte einer LED Strips (WS2811) mit dem Arduino wechseln

Hallo zusammen, :wave:
dies ist mein zweiter Beitrag hier.
ich habe vor kurzem, (aus Beitrag 1) Den Arduino als Ersatz zu meinen WS2811 LED Strips genutzt was mit dem Sketch aus besagten Beitrag auch hervorragend funktioniert hat.

Allerdings möchte ich jetzt mit Einer IR Fernbedienung oder einem Taster die Farbeffekte wechseln können, das jedes Mal wenn der Knopf gedrückt wird eine andere Farbe kommt und man so die Möglichkeit hat per Knopfdruck zwischen verschiedenen Farben und Effekten zu wechseln.

ich habe aus dem Buch probeweise zum Testen einen Probe Sketch geschrieben um per Fernbedienung eine LED an und aus zu schalten, allerdings habe ich dabei gemerkt das dies etwas aufwändig ist, wäre dies mit einem Taster einfacher ?
Und Welche Bibliothek eignet sich am besten für so eine IR-Fernbedienung

Vielen Dank im Voraus
LG Migel

Wie in dem anderen schon geschrieben, ist IR-Fernbedienung und das betreiben des Stripe nicht ganz trivial.

Ich würde erstmal mit einem taster einsteigen.
Lege Dir für jeden Effekt den Du haben möchtest einfach eine Funktion an und dann schalte durch die Funktionen durch.

In Anlehnung an den Sketch aus #13

#include <FastLED.h>

#define NUM_LEDS 150  // How many leds are in the strip?
#define DATA_PIN 6

CRGB leds[NUM_LEDS];  // This is an array of leds.  One item for each led in your strip.

uint8_t gHue = 0; // rotating "base color" used by many of the patterns

const byte tasterPin = 2;
const unsigned long bounceTime = 40;

byte auswahl = 0;
const byte maxFunktion = 2;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (tasterPin, INPUT_PULLUP);
  FastLED.addLeds<WS2811, DATA_PIN, GRB>(leds, NUM_LEDS);
  leds[0] = CRGB::Red;
  leds[1] = CRGB::Green;
  leds[2] = CRGB::Blue;
  FastLED.show();
  delay(3000);
}

void loop()
{
  funktionAuswahl();
}

void funktionAuswahl()
{
  static unsigned long pressTimer = 0;
  static bool lastPressed = false;
  if (!digitalRead(tasterPin) && !lastPressed)
  {
    auswahl++;
    if (auswahl >= maxFunktion)
    {
      auswahl = 0;
    }
    pressTimer = millis();
    lastPressed = true;
  }
  if (millis() - pressTimer > bounceTime && lastPressed)
  {
    lastPressed = false;
  }
}

void ledWhiteBlack()
{
  for (int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1)
  {
    leds[whiteLed] = CRGB::White;
    FastLED.show();
    delay(100);
    leds[whiteLed] = CRGB::Black;
  }
}

void rainbow()
{
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
  FastLED.show();
  EVERY_N_MILLISECONDS( 20 )
  {
    gHue++;  // slowly cycle the "base color" through the rainbow
  }
}

Ich weiß allerdings nicht ob es was bringt den IR Empfänger mit einem Verlängerungskabel weiter weg zu legen, ob es dann weniger störanfällig ist ?

Vielen Dank für den Sketch, denn kann ich gut als Grund Gerüst benutzen und ihn dann später hinaus mit mehr Effekten erweitern :slight_smile:

Es ist nicht die Störanfälligkeit, sondern das Du nicht andauernd Signale empfangen kannst, da das schreiben auf dem Stripe den restlichen Code blockiert.

Ja, mehr war das nicht.
Du musst jetzt zusehen, wieviele Funktionen Du hast und dann z.B. über switch/case die jeweilige Funktion anhand des aufgezählten Inhalt des byte auswahl auswählen.

Das heißt der Arduino ist mit Codeausführung und das Warten auf IR Informationen schon überfordert xD :wink:

Nein. Du hast das Problem, das die Chips in einer bestimmten Zeit die Informationen erwarten, die weiter gegeben werden müssen. Ist die Zeitspanne zu lang, interpretiert der Chip das als Signal für sich.
Aus diesem Grund schiebt die .show() Funktion für alle LED's die Infos raus, ohne sich von was anderem stören zu lassen.

Daher habe ich bei meiner LED-Uhr APA102 als Streifen gewählt, weil deren Ausgabe per Interrupt unterbrochen werden darf.

Bei meinem MP3-Player, der beim Abspielen auch blockiert, habe ich einen ATtiny85 zum Empfangen der IR-Signale verwendet.

Wie das wohl mit dem Originalen LED RGB Strip IR Remote Controller Funktioniert ? da ist ja auch immer eine IR Fernbedienung dabei...

Zwei Kerne anstelle von zwei Arduinos, das ist kein Problem.

Ich behaupte auch nicht, es sei mit aller mit der Arduino-IDE programmierbaren Hardware unmöglich, weil ich nicht alle kenne. Nur bei einem UNO behaupte ich es.

Ach so, jetzt verstehe ich

Allerdings weiß ich nicht so recht wo der Taster angeschlossen werden muss, ich konnte dies im Sketch nicht so recht herauslesen

Doch, steht drin:

Ja hab ich probiert, der Arduino Rührt sich aber nicht, deswegen dachte ich das sei falsch

Der Taster muss auf einer Seite an den PIN, auf der anderen Seite an GND.
Kein externer Widerstand...
Im Setup ist der interne Pullup gesetzt.

Ich hab den rest mal getippt, damit du siehst, wo was passiert.
Du brauchst den SerMon dafür....

#include <FastLED.h>

#define NUM_LEDS 150  // How many leds are in the strip?
#define DATA_PIN 6

CRGB leds[NUM_LEDS];  // This is an array of leds.  One item for each led in your strip.

uint8_t gHue = 0; // rotating "base color" used by many of the patterns

const byte tasterPin = 2;
const unsigned long bounceTime = 40;

byte auswahl = 0;
const byte maxFunktion = 3;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (tasterPin, INPUT_PULLUP);
  FastLED.addLeds<WS2811, DATA_PIN, GRB>(leds, NUM_LEDS);
  leds[0] = CRGB::Red;
  leds[1] = CRGB::Green;
  leds[2] = CRGB::Blue;
  FastLED.show();
  delay(3000);
}

void loop()
{
  funktionAuswahl();
}

void funktionAuswahl()
{
  static unsigned long pressTimer = 0;
  static bool lastPressed = false;
  if (!digitalRead(tasterPin))
  {
    if (!lastPressed)
    {
      auswahl++;
      Serial.println(F("Taste gedrückt"));
      if (auswahl >= maxFunktion)
      {
        auswahl = 0;
      }
      pressTimer = millis();
      lastPressed = true;
    }
  }
  else if (millis() - pressTimer > bounceTime)
  {
    lastPressed = false;
  }
  switch (auswahl)
  {
    case 0: ledWhiteBlack(); break;
    case 1: rainbow(); break;
    case 2: Serial.println(F("Denkste!")); break;
  }
}

void ledWhiteBlack()
{
  for (int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1)
  {
    leds[whiteLed] = CRGB::White;
    FastLED.show();
    delay(100);
    leds[whiteLed] = CRGB::Black;
  }
}
void rainbow()
{
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
  FastLED.show();
  EVERY_N_MILLISECONDS( 20 )
  {
    gHue++;  // slowly cycle the "base color" through the rainbow
  }
}
1 Like

Entweder ich stehe gerade echt auf dem Schlauch oder ich verstehe etwas komplett falsch, ich hab den Sketch oben genommen...erst ist lange nichts passiert Die LED Strips haben irgendwas gemacht und auf den Seriellen Monitor kam folgendes:

Vergleiche mal die Zahl bei Serial.begin(115200) mit der Einstellung Deines seriellen Monitors (9600).

Gruß Tommy

1 Like

Das ist peinlich...UPS

Mehr wie die Meldung "Start" kommt aufm Seriellen Monitor nicht
obwohl im Sketch steht "Taste gedrückt" und "Denkste!" egal wie oft ich drücke

Wie hast Du die taste angeschlossen?
Sind die verbindungen alle richtig?
Kannst Du ein Bild machen - von oben - damit man die Käbelchen sieht?

Der Taster Funktioniert, ich hab ihn mit dem Multimeter durchgemessen