Projekt/WLampe

Aus LaborWiki
Wechseln zu: Navigation, Suche
       
Projekt/WLampe

Release status: stable [box doku]

Lampe.png
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

Links