1 / 8
Lithophane Lamp — image 1
1 / 8

Lithophane Lamp

Order a print of this model

We calculate the final price from your selected file. You review and accept it before payment.

Saved on this device.

This model can hold 2 100x70mm and 1 100x60mm lithophanes.

Rating
0 / 5
Likes
84
Downloads
179
Makes
0
Views
3,713
Reviews
0

Updated at source:

Model information

Category
Bedroom
License
Creative Commons — Attribution — Noncommercial

This model can hold 2 100x70mm and 1 100x60mm lithophane. Unfortunately, this design still has a few problems that I want to fix in the future.

I used WS2812B LED and an Arduino nano. If you have any questions, ask them in the comments.

I used this website to create the lithophane https://tool.itslitho.com/CreateModel.
You have to select Border as the Frame.

Building guide:

what you need:
Version 1:
   Arduino Nano
   6 led strips with 5 leds
   1 button 6x6x4.5mm
   jumper cable
   6 screws
Version 2:
   Arduino Nano
   6 led strips with 5 leds
   1 button 6x6x4.5mm
   jumper cable
  4 round 5x1mm magnets

Version 1 is way easier to build.

also use the cover pictures to get a better idea.

Step 1: 

3x connect 5V to 5V, Din to Dout and GND to GND

watch the arrowv on the LED strip.

Step 2:

3x connect 1 female jumper cable t 5V, Din and GND

Step 3:

take one of the led stips , and connect male jumper cables as shown in the picture.

Step 4:

Take the butten and connect female jumper cabels to it, as shown in the picture.

Step 5: 

now you can glue the led strips in the Frames

        Base Fram:

Step 6: 

take the stand and push the button in the hole.
it may be that the hole needs to be enlarged a bit, a file or a soldering iron can be used for this.

Step 7: 

now you can connect and screw everything together.

Step 8:

lastly you have to connect everything to the arduino nano and upload the code.
LED strip:
Din to pin 6 (D6)
5V to 5V
GND to GND
button:
one cable with pin 3 (D3)
other cable with GND

/ animation. Initial state has all pixels off -- press the button once to
// start the first animation. As written, the button does not interrupt an
// animation in-progress, it works only when idle.

#include <Adafruit_NeoPixel.h> #ifdef AVR #include <avr/power.h> // Required for 16 MHz Adafruit Trinket #endif

// Digital IO pin connected to the button. This will be driven with a // pull-up resistor so the switch pulls the pin to ground momentarily. // On a high -> low transition the button press logic will execute. #define BUTTON_PIN 3

#define PIXEL_PIN 6 // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 30 // Number of NeoPixels

// Declare our NeoPixel strip object: Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); // Argument 1 = Number of pixels in NeoPixel strip // Argument 2 = Arduino pin number (most are valid) // Argument 3 = Pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) // NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

boolean oldState = HIGH; int mode = 0; // Currently-active animation mode, 0-9

void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); strip.begin(); // Initialize NeoPixel strip object (REQUIRED) strip.show(); // Initialize all pixels to 'off' }

void loop() { // Get current button state. boolean newState = digitalRead(BUTTON_PIN);

// Check if state changed from high to low (button press). if((newState == LOW) && (oldState == HIGH)) { // Short delay to debounce button. delay(20); // Check if button is still low after debounce. newState = digitalRead(BUTTON_PIN); if(newState == LOW) { // Yes, still low if(++mode > 5) mode = 0; // Advance to next mode, wrap around after #8 switch(mode) { // Start the new animation... case 0: colorWipe(strip.Color( 0, 0, 0), 50); // Black/off break; case 1: colorWipe(strip.Color(255, 0, 0), 50); // Red break; case 2: colorWipe(strip.Color( 0, 255, 0), 50); // Green break; case 3: colorWipe(strip.Color( 0, 0, 255), 50); // Blue break; case 4: rainbow(10); break; case 5: colorWipe(strip.Color(127, 127, 127), 50); // Red break;

  }
}

}

// Set the last-read button state to the old state. oldState = newState; }

// Fill strip pixels one after another with a color. Strip is NOT cleared // first; anything there will be covered pixel by pixel. Pass in color // (as a single 'packed' 32-bit value, which you can get by calling // strip.Color(red, green, blue) as shown in the loop() function above), // and a delay time (in milliseconds) between pixels. void colorWipe(uint32_t color, int wait) { for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip... strip.setPixelColor(i, color); // Set pixel's color (in RAM) strip.show(); // Update strip to match delay(wait); // Pause for a moment } }

// Theater-marquee-style chasing lights. Pass in a color (32-bit value, // a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms) // between frames. void theaterChase(uint32_t color, int wait) { for(int a=0; a<10; a++) { // Repeat 10 times... for(int b=0; b<3; b++) { // 'b' counts from 0 to 2... strip.clear(); // Set all pixels in RAM to 0 (off) // 'c' counts up from 'b' to end of strip in steps of 3... for(int c=b; c<strip.numPixels(); c += 3) { strip.setPixelColor(c, color); // Set pixel 'c' to value 'color' } strip.show(); // Update strip with new contents delay(wait); // Pause for a moment } } }

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames. void rainbow(int wait) { // Hue of first pixel runs 3 complete loops through the color wheel. // Color wheel has a range of 65536 but it's OK if we roll over, so // just count from 0 to 365536. Adding 256 to firstPixelHue each time // means we'll make 365536/256 = 768 passes through this outer loop: for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) { for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip... // Offset pixel hue by an amount to make one full revolution of the // color wheel (range of 65536) along the length of the strip // (strip.numPixels() steps): int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels()); // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or // optionally add saturation and value (brightness) (each 0 to 255). // Here we're using just the single-argument hue variant. The result // is passed through strip.gamma32() to provide 'truer' colors // before assigning to each pixel: strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); } strip.show(); // Update strip with new contents delay(wait); // Pause for a moment } }

// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames. void theaterChaseRainbow(int wait) { int firstPixelHue = 0; // First pixel starts at red (hue 0) for(int a=0; a<30; a++) { // Repeat 30 times... for(int b=0; b<3; b++) { // 'b' counts from 0 to 2... strip.clear(); // Set all pixels in RAM to 0 (off) // 'c' counts up from 'b' to end of strip in increments of 3... for(int c=b; c<strip.numPixels(); c += 3) { // hue of pixel 'c' is offset by an amount to make one full // revolution of the color wheel (range 65536) along the length // of the strip (strip.numPixels() steps): int hue = firstPixelHue + c * 65536L / strip.numPixels(); uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB strip.setPixelColor(c, color); // Set pixel 'c' to value 'color' } strip.show(); // Update strip with new contents delay(wait); // Pause for a moment firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames } } }

Tags