Project tutorial

Making of the Holiday Lantern © GPL3+

Making a Holiday Lantern for which I can change its 'outfits' to different theme depending on the holiday seasons.

  • 499 views
  • 0 comments
  • 4 respects

Components and supplies

Apps and online services

About this project

.

I wanted to make a lantern that I can change its 'outfits' to different theme depending on the holiday seasons. So I make this lantern which I can change to paper covers and lighting of the lantern. A easy one would be just reuse any lighting of the desk lamps or standing lamps.

In this project, I custom make the paper cover for the 2017 Lunar New Year which is the Year of Rooster. And I use a pair of NeoPixel Rings as the lighting.

.

Making the Lantern

.

I have a 5L mineral water plastic bottle.

.

And I have a piece of color paper with patterns. This color paper is of rice paper type which is translucent.

.

I cut the plastic bottle into two parts: the top and bottom parts.

.

Make a cylinder 'outfit' for the lantern using the color paper.

.

Cut two openings at top part of the plastic bottle. These are used to hold the two NeoPixel Rings.

.

Fix the MKR1000 and NeoPixel Rings to the top part of the plastic bottle.

.

Cover the top part with the bottom part of the bottle inverted.

.

Connecting the NeoPixel Rings

Follow the following links to connect your NeoPixel Rings to the Arduino board. I use two rings side-by-side.

.

Breadboarding the circuit

NeoPixel Rings

.

The Code

.

I am using the strandtest example of the Adafruit NeoPixel library to drive the lantern. With the Arduino Web Editor, it is easy to upload the sketch to my Genuino MKR1000 board.

Step 1 : Search for the Adafruit NeoPixel library

Step 2: Open the strandtest example of the NeoPixel library

Step 3: Select MKR1000 board and its port

Step 4: Upload the sketch

The Visual

.

The lantern without the Lunar New Year 'outfit'.

.

The lantern with the Lunar New Year 'outfit'.

.

Video link #1.

Video link #2.

.

What I can change to the lantern to match the holiday season or make it better

  • Change the lantern 'outfit' to match the theme of the season.
  • Change the lighting pattern.
  • Ask Alexa to turn on and off the lantern

.

Code

strandtestArduino
This sketch is the strandtest example of NeoPixel example.
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 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)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Comments

Similar projects you might like

Arduino - Have Fun with Color Sensor

Project tutorial by khanhhs

  • 768 views
  • 0 comments
  • 12 respects

Arduino - Web-Based Thermometer

Project tutorial by khanhhs

  • 814 views
  • 0 comments
  • 12 respects

Using Python and Arduino MKR1000 for Secure IoT

Project tutorial by Luigi Francesco Cerfeda

  • 2,475 views
  • 1 comment
  • 13 respects

Retro Nokia Snake Game with Arduino

Project tutorial by circuito.io team

  • 3,509 views
  • 2 comments
  • 24 respects

Play Music With Your Remote

Project tutorial by Simone Adobs

  • 730 views
  • 12 comments
  • 6 respects

MorseCard - A Tiny Telegraph Station

Project tutorial by Alex Wulff

  • 1,280 views
  • 1 comment
  • 6 respects
Add projectSign up / Login