Lampe beleuchtet

Man nehme: Eine Ikea-Lampe Vickleby, einen ESP8266, einen Streifen WS2812b LEDs, etwas Kabelbinder und das Projekt WLED für die Ansteuerung. Fertig ist eine schicke Lampe, die sich mit einer App oder über verschiedene Protokolle (MQTT, UDP, DMX, ...) ansteuern lässt.

Das fertige Ergebnis kann man sich in einem Video bei YouTube oder Peertube ansehen.

Die LEDs wurden stümperhaft mit etwas Kabelbinder an dem mittleren Metallstab befestigt:

Blick in die Lampe LEDs befestigt

Im unteren Bereich befinden sich eigentlich eine Fassung und ein Netzstecker, die ich entfernen musste, da die Fassung Teil der Befestigung der unteren Konstruktion ist.

Netzstecker entfernt

Die Kabel der LEDs wurden über eine Lüsterklemme mit ein paar Steckbrücken verbunden, die wiederum in einem ESP8266 stecken. Zwischen Masse und 5V steckt ein kleiner Kondensator. Die LEDs können beim Einschalten recht viel Strom ziehen und geben dem ESP dann ggf. nicht die Möglichkeit, zu starten.

Lüsterklemme

Die folgenden Bilder zeigen die recht simple Verdrahtung mit dem ESP8266. Wichtig ist hier nur Pin D4, der als Datenleitung die LEDs ansteuert. Eigentlich mögen die LEDs 5V und man könnte daher zusätzlich einen Level-Shifter einbauen (die Projektseite von WLED stellt unterschiedliche Bauteile vor), bei mir klappte es jedoch auch so.

Wenn der ESP über die USB-Buchse betrieben wird, liegen an Vin 5V an, die für die LEDs genutzt werden können.

ESP Unterseite ESP Oberseite

Der LED-Streifen verläuft einmal von unten nach oben und dann wieder nach unten. Um die beiden Stränge in der gleichen Richtung zu betreiben, werden sie in der Mitte geteilt und in WLED in zwei Segmente eingeteilt, wobei das zweite Segment in umgekehrter Reihenfolge konfiguriert wird.

ein Bild

Die Einstellungen werden in dem Preset 16 gespeichert - nur dieses Preset speichert auch die Konfiguration der Segmente ab.

Als JSON-Export sieht die Konfiguration aus wie folgt:

{
"on": true,
"bri": 128,
"transition": 7,
"mainseg": 0,
"seg": [
    {
    "id": 0,
    "start": 0,
    "stop": 19,
    "grp": 1,
    "spc": 0,
    "on": true,
    "bri": 255,
    "col": [
        [255, 0, 0 ],
        [0, 0, 255],
        [8, 255, 0]
    ],
    "fx": 66,
    "sx": 121,
    "ix": 125,
    "pal": 0,
    "sel": true,
    "rev": false,
    "mi": false
    },
    {
    "id": 1,
    "start": 19,
    "stop": 38,
    "grp": 1,
    "spc": 0,
    "on": true,
    "bri": 255,
    "col": [
        [255, 0, 0],
        [0, 0, 255],
        [8, 255, 0 ]
    ],
    "fx": 66,
    "sx": 121,
    "ix": 125,
    "pal": 0,
    "sel": true,
    "rev": true,
    "mi": false
    },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 },
    { "stop": 0 }
]
}

Die Lampe kann mit verschiedenen Protokollen angesprochen werden. Das folgende Beispiel zeigt ein Python-Programm, welches eine sehr direkte Steuerung der einzelnen LEDs über ein eigenes UDP basiertes Protokoll erlaubt.

import socket

API_ENDPOINT = ('192.168.179.15', 21324)
NUM_LEDS = 50

# Byte 0 of the UDP packet tells the server which realtime protocol to use.
PROTO_WARLS = 1  # WARLS
PROTO_DRGB = 2   # DRGB
PROTO_DRGBW = 4  # DRGBW
PROTO_DNRGB = 3  # DNRGB
PROTO_WLED_NOTIFIER = 0
PROTO_WAIT_TIME = 50 # seconds

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
pos = 0

while True:
   data = [PROTO_WARLS, PROTO_WAIT_TIME]
   for i in range(NUM_LEDS):
      data.append(i)

      data.append(2*i) # red
      data.append(255-2*i) # green
      data.append(255 if i==pos else 0) # blue

   sock.sendto(bytes(data), API_ENDPOINT)
   pos = (pos  + 1) % NUM_LEDS