- Official Post
Luminous
Da ich ganz gerne etwas bastel, habe ich mir für dieses Weihnachtsfest was ganz besonderes für meine Familie und Freunde ausgedacht.
Ich möchte eine Lampe bauen, die quasi Kurznachrichten verschicken kann - wie das?!
Diese Lampen werden alle über das Internet vernetzt sein, sodass jemand eine Nachricht an alle Lampen schicken kann.
Solche Nachrichten bzw. besser gesagt Gefühle / Emotionen werden dann in unterschiedliche Farben dargestellt.
Immer wenn jemand nach Hause kommt, vielleicht zbs. einen schlechten Tag hatte und sauer ist, würde er die Lampe anmachen und die Farbe einfach mal auf Rot stellen.
Das gleiche würde dann auch für andere Gefühle / Emotionen gelten mit unterschiedlichen Farben. Ich habe mich bewusst keine Vorgabe gemacht über eine Farbe <--> Gefühl Zuordnung, da ich selbst auch gerne sehen würde wie das bei 6 Teilnehmern / Lampen im Netzwerk funktioniert ![]()
Hardware
Zunächst habe ich mir erst mal Gedanken gemacht, was ich für Hardware in diesem Projekt brauche.
Da dbv, trek_star und andere zu der Zeit viel mit dem ESP8266 machen wollten, stand schon fest, dass ich da auch mit anfangen wollte.
Als Lichtspender habe ich mir die Neopixel LEDs ausgesucht, diese gibt es in verschiedenen Varianten und Formen - ich habe mit einem 24RGB LED Ring angefangen zu testen.
Um diese beiden Komponenten zu steuern, verwende ich einen Arduino Pro-Mini (3.3V).
Damit wären alle elektronischen Bauteile zusammen - mehr als Lochrasterplatinen brauche ich erst mal nicht.
Um auch ein gewisses Ambiente zu schaffen, taugen die LEDs erst mal nicht, da diese je nach Einstellung sehr grell sind.
Allerdings kann da ein Plexiglas oder ein PVC-Rohr abhilfe schaffen und dieses Licht angenehm verteilen.
An dieser Stelle nochmal ein dickes Dankeschön an unseren Moderator Mario, der mir 3 Plexiglas Rohre besorgt hat.
Um das ganze noch ein wenig abzurunden und um die Elektronik zu verstecken werde ich aus 2 Holzflächen einen Unterbau schaffen.
Im Unterbau selbst kommt die Elektronik rein und oben drauf der LED Ring samt Plexiglas Rohr.
Als kleine Übersicht nochmal alle Teile mit Preise aufgelistet.
- Stromversorgung (Smartphone Netzeil) - 1,84€
- ESP8266 Modul - 1,67€
- Arduino Pro mini (3.3V) - 2,67€
- Lochrasterplatine (70x30mm) - 2,45€
- Neopixel RGB LED Ring (24 LEDs) - 5,16€
- PVC Rohr (90 x 1,8mm - 20cm Länge) - 4,58€
- Regalbretter (hxbxl 18x300x800mm) - 5,50€
Hier habe ich die transparenten PVC Rohre mit verschiedenen Schleifpapiere bearbeitet. Ganz rechts sieht man das Rohr im "Urzustand".
Ganz Links habe ich ein 120er Schleifpapier benutzt, wo mir das Ergebnis am wenigsten gefällt. Man kann teilweise ziemlich deutlich die tiefen Kratzer sehen und ist daher eher unschön für LEDs.
In der Mitte habe ich 1000er Schleifpapier verwendet und da gefiel mir das Ergebnis eigentlich am besten.
Um das Aussehen zu testen, habe ich natürlich alles mal zusammengesteckt...
Teilweise habe ich mir noch weiteres Werkzeug angeschafft für diese und zukünftige Projekte.
Mit unter war ein Dremel3000 dabei (super Teil kann ich nur empfehlen) und diverses Kleinzeug...
Software
Lampe
Die Software für die Lampe ist mit unter das schwierigste für mich bei diesem Projekt gewesen. Dies ist mein erstes Arduino Projekt und ich musste mich direkt in knifflige Themen einarbeiten. Aber wie sagt man: An Herausforderungen wächst man? ![]()
Als Erstes habe ich die Firmware vom ESP gewechselt. Die ESPDuino Firmware von tuanpmt erschien mir brauchbarer als die Werksfirmware. Durch eine schön dokumentiere Installationsanleitung, war die Firmware schnell aufgespielt und einsatzbereit. Durch verschiedene Code-Beispiele fällt der Umgang mit der Firmware auch super leicht.
Die ersten Kontaktversuche liefen schon sehr vielversprechend mit meinem Mqtt Broker (Server der die Verteilung der Messages übernimmt - später mehr dazu).
Als nächstes habe ich mich um die Steuerung der LEDs gekümmert. Zunächst habe ich die erst mal die Farbmuster von den Code-Beispielen verwendet, um einfach ein Ergebnis zu sehen...
Allerdings sollte mir das später zum Verhängnis werden...
Als ich später alles verbinden wollte - also MQTT Anbindung und den LED-Ring flog mir das ganze Programm um die Ohren... die Bits und Bytes aus dem Netzwerk kamen nicht mehr sauber an und es wurde einfach gar keine Aktion mehr ausgeführt... ich habe wochenlang mit diesem Problem zu kämpfen gehabt... aber so ist das nun mal, wenn man sich in einem Thema einarbeitet...
In einem Forum habe ich den Tipp bekommen mir doch mal den Speicher vom RAM mir anzuschauen und tadaaa er war randvoll! Darum konnten also die Bytes aus dem Internet nicht mehr richtig empfangen werden...
Aber selbst nach Entfernung von unnützer Variablen und Abfragen bliebt das Problem bestehen! Nach noch mal einigen Wochen Fehlersuche, wollte ich einfach mal die Farbmuster von der Neopixel Library überarbeiten.
Diese bestanden meist aus 2-3 for schleifen - hört sich erst mal nach fast nichts an... aber bei knapp 2024kb RAM Speicher ist das verdammt viel!
Nachdem die Farbmuster umgebaut waren, fluppe alles ohne zu murren - der RAM sah danach auch wieder besser aus.
Ich bin an einem Punkt gekommen, wo ich wirklich nicht mehr weiter wusste... aber nun bin ich froh, dass ich aus diesem Problem meine Erfahrungen ziehen kann.
An dieser Stelle möchte ich euch den Quellcode nicht vorenthalten:
Luminous Arduino Quellcode
Sicherlich gibt es da einige Sachen die man verbessern könnte... Wenn euch was auffällt, dann schreibt mir gerne!
MQTT Protokoll
Damit der Netzwerkverkehr auch ordentlich geregelt ist, muss unbedingt ein kleines Protokoll her. Es soll leichtgewichtig und trotzdem schön flexibel sein.
Als ich dann in der Heise iX einen Artikel über das Mqtt Protokoll gelesen habe, stand fest DAS BRAUCHE ICH! ![]()
In diesem Protokoll geht es (kurz beschrieben) um verschiedene Topics (Nachrichten Kanäle) und die jeweiligen Nachrichten.
Jede Software hat die Möglichkeit einer oder mehreren Topics zu folgen (subscribe) und bekommt dann alle Nachrichten die über die jeweilige Topic gesendet wurden.
Kleines Beispiel:
Topic: /home/Schlafzimmer/Temperatur
Ich habe unterschiedliche Anwendungen, die diese Temperatur aus dem Schlafzimmer benötigen.
Dazu muss jede Anwendung nur dieser Topic ("/home/Schlafzimmer/Temperatur") folgen und bekommt dann automatisch die aktuelle Temperatur zugespielt.
Ihr merkt: Super wenig Aufwand und ein super Ergebnis!
So aber nun zurück zum Projekt.
Um das MQTT Protokoll zu verwenden brauche ich auch einen Broker (so werden die MQTT Server bezeichnet).
Dazu habe ich auf einem Raspberry den Mosquitto Broker installiert, Mosquitto bietet dazu auch einen speziellen Build für den Raspberry an.
Allerdings ist mir aufgefallen, dass man einige Optionen nicht im Nachhinein einstellen kann. Z.B. war es mir nicht möglich den Broker auf der Basis von Websockets laufen zu lassen.
Darum habe ich mich entschieden die Sourcen runterzuladen, die Konfiguration vorzunehmen und dann das Projekt selber bauen.
Für den Anfang reicht die normale Konfiguration, welche ich zum testen verwende. Allerdings sind dort noch keine Benutzer oder Zugriffsregeln definiert.
Es ist möglich, dass ein Benutzer nur bestimmte Topics folgen kann und auf andere keine Zugriffsrechte hat.
Verschiedene Anleitung zum aufsetzen eines Broker findet sich super leicht im Netz - daher gehe ich nicht auf diese Schritte ein...
Webapplication
Ein weiterer Teil der Software ist die Webapplication (Webapp), womit man die Lampe / Lampen steuern kann. Diese Webapp möchte ich so klein wie möglich gestalten und verzichte daher auf komplett auf PHP oder gar JavaEE. Übrig bleibt nur HTML5 und Javascript (JQuery Mobile um genauzu sein). Ich habe bisher noch nicht viel mit Javascript oder Jquery gemacht aber es war echt erstaunlich, wie schnell man zu einem schönen Ergebnis gekommen ist und wie wenig Aufwand man rein stecken muss.
Hier ein paar Screenshots von der Webapp:
Weitere Todo´s
Innerhalb der Software für die Lampe muss ich noch viele Einstellungsmöglichkeiten einbauen, um die Konfiguration an das jeweilige Heimische WLan Netz noch einfacher zu gestalten.
Dazu möchte ich noch die LED Muster überarbeiten - einige Timer sind ein wenig schnell und müssten mal runter gesetzt werden.
Währenddessen möchte ich auch die Gehäuse zusammenbauen. Ich werde 2 Holzplatten (130x130mm und 150x150mm) aufeinander leimen. In der oberen Platte wird ein Loch drin sein, wo man die Elektronik rein packen kann. Je nachdem wie es passt, müsste ich in der unteren Platte ein bisschen was rausfräsen... Ich hoffe es läuft so, wie ich mir das denke, wenn ja bin ich sicherlich in 2-3 Wochen fertig mit dem Projekt und kann euch weitere Bilder von der fertigen Lampe präsentieren.
Zum Abschluss möchte ich hier noch ein Video zeigen. Im Video zeige ich die verschiedenen Steuerungen und Farben der Lampe.