Illuminated Moon Wall Lamp (Small Version about ~240mm)
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
- Mond Topographie-Datei in Slicer laden
- Einstellungen anpassen (siehe oben)
- Drucken.
- Optional: Oberfläche schleifen und grundieren
Schritt 2: LED-Installation
- LED Strip auf passende Länge zuschneiden (21 LEDs bei der default Größe)
- LED Strip an der inneren Wand des Rings befestigen.
- Optional: Diffusor-Material zwischen LEDs und Mond anbringen
Schritt 3: ESP32 Verkabelung
- Kabel an LED Strip löten oder mit Steckverbindern befestigen
- ESP32 nach obigem Schema verkabeln
- ESP32 in einem kleinen Gehäuse verstecken.
- Oder direkt an die Wand, auf der Rückseite des Mondes montieren.
Verwendung
Erste Inbetriebnahme
- ESP32 mit Strom versorgen
- Warten bis Verbindung zum WLAN hergestellt ist (ca. 10 Sekunden)
- Browser auf Smartphone/Tablet/PC öffnen
- Adresse eingeben: http://ledlampe.local
- 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
- Klassisches Mond-Weiß:
- 💡 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 21anpassen - GPIO-Pin ändern:
#define LED_PIN 16auf 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 += 256erhö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>
<div class='power-buttons'>
<button class='btn-on' onclick='turnOn()'>⚡ Einschalten</button>
<button class='btn-off' onclick='turnOff()'>⭕ Ausschalten</button>
</div>
<div class='section'>
<label>🎨 Farbe wählen</label>
<div class='color-picker-wrapper'>
<input type='color' id='color' value='#ff0000' oninput='setColorLive()'>
<div class='color-info' id='colorInfo'>Rot</div>
</div>
</div>
<div class='section'>
<label>💡 Helligkeit</label>
<input type='range' id='brightness' min='0' max='255' value='128' oninput='updateBrightDisplay()' onchange='setBrightness()'>
<div class='value-display' id='brightVal'>50%</div>
</div>
<div class='section'>
<label>✨ Effekte</label>
<div class='button-group'>
<button onclick='setMode(0)'>🎨 Einfarbig</button>
<button onclick='setMode(1)'>🌈 Regenbogen</button>
<button onclick='setMode(2)'>💫 Fade</button>
</div>
</div>
<div class='section' id='fadeSection' style='display:none;'>
<label>⚡ Fade Geschwindigkeit</label>
<input type='range' id='fadeSpeed' min='10' max='100' value='30' oninput='updateFadeDisplay()' onchange='setFadeSpeed()'>
<div class='value-display' id='fadeVal'>Normal</div>
</div>
</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 < 30 ? 'Schnell' : speed < 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 > 200 && g < 100 && b < 100) return 'Rot';
if (r < 100 && g > 200 && b < 100) return 'Grün';
if (r < 100 && g < 100 && b > 200) return 'Blau';
if (r > 200 && g > 200 && b < 100) return 'Gelb';
if (r > 200 && g < 100 && b > 200) return 'Magenta';
if (r < 100 && g > 200 && b > 200) return 'Cyan';
if (r > 200 && g > 150 && b < 100) return 'Orange';
if (r > 150 && g < 100 && b > 150) return 'Lila';
if (r > 200 && g > 200 && b > 200) return 'Weiß';
if (r < 50 && g < 50 && b < 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 + '&g=' + g + '&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<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 >= 250) fadeDir = false;
} else {
fadeVal -= 5;
if(fadeVal <= 5) fadeDir = true;
}
for(int i=0; i<NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(fadeVal, fadeVal/2, fadeVal/4));
}
strip.show();
delay(fadeSpeed);
break;
}
}
