Projekt/WLampe
Projekt/WLampe Release status: stable [box doku] | |
---|---|
Description | Eine mit WS2812b gepimpte Ikea-Lampe. |
Author(s) | Pintman |
Last Version | 0.1 |
Platform | ESP8266 |
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.
Demo
Zusammenbau
Die LEDs wurden stümperhaft mit etwas Kabelbinder an dem mittleren Metallstab befestigt:
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.
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.
Konfiguration
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.
Die Einstellungen werden in dem Preset 16 gespeichert - nur dieses Preset speichert auch die Konfiguration der Segmente ab.
Ansteuerung
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