1 / 5
Illuminated Moon Wall Lamp (Small Version about ~240mm) — zdjęcie 1
1 / 5

Illuminated Moon Wall Lamp (Small Version about ~240mm)

Zamów wydruk tego modelu

Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.

Zapisane na tym urządzeniu.

Mond Thema Wandlampe mit LED Streifen und Smartphone Steuerung durch ein ESP32 DevKit (ESP32 ist kein muss)

Ocena
0 / 5
Polubienia
112
Pobrania
385
Wydruki
0
Wyświetlenia
1993
Oceny
0

Aktualizacja u źródła:

Informacje o modelu

Źródło
Printables
Kategoria
Wall-mounted
Licencja
Creative Commons — Attribution — Noncommercial — Share Alike

REMIX Illuminated Moon Wall Lamp (Small Version)  WiFi gesteuerte 2D Topographie Lampe

Eine atemberaubende 2D Topographie des Mondes, die von hinten mit adressierbaren LEDs beleuchtet wird und per Smartphone gesteuert werden kann. Die perfekte Kombination aus Kunst, Wissenschaft und Smart Home Technologie!

 

Diese beleuchtete Mond Wandlampe zeigt die detaillierte Oberflächenstruktur des Mondes als Topographie. Durch die RGB LED Hintergrundbeleuchtung kannst du Farbe, Helligkeit und Lichteffekte vollständig vom Smartphone aus steuern, ohne App-Installation! Das elegante Web Interface macht die Steuerung intuitiv und komfortabel.

Die 3D gedruckte Topographie wirft je nach Beleuchtungswinkel und farbe verschiedene Schatten und hebt die Krater, Maria (dunkle Ebenen) und Hochländer des Mondes plastisch hervor. Ein echtes Highlight für jeden Weltraum Enthusiasten!

 

 

 

 

 

 

 

 

Features

Detaillierte Oberflächenstruktur des Mondes 

💡 RGB LED Hintergrundbeleuchtung 

21 adressierbare WS2812B LEDs 

📱 WiFi-Steuerung  Vollständige Kontrolle per Smartphone/Tablet 

🎨 Millionen von Farben  Echtzeit-Farbauswahl mit Color Picker 

🌈 Dynamische Effekte  Regenbogen und Fade Animationen 

💫 Einstellbare Helligkeit  Stufenlose Anpassung 0-100% 

⚡ Fade-Geschwindigkeitsregler Anpassbare Animations-Geschwindigkeit 

🌙 Edles Dark-Mode Interface  Anthrazit-Design mit blauen Akzenten 

🔌 mDNS-Support  Zugriff über "ledlampe.local" ohne IP-Adresse 

🖼 Wandmontage  Integrierte Aufhängung auf der Rückseite

Verwendete Materialien

3D-Druck

  • Filament: PLA oder PETG (weiß, grau oder transluzent empfohlen)
  • Menge: Ca. 150g je nach Größe und Infill
  • Druckzeit: ca. 6-7 Stunden (abhängig von Größe, Einstellungen und Drucker)

Elektronik

  • 1x ESP32 Development Board (ESP32 DevKit V1 oder ähnlich)
  • 1x WS2812B LED Strip (5V, 21 LEDs - je nach Größe, Länge anpassbar)
  • 1x USB Kabel

 

Optional: 

  • Streufolie/Diffusor für gleichmäßigeres Licht
  • Normale LED (OHNE ESP32 und Code)

 

 

 

 

 

 

 

 

Software

  • Arduino IDE (Version 1.8.x oder 2.x)
  • ESP32 Board Support Package
  • Adafruit NeoPixel Library
  • ESPmDNS Library (im ESP32 Core enthalten)

Werkzeug & Zubehör

  • Lötkolben (optional, für stabilere Verbindungen)
  • Kabel / Draht
  • Heißkleber, Sekundenkleber oder doppelseitiges Klebeband
  • Kabelkanäle (optional, für saubere Kabelführung)
  • Schrauben/Dübel/Nagel für Wandmontage

 

Druckeinstellungen

Empfohlene Settings

  • Layer Height: 0.2mm (0.12mm für mehr Detail)
  • Infill: 15-20% (Gyroid oder Grid)
  • Supports: Nein (bei manchen Druckern angezeigt, aber nicht nötig)
  • Brim/Raft: Optional für bessere Haftung
  • Druckgeschwindigkeit: Optional
  • Wandstärke: 3-4 Perimeter
  • Top/Bottom Layers: 4-5

Material-Tipps

  • Weißes/Graues PLA: Klassischer Mond-Look, zeigt Topographie am besten
  • Transluzentes Filament: Lässt mehr Licht durch, weicherer Effekt
  • Silk/Pearlescent PLA: Schimmernder, mystischer Effekt
  • PETG: Robuster und hitzebeständiger (am besten für den Ring, da die LED recht warm werden)

Verkabelung

  • LED Strip DIN → ESP32 GPIO 16 
  • LED Strip 5V → Netzteil 5V+ (positive)
  • LED Strip GND → GND (negative) 

(Bei mehr über 25 LEDs empfehle ich ein zusätzliches Netzteil.)

NUR BEI ÜBER 25 LEDs 

  • (oder per USB) ESP32 GND → Netzteil GND (gemeinsame Masse!)

Wichtig:

  • Immer gemeinsame Masse (GND) zwischen ESP32, LED Strip und Netzteil verbinden!
  • Bei 21 LEDs: Mindestens 2A Netzteil (21 × 60mA = 1.26A + Reserve)
  • LED Strip an der inneren Wand des Rings befestigen.

Montage-Anleitung

Schritt 1: 3D-Druck

  1. Mond Topographie-Datei in Slicer laden
  2. Einstellungen anpassen (siehe oben)
  3. Drucken.
  4. Optional: Oberfläche schleifen und grundieren

Schritt 2: LED-Installation

  1. LED Strip auf passende Länge zuschneiden (21 LEDs bei der default Größe)
  2. LED Strip an der inneren Wand des Rings befestigen.
  3. Optional: Diffusor-Material zwischen LEDs und Mond anbringen

Schritt 3: ESP32 Verkabelung

  1. Kabel an LED Strip löten oder mit Steckverbindern befestigen
  2. ESP32 nach obigem Schema verkabeln
  3. ESP32 in einem kleinen Gehäuse verstecken.
    • Oder direkt an die Wand, auf der Rückseite des Mondes montieren.

Verwendung

Erste Inbetriebnahme

  1. ESP32 mit Strom versorgen
  2. Warten bis Verbindung zum WLAN hergestellt ist (ca. 10 Sekunden)
  3. Browser auf Smartphone/Tablet/PC öffnen
  4. Adresse eingeben: http://ledlampe.local
  5. Interface sollte erscheinen!

 

Steuerung

  • 🎨 Farbe wählen: Tippe auf das Farbfeld und wähle deine Wunschfarbe
    • Klassisches Mond-Weiß: #FFFFFF
    • Warmes Orange für "Supermond": #FF8C00
    • Mystisches Blau: #4169E1
    • Gruseliges Rot für "Blutmond": #8B0000
  • 💡 Helligkeit: Schiebe den Regler (perfekt als Nachtlicht bei 20-30%)
  • ✨ Effekte:
    • Einfarbig: Konstante Farbe deiner Wahl
    • 🌈 Regenbogen: Fließender Farbverlauf über alle LEDs
    • 💫 Fade: Sanftes Pulsieren (Geschwindigkeit einstellbar)
  • ⭕ Ausschalten: Roter Button 

Szenario-Ideen

  • Nachtlicht: Warmes Weiß bei 25% Helligkeit
  • Leselicht: Neutralweiß bei 60-80% Helligkeit
  • Stimmungslicht: Sanftes Blau/Lila mit Fade-Effekt
  • Party-Modus: Regenbogen-Effekt bei voller Helligkeit

Anpassungen & Modifikationen

Code-Anpassungen

  • LED-Anzahl ändern: #define NUM_LEDS 21 anpassen
  • GPIO-Pin ändern: #define LED_PIN 16 auf anderen Pin setzen
  • mDNS-Name ändern: MDNS.begin("mondlampe") statt "ledlampe" um die "Subdomain Adresse zu ändern)
  • Fade-Farben: Im Code unter case 2: RGB-Werte anpassen
  • Regenbogen-Geschwindigkeit: hue += 256 erhöhen/verringern

Hardware-Upgrades

  • Mehr LEDs: Für größere Lampen oder hellere Beleuchtung
  • Bewegungssensor: PIR-Sensor am ESP32 für automatisches Einschalten
  • Lichtsensor: Automatische Helligkeitsanpassung je nach Tageszeit
  • Touch-Sensor: Physische Steuerung direkt an der Lampe
  • Batterieversion: Mit LiPo-Akku und Lademodul für kabellose Version

Design-Varianten

  • Andere Himmelskörper: Mars, Erde, Saturn (mit Ringen!)
  • Sternzeichen: Konstellationen als beleuchtete Reliefs
  • Planeten-Set: Mehrere kleine Planeten als Wandgalerie
  • Farbwechsel-Filament: Mehrfarbiger Druck für zusätzlichen Effekt

Fehlerbehebung

"ledlampe.local" funktioniert nicht

  • Windows: Installiere Bonjour Print Services
  • Android: Verwende Chrome oder Firefox Browser
  • iOS/Mac: Sollte direkt funktionieren
  • Alternative: Nutze die IP-Adresse aus dem Serial Monitor (z.B. 192.168.1.28)

LEDs flackern oder leuchten nicht

  • Stromversorgung prüfen: Externes 5V Netzteil mit min. 2A verwenden
  • Gemeinsame Masse: GND von ESP32, LED Strip und Netzteil verbinden!
  • Verkabelung: DIN am richtigen Pin? Polung korrekt?
  • LED Strip defekt: Teste mit einem einfachen Blink-Sketch

WiFi verbindet nicht

  • SSID/Passwort: Auf Tippfehler prüfen, keine Sonderzeichen verwenden
  • Frequenz: ESP32 unterstützt nur 2.4 GHz WLAN (nicht 5 GHz!)
  • Router-Einstellungen: SSID-Broadcasting aktiviert? MAC-Filter?

Ungleichmäßige Ausleuchtung

  • Diffusor hinzufügen: Milchiges Acryl oder Backpapier zwischen LEDs und Mond
  • Mehr LEDs verwenden: Engerer Abstand für gleichmäßigere Verteilung
  • LED-Platzierung: LEDs weiter vom Mond entfernt anbringen

ESP32 überhitzt

  • Belüftung: Gehäuse mit Luftschlitzen versehen
  • Netzteil: Separate Stromversorgung für LEDs und ESP32
  • Dauerbetrieb: Normal, ESP32 wird warm - kritisch erst ab >80°C

Sicherheitshinweise

⚠ 5V Niederspannung: Ungefährlich, aber trotzdem auf Kurzschlüsse achten 

⚠ Netzteil: Nur zertifizierte Netzteile mit ausreichender Leistung verwenden 

⚠ Überhitzung: Bei dauerhaftem Betrieb auf Erwärmung achten 

⚠ Wandmontage: Stabile Befestigung gewährleisten, besonders bei schweren Lampen


Hier noch der Code:

#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Adafruit_NeoPixel.h>

// WiFi Daten - HIER EINGEBEN const char* ssid = "Netzwerk Name"; const char* password = "Netzwerkschlüssel";

// LED Einstellungen #define LED_PIN 16 // GPIO Pin für DIN #define NUM_LEDS 21 // Anzahl deiner LEDs

Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800); WebServer server(80);

// Aktuelle Einstellungen int brightness = 128; int r = 255, g = 0, b = 0; int mode = 0; // 0=solid, 1=rainbow, 2=fade int fadeSpeed = 30; // Fade Geschwindigkeit in ms bool isOn = true; bool needsUpdate = true; // Flag für Updates

// HTML Web-Interface const char* html = R"( <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1'> <title>LED Controller</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; } .container { max-width: 420px; width: 100%; background: #1a252f; padding: 40px 30px; border-radius: 25px; box-shadow: 0 20px 60px rgba(0,0,0,0.5); } h1 { color: #3498db; margin-bottom: 35px; font-size: 28px; text-align: center; font-weight: 600; } .section { margin-bottom: 30px; padding: 20px; background: #243447; border-radius: 15px; } label { display: block; margin-bottom: 12px; font-weight: 600; color: #ecf0f1; font-size: 14px; text-transform: uppercase; letter-spacing: 0.5px; } .color-picker-wrapper { display: flex; align-items: center; gap: 15px; } input[type='color'] { width: 80px; height: 80px; border: 4px solid #34495e; border-radius: 12px; cursor: pointer; box-shadow: 0 4px 15px rgba(0,0,0,0.3); transition: transform 0.2s; } input[type='color']:hover { transform: scale(1.05); } .color-info { flex: 1; font-size: 16px; color: #95a5a6; font-weight: 500; } input[type='range'] { width: 100%; height: 8px; border-radius: 5px; background: linear-gradient(to right, #34495e, #3498db); outline: none; -webkit-appearance: none; } input[type='range']::-webkit-slider-thumb { -webkit-appearance: none; width: 24px; height: 24px; border-radius: 50%; background: #3498db; cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: all 0.2s; } input[type='range']::-webkit-slider-thumb:hover { background: #2980b9; transform: scale(1.1); } input[type='range']::-moz-range-thumb { width: 24px; height: 24px; border-radius: 50%; background: #3498db; cursor: pointer; border: none; box-shadow: 0 2px 8px rgba(0,0,0,0.3); } .value-display { color: #3498db; font-size: 18px; font-weight: 700; margin-top: 8px; text-align: center; } .button-group { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 15px; } button { background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border: none; color: white; padding: 15px 20px; font-size: 15px; font-weight: 600; border-radius: 12px; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3); } button:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(52, 152, 219, 0.5); } button:active { transform: translateY(0); } .btn-off { background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); box-shadow: 0 4px 15px rgba(231, 76, 60, 0.3); width: 100%; margin-top: 10px; } .btn-off:hover { box-shadow: 0 6px 20px rgba(231, 76, 60, 0.5); } </style> </head> <body> <div class='container'> <h1>💡 LED Lampe</h1>

&lt;div class='power-buttons'&gt;
  &lt;button class='btn-on' onclick='turnOn()'&gt;⚡ Einschalten&lt;/button&gt;
  &lt;button class='btn-off' onclick='turnOff()'&gt;⭕ Ausschalten&lt;/button&gt;
&lt;/div&gt;

&lt;div class='section'&gt;
  &lt;label&gt;🎨 Farbe wählen&lt;/label&gt;
  &lt;div class='color-picker-wrapper'&gt;
    &lt;input type='color' id='color' value='#ff0000' oninput='setColorLive()'&gt;
    &lt;div class='color-info' id='colorInfo'&gt;Rot&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class='section'&gt;
  &lt;label&gt;💡 Helligkeit&lt;/label&gt;
  &lt;input type='range' id='brightness' min='0' max='255' value='128' oninput='updateBrightDisplay()' onchange='setBrightness()'&gt;
  &lt;div class='value-display' id='brightVal'&gt;50%&lt;/div&gt;
&lt;/div&gt;

&lt;div class='section'&gt;
  &lt;label&gt;✨ Effekte&lt;/label&gt;
  &lt;div class='button-group'&gt;
    &lt;button onclick='setMode(0)'&gt;🎨 Einfarbig&lt;/button&gt;
    &lt;button onclick='setMode(1)'&gt;🌈 Regenbogen&lt;/button&gt;
    &lt;button onclick='setMode(2)'&gt;💫 Fade&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class='section' id='fadeSection' style='display:none;'&gt;
  &lt;label&gt;⚡ Fade Geschwindigkeit&lt;/label&gt;
  &lt;input type='range' id='fadeSpeed' min='10' max='100' value='30' oninput='updateFadeDisplay()' onchange='setFadeSpeed()'&gt;
  &lt;div class='value-display' id='fadeVal'&gt;Normal&lt;/div&gt;
&lt;/div&gt;

</div>

<script> let brightTimeout; let fadeTimeout;

function updateBrightDisplay() {
  let b = document.getElementById('brightness').value;
  let pct = Math.round((b/255)*100);
  document.getElementById('brightVal').innerText = pct + '%';
}

function updateFadeDisplay() {
  let speed = document.getElementById('fadeSpeed').value;
  let text = speed &lt; 30 ? 'Schnell' : speed &lt; 60 ? 'Normal' : 'Langsam';
  document.getElementById('fadeVal').innerText = text;
}

function hexToRgb(hex) {
  let r = parseInt(hex.substr(1,2), 16);
  let g = parseInt(hex.substr(3,2), 16);
  let b = parseInt(hex.substr(5,2), 16);
  return {r, g, b};
}

function getColorName(hex) {
  let {r, g, b} = hexToRgb(hex);
  if (r &gt; 200 &amp;&amp; g &lt; 100 &amp;&amp; b &lt; 100) return 'Rot';
  if (r &lt; 100 &amp;&amp; g &gt; 200 &amp;&amp; b &lt; 100) return 'Grün';
  if (r &lt; 100 &amp;&amp; g &lt; 100 &amp;&amp; b &gt; 200) return 'Blau';
  if (r &gt; 200 &amp;&amp; g &gt; 200 &amp;&amp; b &lt; 100) return 'Gelb';
  if (r &gt; 200 &amp;&amp; g &lt; 100 &amp;&amp; b &gt; 200) return 'Magenta';
  if (r &lt; 100 &amp;&amp; g &gt; 200 &amp;&amp; b &gt; 200) return 'Cyan';
  if (r &gt; 200 &amp;&amp; g &gt; 150 &amp;&amp; b &lt; 100) return 'Orange';
  if (r &gt; 150 &amp;&amp; g &lt; 100 &amp;&amp; b &gt; 150) return 'Lila';
  if (r &gt; 200 &amp;&amp; g &gt; 200 &amp;&amp; b &gt; 200) return 'Weiß';
  if (r &lt; 50 &amp;&amp; g &lt; 50 &amp;&amp; b &lt; 50) return 'Schwarz';
  return 'RGB(' + r + ',' + g + ',' + b + ')';
}

function setColorLive() {
  let c = document.getElementById('color').value;
  document.getElementById('colorInfo').innerText = getColorName(c);
  let {r, g, b} = hexToRgb(c);
  fetch('/setColor?r=' + r + '&amp;g=' + g + '&amp;b=' + b);
}

function setBrightness() {
  clearTimeout(brightTimeout);
  brightTimeout = setTimeout(function() {
    let b = document.getElementById('brightness').value;
    fetch('/setBrightness?value=' + b);
  }, 100);
}

function setFadeSpeed() {
  clearTimeout(fadeTimeout);
  fadeTimeout = setTimeout(function() {
    let s = document.getElementById('fadeSpeed').value;
    fetch('/setFadeSpeed?value=' + s);
  }, 100);
}

function setMode(m) {
  fetch('/setMode?mode=' + m);
  document.getElementById('fadeSection').style.display = (m === 2) ? 'block' : 'none';
}

function turnOn() {
  fetch('/on');
}

function turnOff() {
  fetch('/off');
}

</script> </body> </html> )";

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

// LED Strip initialisieren strip.begin(); strip.setBrightness(brightness); strip.show();

// WiFi verbinden WiFi.begin(ssid, password); Serial.print("Verbinde mit WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi verbunden!"); Serial.print("IP Adresse: "); Serial.println(WiFi.localIP());

// mDNS starten if (MDNS.begin("ledlampe")) { Serial.println("mDNS gestartet! Erreichbar unter: http://ledlampe.local"); } else { Serial.println("mDNS Fehler!"); }

// Web Server Routen server.on("/", { server.send(200, "text/html", html); });

server.on("/setColor", { r = server.arg("r").toInt(); g = server.arg("g").toInt(); b = server.arg("b").toInt(); mode = 0; needsUpdate = true; server.send(200, "text/plain", "OK"); });

server.on("/setBrightness", { brightness = server.arg("value").toInt(); strip.setBrightness(brightness); needsUpdate = true; server.send(200, "text/plain", "OK"); });

server.on("/setMode", { mode = server.arg("mode").toInt(); needsUpdate = true; server.send(200, "text/plain", "OK"); });

server.on("/setFadeSpeed", { fadeSpeed = server.arg("value").toInt(); server.send(200, "text/plain", "OK"); });

server.on("/on", { isOn = true; needsUpdate = true; server.send(200, "text/plain", "OK"); });

server.on("/off", { isOn = false; strip.clear(); strip.show(); server.send(200, "text/plain", "OK"); });

server.begin(); Serial.println("Web Server gestartet!"); }

uint16_t hue = 0; uint8_t fadeVal = 0; bool fadeDir = true;

void loop() { server.handleClient();

if (!isOn) { delay(100); return; }

switch(mode) { case 0: // Einfarbig if(needsUpdate) { for(int i=0; i<NUM_LEDS; i++) { strip.setPixelColor(i, strip.Color(r, g, b)); } strip.show(); needsUpdate = false; } delay(10); break;

case 1: // Regenbogen
  for(int i=0; i&lt;NUM_LEDS; i++) {
    strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(hue + (i * 65536L / NUM_LEDS))));
  }
  strip.show();
  hue += 256;
  delay(20);
  break;
 
case 2: // Fade
  if(fadeDir) {
    fadeVal += 5;
    if(fadeVal &gt;= 250) fadeDir = false;
  } else {
    fadeVal -= 5;
    if(fadeVal &lt;= 5) fadeDir = true;
  }
  for(int i=0; i&lt;NUM_LEDS; i++) {
    strip.setPixelColor(i, strip.Color(fadeVal, fadeVal/2, fadeVal/4));
  }
  strip.show();
  delay(fadeSpeed);
  break;

} }

Tagi