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!

Get Back! Brooch

composite

1. Team Ahaar – The Get Back! Brooch
Oomung, Phuong Anh, Tzu-Ching and André

2. Ideal Product:

Get Back! is a brooch/pendant that visually and audibly shows the comfortable amount of personal space by the user. It uses a built-in infrared sensor to judge distance, and a Neopixel to show different colors. With these pieces, the product would judge the distance between the user and another person, and glow green to indicate acceptable, yellow to indicate discomfort, red to indicate anxiety, and pulsing red to indicate panic depending on distance. Ideally, it can also:

  • Produce sounds when others are getting too close to the wearer
  • Have an on/off switch
  • Allow the wearer to set his/her own comfortable distance

Ideal User Scenario:

We envision this product as a discreet, daily wearable for those with crowd anxiety disorders, personal space issues, or women subject to subtle harassment by unknowingly aggressive people. This product would be switched on continually throughout the day, and act as a social advocate of sorts, alerting others to their behavior in a subtle way without pressuring the user to do so themselves.

A user scenario could be a young man with anxiety who wears the product as a lapel pin on his suit jacket. During a normal day at the office, whenever a colleague got uncomfortably close, the product would flash and alert them to slightly back away, at once restoring personal space for our young man and avoiding embarrassment for his colleague.

Where the Product Would Be Sold:

This product would be marketed as a “smart” fashion accessory, and could be sold at premium menswear clothiers, women’s fashion boutiques, and department stores.

3. The technical steps to our prototype:

  1. Design the look
    IMG_6179.JPG
    IMG_6177 copy.jpg
  2. Design the circuit diagram
  3. Code it
  4. Get the materials: Sharp IR Distance Sensor, Neopixel ring (12 x WS2812 5050 RGB LED Ring), plastic case for the dome, 3D model design and some wires
  5. Construct the device
    • Solder wires
    • 3D model and printed case
    • Attach everything together

process-01.png

We had some run-ins with the sensor not working properly as it was placed behind the transparent dome. Thus, we decided to sawed the front off. And it worked!!

process-02.png

IMG_6208.JPG
Our circuit

4. If given more time on this project, we would:

Work out a way to hide all of the wires and it would have a small battery pack encased with the Neopixel.

5. By building this project, we learned:

How to design a form with the intention of a circuit board inside. We also learned to troubleshoot and try to fix the problems that came up along the way (both in coding and the process of making the casing and attaching all the parts together.

Oomung’s experience: Every time the code was iterated upon to solve old problems, new ones arose. This experience reaffirmed the difficulty and importance of coding and bug-testing. The key element for me was understanding the use of arrays to generate an average ‘smooth’ input from the raw and glitchy analog input. Also, understanding the circuit board and electronic components helped in form development, wherein our design fit together all the pieces while maintaining our core sense of aesthetics.

6. Other potential applications

  • Mounted on a wall next to paintings in a gallery, to let people know if they’re being too close
  • Late night protection wear on the back: warning people with bad intention that the wearer is aware they are there.
  •  Don’t touch my hairpin

7. Our code

/this code requires the Sharp.IR code libary and a sharp ir sensor, the VFL has them to lend out
#include
//this specifies what model and pin the sensor is on, i called it sensor
SharpIR sensor(GP2YA41SK0F, A2);

#include
#ifdef __AVR__
#include <avr/power.h>
#endif

#define NUM_LEDS 12

#define BRIGHTNESS 5

const int numReadings = 50;

int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average

//you all know what this is

#define PIN 6

//specify the which type of neopixel strip this is, RGBW
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
Serial.begin(9600);
strip.begin();
strip.show(); // starts with all the pixels off
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings[thisReading] = 0; } } void loop() { // subtract the last reading: total = total - readings[readIndex]; // read from the sensor: readings[readIndex] = sensor.getDistance(); // add the reading to the total: total = total + readings[readIndex]; // advance to the next position in the array: readIndex = readIndex + 1; // if we're at the end of the array... if (readIndex >= numReadings) {
// ...wrap around to the beginning:
readIndex = 0;
}

// calculate the average:
average = total / numReadings;
// send it to the computer as ASCII digits

Serial.println(average);
delay(1); // delay in between reads for stability

//an if+else reacting to 3cm-10cm distance with a specific color for every individual pixel

//first led
if (average >22) {
strip.setPixelColor(0,strip.Color(0, 217, 0));
strip.show();
} else {
strip.setPixelColor(0, 0);
strip.show();

//second led
}if (average == 22) {
strip.setPixelColor(1,strip.Color(10, 217, 0));
strip.show();
} else {
strip.setPixelColor(1, 0);
strip.show();

//third led
}if (average == 21) {
strip.setPixelColor(2,strip.Color(30, 190, 0));
strip.show();
} else {
strip.setPixelColor(2, 0);
strip.show();

//fourth led
}if (average == 20) {
strip.setPixelColor(3,strip.Color(60, 150, 0));
strip.show();
} else {
strip.setPixelColor(3, 0);
strip.show();

//fifth led
}if (average == 19) {
strip.setPixelColor(4,strip.Color(150, 120, 0));
strip.show();
} else {
strip.setPixelColor(4, 0);
strip.show();

//sixth led
}if (average == 18) {
strip.setPixelColor(5,strip.Color(150, 100, 0));
strip.show();
} else {
strip.setPixelColor(5, 0);
strip.show();

//seventh led
}if (average == 17) {
strip.setPixelColor(6,strip.Color(150, 70, 0));
strip.show();
} else {
strip.setPixelColor(6, 0);
strip.show();

//eighth led
}if (average == 16) {
strip.setPixelColor(7,strip.Color(150, 60, 0));
strip.show();
} else {
strip.setPixelColor(7, 0);
strip.show();

//ninth led
}if (average == 15) {
strip.setPixelColor(8,strip.Color(150, 40, 0));
strip.show();
} else {
strip.setPixelColor(8, 0);
strip.show();

//tenth led
}if (average == 14) {
strip.setPixelColor(9,strip.Color(180, 20, 0));
strip.show();
} else {
strip.setPixelColor(9, 0);
strip.show();

//eleventh led
}if (average == 13) {
strip.setPixelColor(10,strip.Color(217, 0, 0));
strip.show();
} else {
strip.setPixelColor(10, 0);
strip.show();

//twelvth led
}if (average <=12) {
strip.setPixelColor(11,strip.Color(0, 217, 0));
strip.show();
} else {
strip.setPixelColor(11, 0);
strip.show();
}

}
/

	

Shhhhhhhhhh! ambient sound sensor

Team: Xuan, Rhea, Hannah, Micah

Update

The code is working and the lights are reactive to sound. Unfortunately, the fill lights in the background are not working, there may be a wiring issue. It will have to be looked into later.

Previous

It doesn’t quite work, but it will soon! We were pretty ambitious with the design of this project and perhaps aimed a bit too high for the “rough prototype” level. But it’s just so pretty and we’re pretty proud. Below are the pictures of the prototype of the model:

box_nolight.jpg

Continue reading “Shhhhhhhhhh! ambient sound sensor”

Bubble Experience Fail? 😰

Team 👻 Group Member Names: John Boran, Evie Cheung, Eugenia Ramos, Yangying Ye

dog-bubbles.jpg

In an Ideal World: An Uplifting, Immersive Bubble Experience

If our project had worked as planned, this motion-sensor bubble machine would be great in multiple settings. It could be used for the following:

+ To bring delight to children at a hospital and be an uplifting reminder against the typical, drab hospital environment Continue reading “Bubble Experience Fail? 😰”

North Studio Temperature Reader

Hello fellow makers!

Two weeks ago, the CANduit group proposed three concepts for sensing an undesired behavior or environment. Our four group members all belong to the North Classroom at SVA Products of Design, which is notoriously known for being the coldest of studios, and although cannot solve this temperature problem, we are choosing to bring attention to the drastic range of temperatures one experiences in the studio.

To do this, we created a hanging lighting device that emits sound when the room’s temperature exceeds and dips below a particular degree. The device consists of a red and blue light, of which represent “warm” and “cold”. Warm temperatures trigger the red light to shine while Johnny Cash’s “Ring of Fire” plays for 10 seconds. Similarly, cold temperatures trigger the blue light to shine while “Cold Cold Cold” by Cage The Elephant plays for 10 seconds.

To start our process, we explored how our temperature sensor worked when exposed to heat and ice.

IMG-2630.JPG
An ice cube being applied to the temperature sensor

IMG_20171031_125813.jpg
Our LED and Temperature Sensor set-up

To add sound, we purchased a soundboard (Adafruit Audio FX Mini Sound Board – WAV/OGG Trigger – 2MB Flash) and amplifier (Adafruit Mono 2.5W Class D Audio Amplifier) This particular soundboard does not have any code, and works like a standard USB drive – you can drag and drop your files onto the soundboard.

IMG_4826.JPG
Soundboard, speaker, and LED setup. The LEDs were quite dim when we tried to light 6, so we decided to use only one red and one blue LED.

IMG_4828.JPG

In order to hang our device with little mess, we used a tubed-netting fabric to keep our wires together. These wires will be soldered to each of our LEDs and to the speaker. Our Arduino board and other bulky parts will be mounted on a sheet of plexiglass, as to be concealed. LEDs will inhabit a small plastic sphere that will hang from the ceiling.

The hanging cord will run from the LEDs, through the plexiglass mount, and along the wall until it reaches an outlet/power source.

Screen Shot 2017-11-06 at 1.01.57 PM.png

Currently, we are having a hard time completing our code in the way that we would like our system to work. Adjusting the temperature does trigger our songs to play, but in a loop. We would only like for our song to play only once, not continuously until the temperature is triggered in the opposite direction (hot –> cold).

Because our DigitalWrite statements, the ones that trigger music to play, exist within our loop, once the trigger has started, the music is repeated. Despite telling our code to stop playing after one time, our trouble still lies in figuring out how to stop the music from playing after the audio clip has finished.

Team Sense – Sound Snitch

Team Sense:
Gustav, Zihan, Sophie and Antya
What the ideal finished version of this product would be like/who’s it for:
Our ideal version of the product would have a different microphone; it would need to be more powerful to be able to catch when you are loud more precisely. Our light output could also be more potent so you could be able to see it from across the room or have the materials expand the light. It would also be important for the user to have access to change the threshold range so that they could select what they considered as unacceptable noise.
Regarding the materials, it would need to be made out of some plastic, maybe ABS or a similar one and it should have an opaque part and a transparent one so that the light can shine through. Ideally, it would be integrated with the speakers or even to your phone.
It would be focus towards young people who live in apartments or live in proximity to their neighbors, or teenagers even as they tend to be the loudest.

The technical steps you took to achieve your prototype:

We first came up with the idea to make a product which helped let someone know when they are playing music too loud.

The first step was to figure out the coding and try to understand the mic and coding for the mic. Once we got the mic to work with coding found from Becky’s recommendation, we decided to use a pixel stick as it would be bright enough to send off a visual sort of alarm to the person playing music too loud.

We played around with the coding for many hours and finally were able to figure out the right “if statements” and the right threshold for the volume of sound we wanted the sensor to react to.

We decided we wanted the design of the product to look somewhat like a fire alarm, where it would be white and mounted on the wall. We built our prototype for this out of wood and painted it white and made it so that the breadboard and circuit could fit nicely inside of the box with a transparent plastic on top for the light to shine through. Below are some of our process photos:

SoundSnitch2 from Antya Waegemann on Vimeo.

 

What did you learn from building this project?

Even though the whole mechanism is quite simple, there are still details needed to be work on very well in order for it to work properly. For example, we needed to transfer the measurement volume of the sound from the numbers in the Arduino code to the decibel in real life. This was something what we did not fully expect. How we completed that was to using a sound measuring app to measure the volume of some music we thought to be on a level exceeded which would be annoying. So even to make a very simple ideas into application, many unexpected details will need to taken care off.

What you would do next/differently if given more time on this project:

If we had had more time, then we would have incorporated an app remote into our project.

This would have allowed for the user to adjust the threshold. Thereby, the user would be able to customize the product to their need and linking.

Furthermore, it would be interesting to explore the input sensor our product and utilizing the output possibilities build within the smartphone.

Maybe, we could make the phone vibrate, when the threshold was reached?

Code:

 // NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

#include 
#ifdef __AVR__
#include <avr/power.h>
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define LED_PIN1            (5,6)
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      16
// Defining the mic
#define SAMPLE_WINDOW 33 // Sample window width in mS (33 mS = ~30 Hz)
#define MIC_PIN       A1 // ANALOG pin # where microphone "OUT" is connected
#define THRESHOLD     625

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, LED_PIN1, NEO_GRBW + NEO_KHZ800);

  int delayval = 200; // delay 


  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
  // Start mic setup
  pinMode(LED_PIN1, OUTPUT);
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(MIC_PIN, INPUT);

  pixels.begin(); // This initializes the NeoPixel library.
}

  void loop() {
int inputaudio = analogRead(MIC_PIN);
Serial.println(inputaudio);
  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.
if (inputaudio > THRESHOLD){
  Serial.println("Threshold has been exceeded");
  for(int i=0;i<pixels.numPixels();i++){

  // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(255,0,0)); // Moderately bright green color.

  //pixels.show(); // This sends the updated pixel color to the hardware.
  
  //delay(delayval); // Delay for a period of time (in milliseconds).
  //   
  //pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
  //pixels.setPixelColor(i, pixels.Color(0,0,0)); // Moderately bright green color.
  
  //pixels.show(); // This sends the updated pixel color to the hardware.

  //delay(delayval); // Delay for a period of time (in milliseconds).

  }
  pixels.show(); // This sends the updated pixe
  delay(delayval); // Delay for a period of time (in milliseconds).
  for(int i=0;i<pixels.numPixels();i++){

   // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
   pixels.setPixelColor(i, pixels.Color(0,0,0)); // Moderately bright green color.
    
}
  pixels.show(); // This sends the updated pixe
  delay(delayval); // Delay 
}

//  // Listen to mic for short interval, recording min & max signal
//  unsigned int signalMin = 1023, signalMax = 0;
//  unsigned long startTime = millis();
//  while((millis() - startTime) < SAMPLE_WINDOW) {
//    int sample = analogRead(MIC_PIN);
//    if(sample < signalMin) signalMin = sample; //    if(sample > signalMax) signalMax = sample; 
//    { 
//    int peakToPeak = signalMax - signalMin; // Max - min = peak-peak amplitude
//  int n = (peakToPeak -1) / 4;          // Remove low-level noise, lower gain
//  if(n > 50)    n = 50;                 // Limit to valid PWM range
//  else if(n < 0) n = 0;
//  analogWrite(LED_PIN1, n);   // And send to LEDs as PWM level
//  // read the input pin:
//  int buttonState = digitalRead(MIC_PIN);
//  // print out the state of the button:
//  Serial.println(buttonState);
//  delay(1);        // delay in between reads for stability 
//  }
//  }
  }

Homework – Innovative Switch Final

Create a blog post for your final switch prototype including description, final photos and process photos to the course blog by 8pm this Wednesday.

The final Arduino prototype does not need to: fit inside your model, be soldered or be miniaturised.

The critique this Thursday will focus on the interaction between you and your switch. So focus your efforts on refining this!

 

 

Nuzzle – Karen Vellensky

 

 

 

 

 

<p><a href=”https://vimeo.com/144718415″>Cutie hats – Proof of Concept</a> from <a href=”https://vimeo.com/user12975396″>karen vee</a> on <a href=”https://vimeo.com”>Vimeo</a&gt;.</p>

For my innovative switch project I knitted a pair of hats with conductive yarn. When the patches of conductive yarn in both hats touch, the arduino board sends a signal to the led to light up in a pattern of random colors. The blinking led signifies the wearers excitement about being nuzzled by their companion in the second hat.

I was pleasantly surprised by how well the yarn worked despite how thin it is compared to the yarn weight I used. Were I to do the project from the beginning, I would have knitted both patches of the conductive yarn into the brim. As it is now, one patch of conductive yarn is in the brim while the second is on the crown of the head. This make contact between the four patches a bit unreliable. I’d also like to see how it looks with 2 – 4 more leds.

I really enjoyed making this project, a big thank you to Jenna for helping me figure out the coding and circuit! (code source: http://ardx.org/src/circ/CIRC12-code-SPAR.txt)

 

DSC_1488IMG_0091 IMG_0092 IMG_0113 IMG_0123 IMG_0127

Ground-Breaking Holiday Tea Light

Starting November 1st, it is officially reasonable to start talking about Christmas! For my innovative switch project I decided to make a self-lighting holiday ornament. I really “broke ground” with this one. When hung on a conductive surface, the ornament lights up.

Here is how I started:

IMG_2003

IMG_2004

IMG_2005

IMG_2006

And here is how it turned out:

IMG_2013

But then…

I decided that wasn’t a good enough story. So, late last night I had an idea. Why not turn this into a REAL holiday ornament?!? I’ve always loved Charlie Brown’s Christmas Story, and I’ve always wanted a Charlie Brown tree of my own.

After a quick trip to Michael’s, I started fabricating…

IMG_2021

IMG_2025

IMG_2026

IMG_2027

IMG_2028

IMG_2030

IMG_2031

IMG_2032

And then, it was all done 🙂

IMG_2035

And the dancing continues (an innovative switch project)

For my innovative switch project, I wanted to continue with my illuminated dancewear theme. I decided to utilize the existing conductive surfaces on the bottom of tap shoes for my switch.

http://www.youtube.com/watch?v=hLVWu2LjkYk

This concept uses each of the plates (front and back on each shoe) to close a switch with a conductive ground surface. It reads each of those switches separately, and uses the 16 possible combinations to control the LED color/effect.

Construction was relatively straightforward. I unscrewed the metal plates on the shoes and pinched a wire underneath them to form one side of the switches. I then sewed a sheet of conductive fabric to put on the floor for the other side of the switch. I used Adafruit NeoPixels RGB 60/m LED strip cut down to size for my illuminated shoe straps.

20151029_203154 20151104_151202 20151104_145310 20151104_112311

My code is also straightforward, but long and somewhat inefficient. It reads whether each switch (for each metal plates) is open or closed, then based on what the combination is, assigns a color value.

[code]
#include &lt;EEPROM.h&gt;

//variables
int inputPinRF = 2;
int inputPinRB = 3;
int inputPinLF = 4;
int inputPinLB = 5;
int valRF = 0;
int valRB = 0;
int valLF = 0;
int valLB = 0;
int r = 0;
int g = 0;
int b = 0;
int pause = 20;

//setup NeoPixel
#include &lt;Adafruit_NeoPixel.h&gt;
#ifdef __AVR__
#include &lt;avr/power.h&gt;
#endif

#define PIN 6
#define NUMPIXELS 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
pinMode(inputPinRF, INPUT);
pinMode(inputPinRB, INPUT);
pinMode(inputPinLF, INPUT);
pinMode(inputPinLB, INPUT);
pixels.begin(); // This initializes the NeoPixel library.
strip.begin();
strip.show(); // Initialize all pixels to ‘off’
}

void loop(){
valRF = digitalRead(inputPinRF);
valRB = digitalRead(inputPinRB);
valLF = digitalRead(inputPinLF);
valLB = digitalRead(inputPinLB);

//solid colors
if ((valRF==1) &amp;&amp; (valRB==0) &amp;&amp; (valLF==0) &amp;&amp; (valLB==0)){ //Front Right Tap Only – Red
setColor(strip.Color(255,0,0), pause);

} else if ((valRF==1) &amp;&amp; (valRB==1) &amp;&amp; (valLF==0) &amp;&amp; (valLB==0)){ //Right Foot Only – Pink
setColor(strip.Color(85,5,5), pause);

} else if ((valRF==0) &amp;&amp; (valRB==1) &amp;&amp; (valLF==0) &amp;&amp; (valLB==0)){ //Right Heel Only – Blue
setColor(strip.Color(0, 0, 255), pause);

} else if ((valRF==0) &amp;&amp; (valRB==1) &amp;&amp; (valLF==1) &amp;&amp; (valLB==1)){ //Left Foot and Right Heel – Green
setColor(strip.Color(0,255,0), pause);

} else if ((valRF==0) &amp;&amp; (valRB==0) &amp;&amp; (valLF==1) &amp;&amp; (valLB==0)){ //Front Left Tap Only – Aqua
setColor(strip.Color(0,255,255), pause);

} else if ((valRF==0) &amp;&amp; (valRB==0) &amp;&amp; (valLF==1) &amp;&amp; (valLB==1)){ //Left Foot Only – Yellow
setColor(strip.Color(255,255,0), pause);

} else if ((valRF==0) &amp;&amp; (valRB==0) &amp;&amp; (valLF==0) &amp;&amp; (valLB==1)){ //Left Heel Only – Orange
setColor(strip.Color(85,5,0), pause);

} else if ((valRF==1) &amp;&amp; (valRB==1) &amp;&amp; (valLF==0) &amp;&amp; (valLB==1)){ //Right Foot and Left Heel – White
setColor(strip.Color(255,255,255), pause);

} else if ((valRF==0) &amp;&amp; (valRB==1) &amp;&amp; (valLF==0) &amp;&amp; (valLB==1)){ //Both Heels – Purple
setColor(strip.Color(37,0,75), pause);

} else if ((valRF==1) &amp;&amp; (valRB==1) &amp;&amp; (valLF==1) &amp;&amp; (valLB==0)){ //Right Foot and Front Right Tap – Lime Green
setColor(strip.Color(124, 252, 0), pause);

} else if ((valRF==1) &amp;&amp; (valRB==0) &amp;&amp; (valLF==1) &amp;&amp; (valLB==1)){ //Left Foot and Right Toe – Coral
setColor(strip.Color(255, 127, 80), pause);
}

//Chases

else if ((valRF==0) &amp;&amp; (valRB==0) &amp;&amp; (valLF==0) &amp;&amp; (valLB==0)){ //Both Feet – Strobe Blue
theaterChase(strip.Color(0, 0, 255), pause);
}

//Duplex
else if ((valRF==0) &amp;&amp; (valRB==1) &amp;&amp; (valLF==1) &amp;&amp; (valLB==0)){ //Front Left Tap and Back Right Tap – Duplex Yellow and Green
setColorHalf(strip.Color(255,255,0), strip.Color(0,255,0), pause);

} else if ((valRF==1) &amp;&amp; (valRB==0) &amp;&amp; (valLF==0) &amp;&amp; (valLB==1)){ //Right Toe and Left Heel – Duplex Red and Purple
setColorHalf(strip.Color(255,0,0), strip.Color(37,0,75), pause);
}
//Rainbow
else if ((valRF==1) &amp;&amp; (valRB==0) &amp;&amp; (valLF==1) &amp;&amp; (valLB==0)){ //Both Toes – Rainbow
rainbow(1);
}

//No Contact
else{ //No Contact
setColor(strip.Color(0,0,0), pause);
}

}

void setColor(uint32_t c, uint8_t wait){
for(uint16_t i=0; i&lt;strip.numPixels(); i++) {
strip.setPixelColor(i, c);
}
strip.show();
delay(wait);
}

void setColorHalf(uint32_t c1, uint32_t c2, uint8_t wait){
for(uint16_t i=0; i&lt;4; i++) {
strip.setPixelColor(i, c1);
}
for(uint16_t j=5; j&lt;strip.numPixels(); j++){
strip.setPixelColor(j,c2);
}

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

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

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

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

delay(wait);

for (int i=0; i &lt; 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 &lt; 85) {
return strip.Color(255 – WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos &lt; 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 – WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 – WheelPos * 3, 0);
}

[/code]

What is most exciting for me about this project is the number of possibilities for future iterations. This round I chose to focus on changing colors for each foot position. However there are many potential variations, just from changing the code. These include color based on combinations or patterns of foot motion and educational tools that change color based on “correctness” of a step. Further, more work could be done to consolidate the wiring and electronics to eventually make this a wireless product.

20151104_195039