Qianyue’s Neon Meow Light-Final

This is my cat🐱.

Ever since I moved here, I can only see he through FaceTime.

So, I decided to create this neon cat light to keep his presence close.

Screenshot

I designed the outline based on his chubby figure and placed it on my bedside table. It’s both a decorative piece and a functional light.

Process

  1. Modeling: I used Rhino to design the 3D model of the cat’s outline, ensuring the grooves fit perfectly for the LED neon strip.
  2. 3D Printing: I printed the outline using a 3D printer, creating a sturdy frame to hold the components and the neon light securely.
  3. Materials Used:
    • Acrylic board: For the base.
    • LED neon strip: For the lighting.
    • Arduino Gemma board: For programming the light modes.
    • Buttons: To switch between modes.
    • Wires: For connections.
    • Power adapter: To power the light.
  4. Assembly: After printing the frame, I placed the LED strip into the grooves, connected the Arduino board and wires, and programmed the buttons to control the light modes.

A mistake


When I tried to use a heat gun to shrink the wire insulation, the hot air accidentally blew onto the frosted acrylic board, turning it transparent! (Note to self: never use a heat gun near frosted acrylic!)

Features

The lamp has two modes:

  • Day Mode: The light flashes like a comet, with each “comet” in a different color. After the comet effect, a rainbow light flows smoothly through the strip.

Night Mode: The light switches to a soft white glow that flickers gently, serving as a cozy night light.

My instructable link:

https://www.instructables.com/Neon-Meow-Cat-Light

Day Mode Code

#include <Adafruit_NeoPixel.h>

#ifdef __AVR__

#include <avr/power.h>

#endif

#define BUTTON_PIN 2 // 按钮引脚(接地)

#define PIXEL_PIN 1 // NeoPixel数据引脚

#define PIXEL_COUNT 140 // LED数量

Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

boolean oldState = HIGH;

int mode = 0; // 0: off, 1: animations

// 动画序列:0:RainbowComet(往返一次), 1:RainbowChase

int currentAnim = 0;

// 彗星动画参数

int cometPos = 0;

bool cometForward = true;

bool cometDone = false;

uint8_t cometTailLength = 20;

// 彗星颜色循环索引

uint8_t cometColorIndex = 0;

// 定义5种颜色的Hue和Saturation

// 黄色、绿色、蓝色、紫色、白色

uint16_t cometHues[5] = {10920, 21840, 43680, 54600, 0};

uint8_t cometSats[5] = {255, 255, 255, 255, 0};

// 白色通过S=0实现,无需关心Hue

uint16_t cometBaseHue = 0;

uint8_t cometBaseSat = 255;

// RainbowChase动画参数

uint16_t chaseBaseHue = 0;

void setup() {

pinMode(BUTTON_PIN, INPUT_PULLUP);

strip.begin();

strip.show(); // 初始化后关灯

}

void loop() {

boolean newState = digitalRead(BUTTON_PIN);

// 检测按钮按下从高到低的变化

if ((newState == LOW) && (oldState == HIGH)) {

delay(20);

newState = digitalRead(BUTTON_PIN);

if(newState == LOW) {

mode = 1; // 切换到动画模式

currentAnim = 0; // 从彗星动画开始

cometPos = 0;

cometForward = true;

cometDone = false;

// 切换到下一个颜色

cometColorIndex = (cometColorIndex + 1) % 5;

cometBaseHue = cometHues[cometColorIndex];

cometBaseSat = cometSats[cometColorIndex];

}

}

oldState = newState;

if (mode == 1) {

switch (currentAnim) {

case 0: // RainbowComet动画:往返一次

if (!cometDone) {

rainbowCometAnimation();

} else {

currentAnim = 1; // 往返完成,进入RainbowChase

}

break;

case 1: // RainbowChase快速流动

rainbowChaseAnimation();

break;

}

} else {

// off模式:关灯

strip.clear();

strip.show();

}

}

// RainbowComet动画函数:从头到尾再从尾到头往返一次

void rainbowCometAnimation() {

strip.clear();

// 彗星头部颜色使用cometBaseHue和cometBaseSat

int headHue = cometBaseHue;

uint8_t headSat = cometBaseSat;

strip.setPixelColor(cometPos, strip.gamma32(strip.ColorHSV(headHue, headSat, 255)));

// 设置彗星尾巴(略微改变Hue增加层次感)

for(int t=1; t<=cometTailLength; t++) {

int pos = cometPos – (cometForward ? t : -t);

while (pos < 0) pos += strip.numPixels();

while (pos >= strip.numPixels()) pos -= strip.numPixels();

uint8_t brightness = 255 – (255/cometTailLength)*t;

int tailHue = (headHue + t*300) % 65536;

// 尾巴使用与头部相同的饱和度设置

strip.setPixelColor(pos, strip.gamma32(strip.ColorHSV(tailHue, headSat, brightness)));

}

strip.show();

// 更新彗星位置

if (cometForward) {

cometPos++;

if (cometPos >= strip.numPixels()) {

// 到达末端,开始返回

cometPos = strip.numPixels() – 1;

cometForward = false;

}

} else {

cometPos–;

if (cometPos < 0) {

// 返回到起点,结束彗星动画

cometPos = 0;

cometDone = true;

}

}

delay(20);

}

// RainbowChase动画函数:快速流动的追逐效果

void rainbowChaseAnimation() {

strip.clear();

for(int i=0; i<strip.numPixels(); i++) {

uint16_t pixelHue = chaseBaseHue + (i * 300);

strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue % 65536, 255, 255)));

}

strip.show();

chaseBaseHue += 512;

delay(10);

}

Night Mode Code

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN 2

#define PIXEL_PIN 1 // 根据实际连接更改引脚

#define PIXEL_COUNT 140

Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

boolean oldState = HIGH;

boolean animationActive = false;

void setup() {

pinMode(BUTTON_PIN, INPUT_PULLUP);

strip.begin();

strip.setBrightness(50); // 设置亮度,避免太暗

strip.show();

}

void loop() {

boolean newState = digitalRead(BUTTON_PIN);

// 检测按钮是否从高到低

if (newState == LOW && oldState == HIGH) {

delay(20); // 去抖动

if (digitalRead(BUTTON_PIN) == LOW) {

animationActive = !animationActive; // 切换动画状态

if (!animationActive) {

strip.clear();

strip.show(); // 关闭灯效

}

}

}

oldState = newState;

// 如果动画激活,运行闪烁效果

if (animationActive) {

fadeEffect(5, 60); // 调整步长和延迟控制效果

}

}

void fadeEffect(int step, int delayTime) {

for (int brightness = 0; brightness <= 255; brightness += step) {

setAllPixels(strip.Color(brightness, brightness, brightness));

strip.show();

delay(delayTime);

}

for (int brightness = 255; brightness >= 0; brightness -= step) {

setAllPixels(strip.Color(brightness, brightness, brightness));

strip.show();

delay(delayTime);

}

}

void setAllPixels(uint32_t color) {

for (int i = 0; i < strip.numPixels(); i++) {

strip.setPixelColor(i, color);

}

}

If I were to improve this project, I would like to create more complex outlines and enable the neon light to display multiple colors simultaneously. This would add more depth and versatility to the design.

Thanks for watching!

Qianyue’s Neon meow light progress



I’ve decided to dive deeper into the neon light idea. I’m planning to create a neon ambient lamp for the bedroom in the shape of a cat. This way, it feels like a little cat is always there keeping you company, adding a touch of warmth and charm to the space.

Materials List:

  1. Flexible LED neon light strip (suitable for a cat shape) https://www.amazon.com/ALITOVE-Addressable-Decorative-Lighting-Controller/dp/B07WHT2VKK/#customerReviews
  2. Acrylic board
  3. LED strip controller and power adapter
  4. hot glue gun or 3D print (maybe)
  5. Wire clips or fasteners
  6. Electrical wires and soldering tools

My google doc:https://docs.google.com/document/d/1c3bapVlA8K-IOAA1fMP_HlSzHjJg3MzD6iVXl7D36qQ/edit?usp=sharing

My instructables:https://www.instructables.com/member/Qianyue%20Zhou/

Qianyue’s final project proposal

Cat Figurine with Light and Sound Features

I saw this adorable cat figurine online!!And I was immediately drawn to it. This sparked an idea for me to design my own cat figurine with interactive features such as light and sound. When a button is pressed, the figurine could light up or emit a cat’s meow, adding an extra layer of fun and interaction to the decoration.

Cat Night Light: Touch Sensitive Light

I would like to design a cat-shaped night light with touch-sensitive function. When the user gently touches the cat’s head or back, the light will softly illuminate, providing warm nighttime illumination.

Cat Neon Lights

I would like to design a cat neon light, which is designed with a cute cat silhouette and emits a soft and colourful neon light!

Qianyue’s Luminous Flight

For Halloween, I designed a glowing butterfly headpiece, inspired by the elegance and vibrance of blue butterflies. The headpiece is adorned with artificial butterflies and small LED lights woven through blue, glittery fabric to create a whimsical, ethereal effect. I chose this concept because butterflies symbolize transformation and beauty—perfect for a night of costumes and creativity.

Throughout the process, I learned a lot about wiring and working with LEDs to achieve the right brightness. One thing I’d do differently is adjust the wiring to make it less visible, perhaps by hiding it within thicker fabric or creating a dedicated channel for the wires.

Materials Used:

  • Artificial butterflies
  • Blue glitter fabric
  • LED string lights
  • Battery pack
  • Wire
#include <Adafruit_NeoPixel.h>

#define PIN 1

#define NUM_LEDS 8

#define BRIGHTNESS 50

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct if colors are swapped upon testing
//   NEO_RGBW    Pixels are wired for RGBW bitstream
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

void setup() {

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

void loop() {
  // Alternate fading between blue and purple
  fadeColor(strip.Color(0, 0, 255));   // Blue
  fadeColor(strip.Color(128, 0, 128)); // Purple
}

// Function to fade in and out a specified color
void fadeColor(uint32_t color) {
  // Gradually increase brightness
  for (int brightness = 0; brightness <= 255; brightness += 5) {
    setStripColor(color, brightness);
    delay(30); // Adjust delay for slower or faster fade
  }
  
  // Gradually decrease brightness
  for (int brightness = 255; brightness >= 0; brightness -= 5) {
    setStripColor(color, brightness);
    delay(30); // Adjust delay for slower or faster fade
  }
}

// Function to set all LEDs to a specific color with specified brightness
void setStripColor(uint32_t color, int brightness) {
  uint8_t r = (color >> 16) & 0xFF;
  uint8_t g = (color >>  8) & 0xFF;
  uint8_t b =  color        & 0xFF;

  // Apply brightness scaling
  r = (r * brightness) / 255;
  g = (g * brightness) / 255;
  b = (b * brightness) / 255;

  // Set color for all LEDs
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }
  strip.show();
}

}

// 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 pulseWhite(uint8_t wait) {
  for(int j = 0; j < 256 ; j++){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, j ) );
        }
        delay(wait);
        strip.show();
      }

  for(int j = 255; j >= 0 ; j--){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, j ) );
        }
        delay(wait);
        strip.show();
      }
}


void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) {
  float fadeMax = 100.0;
  int fadeVal = 0;
  uint32_t wheelVal;
  int redVal, greenVal, blueVal;

  for(int k = 0 ; k < rainbowLoops ; k ++){
    
    for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel

      for(int i=0; i< strip.numPixels(); i++) {

        wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255);

        redVal = red(wheelVal) * float(fadeVal/fadeMax);
        greenVal = green(wheelVal) * float(fadeVal/fadeMax);
        blueVal = blue(wheelVal) * float(fadeVal/fadeMax);

        strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) );

      }

      //First loop, fade in!
      if(k == 0 && fadeVal < fadeMax-1) {
          fadeVal++;
      }

      //Last loop, fade out!
      else if(k == rainbowLoops - 1 && j > 255 - fadeMax ){
          fadeVal--;
      }

        strip.show();
        delay(wait);
    }
  
  }



  delay(500);


  for(int k = 0 ; k < whiteLoops ; k ++){

    for(int j = 0; j < 256 ; j++){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, j ) );
          }
          strip.show();
        }

        delay(2000);
    for(int j = 255; j >= 0 ; j--){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, j ) );
          }
          strip.show();
        }
  }

  delay(500);


}

void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) {
  
  if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;

  int head = whiteLength - 1;
  int tail = 0;

  int loops = 3;
  int loopNum = 0;

  static unsigned long lastTime = 0;


  while(true){
    for(int j=0; j<256; j++) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        if((i >= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){
          strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
        }
        else{
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
        
      }

      if(millis() - lastTime > whiteSpeed) {
        head++;
        tail++;
        if(head == strip.numPixels()){
          loopNum++;
        }
        lastTime = millis();
      }

      if(loopNum == loops) return;
    
      head%=strip.numPixels();
      tail%=strip.numPixels();
        strip.show();
        delay(wait);
    }
  }
  
}
void fullWhite() {
  
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
}


// 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);
  }
}

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);
  }
}

// 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,0);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}

uint8_t red(uint32_t c) {
  return (c >> 8);
}
uint8_t green(uint32_t c) {
  return (c >> 16);
}
uint8_t blue(uint32_t c) {
  return (c);
}

Qianyue’s Halloween costume process

I chose to create a blue butterfly headpiece for my Halloween costume. The design features a series of small blue butterflies attached with tiny LED lights to give a glowing effect. I will also craft a larger butterfly using wire, decorated with blue and glittery fabric to make it stand out. The combination of the glowing butterflies and the large central piece will create an eye-catching, magical headpiece perfect for the Halloween season.

Gather Materials:

  • Blue butterflies
  • Small LED lights
  • Wire
  • Blue and glittery fabric
  • Hot glue gun and glue sticks

To do list

Attach LEDs:

  • Carefully attach small LED lights to the underside of each butterfly using hot glue. Position them so the lights enhance the butterfly’s wings.

Shape the Larger Butterfly:

  • Use wire to create the frame for a large butterfly. Shape the wings and body, ensuring the structure is stable.

Decorate the Large Butterfly:

  • Wrap the wire frame with blue fabric, securing it with glue. Add glittery fabric or rhinestones to enhance its sparkle.

Assemble the Headpiece:

  • Attach the butterflies to a headband or wire base. Arrange the smaller LED butterflies around the head and position the large butterfly at a focal point, such as the top or side.

Test the LEDs:

  • Ensure all LED lights work properly, and adjust any placement if necessary to achieve your desired glowing effect.

Qianyue’s Halloween costume ideas

IDEA I

My first idea was a butterfly headdress, I wanted the strip of lights to use alternating colours of purple and blue on the butterfly

IDEA II

My second idea would be dark black spider webs, and maybe if possible a couple of glowing spiders crawling on the webs (high level of difficulty)

IDEA III

A pumpkin hat that makes a glowing expression through led strip lights

Qianyue Zhou’s Cat’s Paw Night Light

My night light is designed in the shape of a cat paw, with a black base and soft pink cat fingers. I created it for my own kitten, but I hope everyone who loves cats will enjoy it too. When it lights up, it’s as if the little paw is waving and greeting you, bringing a playful and comforting feeling. The light is meant to make the user feel connected to their love for cats, adding a fun and warm touch to any room.

Description of materials and parts used

I used black fabric for the main part of the cat paw so that light wouldn’t pass through. For the fingers, I used pink felt and sewed a small red LED light behind each finger, so the light only shines through the paw’s fingers.

My journey through this project

The most challenging part of this project was securing the LED lights in the cat fingers. First, I created a circuit with five LED lights. After sewing the pink fabric for the fingers, I attached it to the black base. I then cut small openings behind each pink pad to insert the LED light, ensuring it was centered in the pink part.

If I had more time, I would improve the attachment method of the LED lights for better durability and consider using a rechargeable battery to enhance convenience. Additionally, I would test different light intensities for better visual effects.

The most surprising challenge was managing the fabric’s texture to make sure the light diffused in just the right way. If I had more time, I would focus on refining the materials, experimenting with different shades of pink, and improving the circuitry to make the lighting more even.

Qianyue Zhou’s Plush Night Light Proposal

When I sew, the first thing I think of is my kittens and I want to make something cute for them!

When combined with a nightlight

finally,I’m going to make a raised cat paw

That way, when the light comes on, it’s like it’s saying hello to you

I plan to use an opaque fabric for the cat’s paws as a whole and a translucent light-coloured fabric for the paw pad section

Kidde Smoke & Carbon Monoxide Detector  Teardown



I got this fire alarm, which is very common in people’s lives. In fact, I even have one of the same brand in my room. This made me curious about its internal structure and how it operates.Let’s do this!

The tools used

  • Needle-nose pliers
  • flathead screwdriver
  • Phillips screwdriver

Teardown steps

1.Remove the battery cover

2.Use a flathead wrench to remove the alarm cover

3.Use a Phillips screwdriver to remove the circuit board and speaker.And that’s it!

The materials used for each component

componentmaterialtechniques/equipment
Main Circuit BoardEpoxy resin, copper, electronic componentsPCB fabrication, etching, soldering
Smoke Detector SensorPhotoelectric sensors, semiconductorsSensor assembly, integration of photodiodes
CO Detector SensorElectrochemical cellsElectrochemical assembly, electrode preparation
SpeakerPlastic, magnet, diaphragmInjection molding, assembly, tuning
Battery CompartmentPlasticInjection molding
Test/Reset ButtonPlasticInjection molding
Indicator LightLED, plastic lensLED assembly, plastic molding
Mounting BasePlasticInjection molding
Alarm HousingPlasticInjection molding

Chips

PCBA2544-9782A FW 2544-5?81 B 011015 ??

Design elements

1.I think the structural design of the alarm is very easy to install and use. The user interface is simple and clear, consisting of a speaker (for alarm sounds) and LED lights. The alarm sound or signal is sufficiently noticeable to ensure it can be easily detected in emergency situations.

2.The Kidde alarm integrates smoke detection and carbon monoxide detection into a single unit. It uses an ionization sensor to detect fires and an electrochemical sensor to detect carbon monoxide. This combination provides a more comprehensive response to the two main hazards in a home.(Specific details are provided by Amazon)