Programm für SK6812 LED Strip Steuern per UDP (Loxone)

Hallo,

ich hoffe es kann mir jemand helfen und zwar habe ich vor mit der ESP8266 einen 18m (60LED pro m) langen LED Streifen zu steuern. Würde gerne per Befehl von Loxone also UDP z.B.: 200an senden und dadurch 200 LEDs leuchten lassen und die restlichen gedimmt.

Sollte dann wie hier durchlaufen:

for (int i = 0; i < NUM_LEDS; i++) {
   strip.setPixelColor(i, strip.Color(0, 0, 0, 100)); <----rest gedimmt
   strip.show();
   delay(1);
for (int i = 0; i < NUM_LEDS-880; i++) {
   strip.setPixelColor(i, strip.Color(0, 0, 0, 255)); <----200 Leuchten mit voller Leistung
   strip.show();
   delay(1);

Ich benötige nur den Auslöse (200an) und Stop (200aus) Impuls/Befehl für die Programmierung.
Wie kann man das schreiben?

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Ein paar weitere Infos wären schon sinnvoll.
Ich kenne LOXON nicht und Du sagst uns nicht, welche Libs Du nutzt.
Sinnvoll wäre ein kompilierbarer Sketch mit Links zu den verwendeten Libs und den LEDS.

Ich könnte mir aber vorstellen, dass die Farbe schwarz in keiner Helligkeit sinnvoll ist.
strip.Color(0, 0, 0, 255)

Gruß Tommy

Loxone soll nur per Befehl was senden z.B.: 1an oder 2an die Farbe ist schon richtig da es eine RGBW ist und ich das White ansteuere.

Hier das Programm:

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiUdp.h>

#define PIN D5
#define NUM_LEDS 7

const char* ssid = "...";
const char* password = "...";

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
WiFiClient net;
WiFiUDP Udp;
unsigned int localUdpPort = 5555;
char incomingPacket[255];

void setup() {
 Serial.begin(9600);

 strip.begin();
 for (int i = 0; i < NUM_LEDS; i++) {
   strip.setPixelColor(i, strip.Color(0, 0, 0));
 }
 strip.show();

 WiFi.mode(WIFI_AP_STA);
 while (WiFi.waitForConnectResult() != WL_CONNECTED) {
   WiFi.begin(ssid, password);
 }

 Udp.begin(localUdpPort);
 Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);

 initSequence();
}

void initSequence() {

 for (int i = 0; i < NUM_LEDS; i++) {
   strip.setPixelColor(i, strip.Color(0, 255, 0));
   strip.show();
   delay(50);
 }

 for (int i = 0; i < NUM_LEDS; i++) {
   strip.setPixelColor(i, strip.Color(0, 0, 0));
   strip.show();
   delay(50);
 }
}

void loop() {
 int packetSize = Udp.parsePacket();
 if (packetSize) {
   Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
   int len = Udp.read(incomingPacket, 255);
   if (len > 0) {
     incomingPacket[len] = 0;
   }

   String sPacket = String(incomingPacket);
   String sValue = sPacket.substring(sPacket.lastIndexOf(":") + 1);
   int ledIndex = sPacket.substring(0, sPacket.lastIndexOf(":")).toInt() - 1;

   if (ledIndex >= 0 && ledIndex < strip.numPixels()) {
     if (sValue == "off") {
       strip.setPixelColor(ledIndex, strip.Color(0, 0, 0));
     } else {
       long number = (long)strtol(&sValue[0], NULL, 16);
       int r = number >> 16;
       int g = number >> 8 & 0xFF;
       int b = number & 0xFF;

       strip.setPixelColor(ledIndex, strip.Color(r, g, b));
     }

     strip.show();
   }

   Serial.printf("UDP packet contents: %s\n", incomingPacket);

   // Antwort
   Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
   Udp.write("OK");
   Udp.endPacket();
 }
}

Das ist von: Loxone - WLAN-Status-Display selbst gebaut | haus-automatisierung.com

Die kann aber nur 1 LED mit einer beliebigen Farbe ansteuern sieht dann als Befehl von Loxone so aus 1:fffff
d.h. LED1 leuchtet in Weiß

Also strip.show() solltest Du erst machen, wenn Du die Schleife fertig hast.
Ansonsten verstehe ich immer noch nicht, was Du nun genau von uns willst.

Ich würde 3 Werte senden. Status:Startindex:Endindex. Dazu musst Du aber Dein Loxone umprogrammieren.

Gruß Tommy

ist dir klar was diese Zeile macht?

strip.setPixelColor(ledIndex, strip.Color(0, 0, 0));

wenn du nicht ausschalten willst,

warum änderst du diese Zeile dann nicht auf

strip.setPixelColor(ledIndex, strip.Color(0, 0, 100));

Deine bisherige Beschreibung ist mir immer noch unklar.
Beschreibe noch mal GANZ GENAU was du erreichen willst.
Das ganze in kurzen Sätzen.
Gib ein Beispiel WAS du über Loxone senden willst und wie sich das auf deinen LED-Streifen auswirken soll.
Dann machst noch ein Beispiel was du über Loxone sendest und wie der Streifen dann aussen soll.

Geh davon aus dass niemand von usn eine Loxone hat. Daher müssen wir ganz genau wissen was diese sendet.

Also wie folgt:

Loxone sendet per UDP ---> LED1 AN
ESP8266 empfängt LED1 AN und schaltet 200 von 1080 LEDs an in der Farbe 0,0,100

dann wollte ich noch folgende Befehle einbauen:

Loxone sendet per UDP ---> LED2 AN
ESP8266 empfängt LED2 AN und schaltet 880 von 1080 LEDs an in der Farbe 0,0,255

ist das so etwas verständlicher?

besser.

hängen diese 200 von 1080 hintereinander?
Also sind es die Pixel-Nr 880 - 1080 die du jeweils ansteuern willst?
Und sollen die Pixel jeweils umgeschaltet werden - oder willst du da eine kleine Animation, dass man sieht, dass die Pixel immer mehr (oder weniger) werden?

Hallo,

soll das Loxone irgendwie festlegen welche 200 LED eingeschaltet werden ? oder wie hast Du Dir das vorgestellt. Ich denke es macht Sinn wenn Du erst mal mit wenigen LED was probierst um zu lernen wie man LED einschaltet und die Farbe bestimmt, also Grundlagen.

Eigendlich stellt man erst alle LED so ein wie man das haben will, dabei werden die Daten zunächst zwischengespeichert. Anschliessend mit strip.show() werden die Werte dann an die LED ausgeben.

ich kenn die Lib nicht aber ich denke da gibts auch eine Dokumentation zu und ein paar Beispiele werden auch dabei sein. Lesen und lernen musst Du schon selber.

Heinz

Loxone soll nur schalten im Programm soll alles festgelegt werden. Einzelne LEDs kann ich schalten nur leider nicht 200 von… mir fehlt einfach der Befehl für die Arduino Programmierung.

könnte ich es auch hiermit:

if (!strcmp(packetBuffer, "LED1 an"))
 {
 for (int i = 0; i < NUM_LEDS-200; i++) {
   strip.setPixelColor(i, strip.Color(0, 0, 0, 255));
   strip.show();
   delay(50);
 }

Ich glaube, es geht hier nur um die Auswertung der UDP-Nachricht?

Ah, doch nicht :grin:

noch warte ich auf die Beantwortung der 3 Fragen aus #6...

hängen diese 200 von 1080 hintereinander?

Ja, es sind insgesamt 1080 LEDs und somit 200 von 1080.

Also sind es die Pixel-Nr 880 - 1080 die du jeweils ansteuern willst?

Ich will in gewissermaßen alle ansteuern nur mit verschieben Schaltern, deswegen LED1 an (ersten 200 LEDs gehen an), LED2 an (nächsten 400 LEDs gehen an) usw.

Und sollen die Pixel jeweils umgeschaltet werden - oder willst du da eine kleine Animation, dass man sieht, dass die Pixel immer  mehr (oder weniger) werden?

Eine gewissen Fluss/Animation hätte ich schon gerne, die sollen wie ein Lawine angehen eine nach der anderen Zeit versetzt.

Stufe 1: Pixel 0 - 199
Stufe 2: Pixel 200 - 399
Stufe 3: Pixel 400 - 599
Stufe 4: Pixel 600 - 799
Stufe 5: Pixel 800 - 999
Stufe 6: Pixel 1000 - 1080

So oder anders?

Genau so…

ich rate dir zu:

trenne dein Programm in
a) “Daten Empfangen/Auswerten” und
b) Muster darstellen.

Bau dir für die einzelnen Muster eigene Funktionen, die du dann in a) aufrufst.

ala (ungeprüft)

void muster1()
{
  for (int i = 0; i < 200; i++) {
   strip.setPixelColor(i, strip.Color(0, 0, 0, 255));
   strip.show();
   delay(50);
 }
}

kann man dann später noch weiter vereinfachen.
ich schätze agmue oder einer der anderen Helferleins wird dir jetzt weiterhelfen können. Ich geh offline.

Die Muster kann ich darstellen mein Problem ist : a) "Daten Empfangen/Auswerten"

Ich hatte Dir in #3 ja bereits einen Vorschlag gemacht, womit Du wesentlich flexibler bist.
Den hast Du bisher aber komplett ignoriert.

Was machst Du eigentlich mit den anderen Farben? Willst Du die nicht auch nutzen?

Gruß Tommy

Loxone umprogrammieren geht nicht so einfach. Ich benötige eigentlich nur weiß.
Es soll im Eingangsbereich vor dem Haus realisiert werden. Deswegen die verschiedenen Kreise die ich dann per Bewegungsmelder schalten will. Wenn der Briefkasten betätigt wird werde ich in dem Bereich auch eine einzige LED pulsieren lassen. Die Farbe Rot wollte ich für den Alarm benutzen. Nur fehlt mir einfach der Befehl der ein Kreis LEDs startet.

Hallo,

Na dann hättets Du 6 Gruppen welche Gruppe könnte aus der Variablen ledIndex kommen. Dann berechnest Du eine Anfangsvariable Anfang=ledIndex*200

in einer for Schleife steuerst du zunächst alle 1080 LED auf 50%.Dann eine zweite forschleife von Anfang bis Anfang+200 auf 100% in einer Farbe Deiner Wahl. Anschliessend strip.show().

Heinz

Alex988:
… 18m (60LED pro m) langen LED Streifen …

Du benötigst 65 A, hast Du genügend dicke Kabel? Sonst hast Du bald gute Kontakte zur Feuerwehr!

noiasca:
ich schätze agmue … wird dir jetzt weiterhelfen können.

Meinst Du? Ich habe weder UDP noch so viele RGBW.

Alex988:
Die Muster kann ich darstellen …

Dann stört es Dich hoffentlich nicht, wenn ich RGB-DotStar an SPI verwende? Meine Gruppen haben auch nur 20 Pixel.

Alex988:
mein Problem ist : a) “Daten Empfangen/Auswerten”

UDP kann ich nicht probieren, habe ich nicht, auch keinen ESP8266.

Ich würde Dein Problem gerne einkreisen. Macht das folgende Programm so ungefähr, wonach Du fragst?

#include <Adafruit_DotStar.h>
#include <SPI.h>
#define NUM_LEDS 122

Adafruit_DotStar strip = Adafruit_DotStar(NUM_LEDS, DOTSTAR_BGR);

void setup() {
  strip.begin();
  strip.show();
}

void anzeige(byte gruppe, const char anaus[]) {
  const uint16_t gruppengroesse = 20;
  uint16_t erste = gruppe * gruppengroesse;
  uint16_t letzte = (gruppe + 1) * gruppengroesse;
  for (uint16_t led = erste; led < letzte; led++) {
    if (anaus[1] == 'N') {
      strip.setPixelColor(led, strip.Color(20, 20, 20));
    } else {
      strip.setPixelColor(led, strip.Color(0, 0, 0));
    }
    strip.show();
  }
}

void loop() {
  anzeige(0, "AN");
  delay(1000);
  anzeige(1, "AN");
  delay(1000);
  anzeige(2, "AN");
  delay(1000);
  anzeige(0, "AUS");
  delay(1000);
  anzeige(1, "AUS");
  delay(1000);
  anzeige(2, "AUS");
  delay(1000);
}