Regena's Final Project – The "Money" Button

The “Money!” Button is an Internet of Things device designed to make saving toward a goal as easy as pressing a button while creating a sense of joy, excitement, and badassness. Saving can be difficult and often requires a significant amount of self-discipline. The “Money!” Button’s goal is to flip the way people think about saving while developing confidence and empowerment in the process! When one would like to deposit a predetermined amount of money into the predetermined savings account on Qapital, all one needs to do is hit the “Money!” button. The reward for taking another step toward the saving goal is Cardi B’s voice chanting “money” from her hit song, “Money”. Upon hearing this, the saver will feel a sense of pride and confidence, knowing that they are one deposit closer to being as rich and fabulous as Cardi.

The “Money” Button is completely 3D printed and contains an Internet of Things circuit, complete with a Soundboard and speakers. The button top is a rounded egg form that ergonomically fits right in the palm of the hand, which, when coupled with the firm spring action, makes it a satisfying button to press. This button prototype is a minimalist grey, which contrasts with the technicolor image of the celebrity whose voice chimes out of it. This contrast is intentional, as it reflects the nature of saving: boring at first glance, but quite extraordinary once you get the hang of it! Further iterations of the “Money” button may feature more eye-catching exterior aesthetics, a variety of sound effects, and the option to be mounted on a refrigerator with magnetic feet.

Photos

Video

Instructable

https://www.instructables.com/id/DIY-Money-Button

Regena’s Final Project Update 2

Instructable

Link to draft Instructable is here.

Tutorial Content

Link to tutorial content and description to date is here.

Draft Story Concept

Johnny wants to save up for a trip to the Galapagos Islands but is having a hard time maintaining motivation. He is already halfway to the amount that he needs ($3,000 in total) and needs a bit of help keeping up the great work.

Johnny’s best friend, Emma, sees the “Money!” Button and decides to gift this to her friend in support of his trip to the Galapagos Islands.

Emma helps Johnny set up a Qapital account to get the button up and running.

Now, when Johnny gets notified that his paycheck has been directly deposited into his bank account, he hits the “Money!” button to contribute to the saving fund for the Galapagos Islands.

Johnny and Emma both feel empowered and motivated after hitting the “Money!” Button!

Regena’s Final Project Update – Money Button

Function

The Money Button is a device designed to create a sense of joy, excitement, and bad-assness for those who are saving up toward a goal. When one would like to deposit a predetermined amount of money into the predetermined savings account, all one needs to do is press the Money button. The reward for saving up toward the goal is Cardi B’s voice chanting “money” from her hit song, “Money”. Upon hearing this, the saver should feel proud of themselves for taking another step toward their goal of being as rich and badass as Cardi.

Parts – Circuit

  • Speaker
  • Adafruit Audio FX Soundboard w/amp
  • Battery pack w/ switch
  • 3AA batteries
  • Button
  • Single stranded wire
  • IFTTT applets

Parts – Shell

  • Plastic – considering 3D printing the shell
  • 3D Printer
  • Rubber feet
  • Screws and hot glue – to hold things together as needed
  • Last Resort: use the shell of an existing Easy Button
  • Bonus Track: add NeoPixel strip to make the button light up when pressed

Circuit Diagram

Princess Anastasia Halloween Costume

My Princess Anastasia costume is inspired by Disney’s 1997 rendition of the tale of the lost Princess Anastasia of the Romanov Dynasty. During this film, there is a scene where the Princess and her companions are trying to arrange for the Princess to meet with the Dowager Queen to reveal the true identity of the missing Princess. This scene is the climax of the movie, as it sets into motion the falling action of the tale, which results in the Princess and the Dowager Queen being reunited after being separated for so many years.

This movie is one of my favorite childhood memories, and so I have decided to attempt to live out one of my childhood dreams by being Princess Anastasia (from this scene) complete with a LED and crystal tiara, white opera gloves, and a scepter (which the Princess is never actually pictured with, but I could not resist!).

Making the LED tiara, I learned that soldering small sequin LEDs into a tiara is much more difficult than it seems. Though my circuit is very straight forward, the small space in which I needed to solder all of the wires accurately, to not create a short circuit, was quite the challenge. I learned how to test for short circuits using a micrometer and got tons of practice soldering, which I found quite relaxing, and rewarding once the short circuits were rectified. Next time I make a LED tiara, I will choose to make a bigger one for the sake of soldering circuits!

Final Photo

Inspiration Photos/Links

Image result for anastasia 1997 dress"
Image result for anastasia 1997 dress"
Image result for anastasia 1997 tiara"

https://www.imdb.com/title/tt0118617/

Materials and Tools

Materials used for the LED Tiara include: solid wire, Neopixel individual LEDs, solder, soldering iron, hot glue, Arduino Gemma, Lithium Ion battery (5V), hair pins, and black girl magic.

In-Progress Photos

Soldered to Arduino Gemma and lithium ion battery instead of the featured coin cell battery.

Code

#include <Adafruit_NeoPixel.h> 

#define LED_PIN 1
 
#define LED_COUNT 4
 
#define BRIGHTNESS 50
 
Adafruit_NeoPixel strip(LED_COUNT, LED_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)

void setup() {
  
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}



void loop() {
  // Fill along the length of the strip in various colors...
  colorWipe(strip.Color(255,   0,   0), 50); // Red
  colorWipe(strip.Color(  0, 255,   0), 50); // Green
  colorWipe(strip.Color(  0,   0, 255), 50); // Blue

  // Do a theater marquee effect in various colors...
  theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
  theaterChase(strip.Color(127,   0,   0), 50); // Red, half brightness
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue, half brightness

  rainbow(10);             // Flowing rainbow cycle along the whole strip
  theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}




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 5 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 5*65536. Adding 256 to firstPixelHue each time
  // means we'll make 5*65536/256 = 1280 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 5*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
    }
  }
}

Grand Duchess Anastasia Nikolaevna

For my Halloween costume I will be Grand Duchess Anastasia Nikolaevna (Princess Anastasia) of Russia. I am working between two concepts, a LED tiara and an LED scepter. The scepter will most likely be powered by a motion sensor to be activated when I wave it. The crown and scepter will be complimented with a ball gown and ball gloves, to represent the duchess in all her regal glory.

Both the crown and scepter are already made and in my possession, so I will have to wire either one of them with a simple circuit with a motion sensor attached using the Arduino Gemma and an external battery.

Regena’s Arduino Homework 3

Video

Customized Code

#include <Adafruit_NeoPixel.h>

#define PIN 6

#define NUM_LEDS 4

#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'
}

// my first NeoPixel animation
void loop() {
  // Modified procedures showing how to display to the pixels:
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue

  pulseWhite(10); 

  rainbowFade2White(5,7,7);

}


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

Onigiri Mausu Plush Night Light

THE STORY

Have you ever been fast asleep, deep in REM cycle 3, and had to wake up to go to the bathroom?

I personally do not have this problem, but my younger sister does. Unfortunately for her, the hallways in our parents’ house leading to the bathroom are dark and super scary at 3am in the morning. It’s an old structure with colonial architecture, just the type of space you might find in a horror movie featured on Friday the 13th.

It is with this intrepid, early-morning bathroom goer in mind that I have designed the Onigiri Mausu (Onigiri for short). Our little Onigiri is made of a soft plush fabric and is perfect for cuddles. He is shaped like a cute little onigiri rice ball, one of my younger sister’s favorite snacks. His cute pink ears light up to illuminate the way to the bathroom and is perfect for navigating spooky hallways! With the soft blue and green glow of his transparent pink ears, along with his soft cream body, Onigiri is sure to be the best companion for those late night or early morning trips to the potty.

THE PROCESS

Evolution of Onigiri patterns
Onigiri and his ancestors

Onigiri, in his current form, is the seventh generation of his people. His ancestors were smaller and made of rough scrap felt and linen, with lopsided hand-sewn ears and bodies. Over the generations, Onigiri has been refined by his creator, who selected only his best features. As his pattern was expanded, he was able to grow almost 3 times in size. The roundness of his forefathers was sculpted into his current triangular form. Probably, the only thing that is the same about him is his ears, which remain as delicately puckered as those of the progenitor of his people, albeit updated with professional machine stitching. Five patterns and seven prototypes later, Onigiri Mausu has emerged as the most sophisticated being of his kind.

THE CIRCUIT

Though Onigiri is the most advanced version of his species to date, it is important to note that he is still wired the same way as his progenitor. Nevertheless, Onigiri remains the best yet!

Regena’s Arduino Homework 2

Link to Instagram videos still not syncing. Please view videos here: https://www.instagram.com/p/B3EoIoclVT1V_M2jTngwEQOepNMtohgDr0L-HI0/

//Code for two buttons controlling the LED. Pushing either of the two buttons will turn the LED on.

const int onbuttonPin = 2;    // the number of the pushbutton pin that turns LED on
const int offbuttonPin = 4;   // the number of the pushbutton pin that turns LED off
const int ledPin = 13;        // the number of the LED pin

// variables will change:
int buttonState1 = 0;         // variable for reading the on pushbutton status
int buttonState2 = 0;         // variable for reading the off pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the on pushbutton pin as an input:
  pinMode(onbuttonPin, INPUT);
  // initialize the off pushbutton pin as an input:
  pinMode(offbuttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState1 = digitalRead(onbuttonPin);
  buttonState2 = digitalRead(offbuttonPin);
  
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState1 == LOW) {
    // turn LED on
    digitalWrite(ledPin, HIGH);
  } else if (buttonState2 == LOW){
      digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}
Continue reading “Regena’s Arduino Homework 2”