Project tutorial
Behavior Staining

Behavior Staining

A way to keep your clutter in its place.

  • 1,597 views
  • 0 comments
  • 4 respects

Components and supplies

3"x4"x.0625" Acrylic
×1
3"x4"x.125" Diffuse acrylic
×1
Force Sensor Resistor
×1
LED's
×12
Plywood box
×1
3"x4"x.0625" Foam
×1
A000066 iso both
Arduino UNO & Genuino UNO
×2
speaker
×1

About this project

Description

Behavior Staining is a household surface that attempts to solve the problem of unwanted and misplaced clutter by using LED's to indicate to the user that items have been left on the surface for a pre-determined time. The light stain that the surface will create will grow both in size and strength as time passes. 

At the height of the stain, another amount of time pre-configured by the user, the surface will begin to emit a less-than-pleasant sound in a final attempt to get the user to remove the clutter. At any time, the user may remove the clutter to reduce the size of the light stain

Post-Observational Brainstorm

Observational Documentation

Idea Refinement

Kitchen surface that will develop a stain under items left on its surface after 24 hours. The stain will grow and begin to seep across the table the longer the item is left on the surface. It is meant to be a way to help stay organized and take care of the piles of mail, etc. left on the kitchen table so that kitchen surfaces can be enjoyed as they were intended—which is to cook, dine, and commune with others.

Possible Scenarios

  • Dining tables-turned-desks.
  • Kitchen counters with dirty dishes left for too long.

Possible Interactions:

  • Shake to get rid of stain
  • Noise to motivate people to clean faster
  • more LEDs light up the more crap is left on there

Questions

  • What stops people from just moving your stuff to a new place right beside the mat or off the mat when it starts making noises
    • There’s a cutoff time, and after that, the time accrues for the stimulus. The come-down time for the noise is slower based on the longer that you leave it, so you know that if you leave something for a long time, you’ll have to listen to the noise for a long time.
    • Disabling function. If you leave it a certain amount of time, you aren’t allowed to use X, or your alarm clock goes off early—would require syncing with other appliances or devices :(.

  • Many individuals who might use Behavior Staining will be busy and therefore will not be home to notice the stain or be annoyed by the sound. This has the potential to annoy roommates. How do we account for personal responsibility? Do we want to?

Initial Concept

Prototype in Situ

Demo of how our prototype would be used in situ.

Design Process Documentation

Laser Cut File

behavioral staining laser

Future Questions & Considerations

What is clean? 
  • Can a user just pick their clutter up and then put it right back down? How long does a surface have to be clear to be "clean"?
  • What prevents users from just moving their stuff to a new surface?

In practice, Behavior Staining would be a surface composed of many components or tiles so that areas of clutter are more precise. Additionally, because Behavior Staining is a modular surface, it could be applied to nearly any surface in which people live and work in order to encourage users to put things in their place and promote a general level of orderliness in a space .

Final Artifacts

Arduino Code For LEDs

CM_P1.ino
Arduino Code For LEDs

Warning: Embedding code files within the project story has been deprecated. To edit this file or add more files, go to the "Software" tab. To remove this file from the story, click on it to trigger the context menu, then click the trash can button (this won't delete it from the "Software" tab).

int ledPins[] = {7, 8, 4, 12, 2, 13}; // LED pins
int pulsePins[] = {3, 11, 5, 10, 6, 9}; //Pulse/Fading LED pins
int sensorPin = 0;  // select the input pin for the sensor
int val = 0; //store value coming from the sensor


void setup()
{
  //get on same serial communication with other arduino
  Serial.begin(115200);
  //turn all LEDs to OUTPUT mode
  int index;
  for(index = 0; index <= 5; index++)
  {
    pinMode(ledPins[index],OUTPUT);
    pinMode(pulsePins[index],OUTPUT);
  }

}

void loop() {
  //read in value from FSR
 val = analogRead(sensorPin);
 
// if pressure detected beyond 128 threshold, start staining
 if (val > 128) {
    //turn on middle row lights one at a time, 1.5 second delay between each.
    digitalWrite(ledPins[0], HIGH);
    delay(1500);
    digitalWrite(ledPins[1], HIGH);
    delay(1500);
    digitalWrite(ledPins[2], HIGH);
    delay(1500);
    digitalWrite(ledPins[3], HIGH);
    delay(1500);
    digitalWrite(ledPins[4], HIGH);
    delay(1500);
    digitalWrite(ledPins[5], HIGH);    
    
    delay(1000);
    //fade outer lights in
    for(int i =0; i < 256; i += 16) {
       analogWrite(pulsePins[0], i);
       delay(100);
       analogWrite(pulsePins[1], i);
       delay(100);
       analogWrite(pulsePins[2], i);
       delay(100);
       analogWrite(pulsePins[3], i);
       delay(100);
       analogWrite(pulsePins[4], i);
       delay(100);
       analogWrite(pulsePins[5], i);
       delay(50);
    }
    delay(50);
    //send signal to other arduino to start playing slimey sound
    Serial.println (1);
    delay(28000);
 } else {
   //turn off all lights if no pressure detected
    analogWrite(pulsePins[0], 0);
    analogWrite(pulsePins[1], 0);
    analogWrite(pulsePins[2], 0);
    analogWrite(pulsePins[3], 0);
    analogWrite(pulsePins[4], 0);
    analogWrite(pulsePins[5], 0);
    digitalWrite(ledPins[0], LOW);
    digitalWrite(ledPins[1], LOW);
    digitalWrite(ledPins[2], LOW);
    digitalWrite(ledPins[3], LOW);
    digitalWrite(ledPins[4], LOW);
    digitalWrite(ledPins[5], LOW);
    
 }
}

Arduino Code for Sound

audio_recev.ino
Arduino Code for Sound

Warning: Embedding code files within the project story has been deprecated. To edit this file or add more files, go to the "Software" tab. To remove this file from the story, click on it to trigger the context menu, then click the trash can button (this won't delete it from the "Software" tab).

//Code from Slides by Eric Paulos
#include <Wtv020sd16p.h>
int val;
int resetPin = 2;  // The pin number of the reset pin.
int clockPin = 3;  // The pin number of the clock pin.
int dataPin = 4;  // The pin number of the data pin.
int busyPin = 5;  // The pin number of the busy pin.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

void setup()
{
  //get on same serial communication with other arduino
  Serial.begin(115200);
  Serial.println("Serial Monitor Connected");
  wtv020sd16p.reset();
}

void loop()
{
  //check to see if communication exists
  int incoming = Serial.available();
  
  if (incoming > 0)
  {
    //play slime sound for 30 seconds
    wtv020sd16p.asyncPlayVoice(0);
    delay(30000);
  }
}
Warning: embedding parts within the project story has been deprecated. To edit, remove or add more parts, go to the "Hardware" tab. To remove this list from the story, click on it to trigger the context menu, then click the trash can button (this won't delete it from the "Hardware" tab).
3"x4"x.0625" Acrylic
3"x4"x.125" Diffuse acrylic
Force Sensor Resistor
LED's
Plywood box
3"x4"x.0625" Foam
A000066 iso both
Arduino UNO & Genuino UNO
speaker

Building Process Documented Through Photos

plywood box laser file

Assembly Instructions

STEP 1: Cutting Wires

In subsequent steps, LEDs will be wired between a Sparkfun RedBoard and a breadboard. In order to ensure that the LEDs will not be tethered directly the breadboard, first begin this project by cutting wires that will be used to extend the LEDs.  Cut 24 individual pieces of wire at approximately 9 inches long; you will need 24 pieces because each of the 12 LEDs you will be using require 2 pieces of wire (cut 12 pieces of wire in one color, and the other 12 pieces in a different color - this will be helpful in differentiating between positive and negative connections). 

STEP 2: Strip Wires

Once you have cut your 24 pieces of wire, strip away the insulation from the tips of both ends of each piece of wire.

STEP 3: Solder Wire to LEDs

Determine which color wire you will adhere to the positive LED pin and which color wire you will adhere to the negative LED pin (in our photos, the red wires are connected to positive pins, while the green wires are connected to negative pins). Once you have made this distinction, you may begin the process of soldering your wires to the LEDs. Use a set of “third hands”; place the wire in one clamp and the LED in the other. Bend the exposed part of the wire (the part of the wire you stripped the insulation off of) and hook it over the LED pin. Use a soldering iron to adhere the wire to the LED. Repeat for each pin of every LED.

STEP 4: Laser Cutting

Use the provided laser cut file in order to cut the plywood and acrylic necessary to assemble the tile. Cut two pieces of 1/16" foam out with a utility knife.

STEP 5: Assembling the “Tile” 

Once you have performed the laser cutting outlined in the previous step, assemble the plywood into a box; the box should have holes cut into it in a 3 by 4 pattern. You can paint the box white to enhance the LEDs. Take your LEDs, and thread the through the holes in the box so that the LED’s head rests on top of the plywood. Take care not to allow LED pins to touch one another, otherwise your circuit will not perform as wanted in later steps; if the process of threading the LEDs through the holes caused the pins to touch, simply pull the pins apart as gently as possible. after your LEDs are threaded through the box you may hot glue them in place. Then, adhere the 1/16" clear acrylic rectangle to the top of the box, then glue the two foam rectangles on top of the clear acrylic at the corners. After the foam rectangle are attached, adhere the 1/8" diffuse acrylic rectangle on top of the foam.

STEP 6: Assemble Circuit

Follow the instructions for project #4 outlined in the Sparkfun SIK GUIDE. You'll want to expand that circuit so that it will include an additional 4 LEDs (for a total of 12 LEDs). Next, connect a FSR to your circuit as depicted by the circuit diagram found in the “Final Artifacts section.” This FSR acts as a signal that tells the LEDs to begin their "staining" sequence. The sensor is then placed between the clear acrylic and the foam.

STEP 7: Soldering SD Card

In order to attach your SD card to a breadboard, you must first solder pins to the SD card. Cut the header to match the number of pins you’ll need (in our case, we needed 7 pins, so we cut the header accordingly); you will need two sets of pins with the appropriate number of pins for your SD card. Once the headers have been cut, place the pins into a breadboard and place the SD card on top. Now, you may begin soldering the pins to the SD card. 

STEP 8: Wire Speaker

Wire the speaker and SD card as they appear in the diagram found in the “Final Artifacts” section (this is also the circuit used in Slide 11: http://make.berkeley.edu/wp-content/uploads/2014/02/Critical-Making-Audio-How-To.pdf). Your LED circuit should be plugged into your computer. The speaker circuit now needs to connect to the LED circuit so that they can communicate and signal each other. To do this, connect a wire from pin 1 of the LED circuit to pin 0 of the speaker circuit. You'll also need to have a wire connecting their ground pins, as well as a wire from the speaker's 5v pin that connects to the LED circuit's breadboard. This allows for the speaker circuit to get power from the LED circuit.

STEP 9: Amplify Speaker

Amplify the speaker’s sound by cutting a hole in the bottom of a paper cup, closing the mouth of the cup with a piece of acrylic and tape, and place the speaker in the opening you created at the bottom of the cup. 

Step 10: Enjoy!

Place an object on the tile. Congratulations, you now have a behavioral staining tile!

Code

CM_P1.inoC/C++
CM_P1.ino
int ledPins[] = {7, 8, 4, 12, 2, 13}; // LED pins
int pulsePins[] = {3, 11, 5, 10, 6, 9}; //Pulse/Fading LED pins
int sensorPin = 0;  // select the input pin for the sensor
int val = 0; //store value coming from the sensor


void setup()
{
  //get on same serial communication with other arduino
  Serial.begin(115200);
  //turn all LEDs to OUTPUT mode
  int index;
  for(index = 0; index <= 5; index++)
  {
    pinMode(ledPins[index],OUTPUT);
    pinMode(pulsePins[index],OUTPUT);
  }

}

void loop() {
  //read in value from FSR
 val = analogRead(sensorPin);
 
// if pressure detected beyond 128 threshold, start staining
 if (val > 128) {
    //turn on middle row lights one at a time, 1.5 second delay between each.
    digitalWrite(ledPins[0], HIGH);
    delay(1500);
    digitalWrite(ledPins[1], HIGH);
    delay(1500);
    digitalWrite(ledPins[2], HIGH);
    delay(1500);
    digitalWrite(ledPins[3], HIGH);
    delay(1500);
    digitalWrite(ledPins[4], HIGH);
    delay(1500);
    digitalWrite(ledPins[5], HIGH);    
    
    delay(1000);
    //fade outer lights in
    for(int i =0; i < 256; i += 16) {
       analogWrite(pulsePins[0], i);
       delay(100);
       analogWrite(pulsePins[1], i);
       delay(100);
       analogWrite(pulsePins[2], i);
       delay(100);
       analogWrite(pulsePins[3], i);
       delay(100);
       analogWrite(pulsePins[4], i);
       delay(100);
       analogWrite(pulsePins[5], i);
       delay(50);
    }
    delay(50);
    //send signal to other arduino to start playing slimey sound
    Serial.println (1);
    delay(28000);
 } else {
   //turn off all lights if no pressure detected
    analogWrite(pulsePins[0], 0);
    analogWrite(pulsePins[1], 0);
    analogWrite(pulsePins[2], 0);
    analogWrite(pulsePins[3], 0);
    analogWrite(pulsePins[4], 0);
    analogWrite(pulsePins[5], 0);
    digitalWrite(ledPins[0], LOW);
    digitalWrite(ledPins[1], LOW);
    digitalWrite(ledPins[2], LOW);
    digitalWrite(ledPins[3], LOW);
    digitalWrite(ledPins[4], LOW);
    digitalWrite(ledPins[5], LOW);
    
 }
}
audio_recev.inoC/C++
audio_recev.ino
//Code from Slides by Eric Paulos
#include <Wtv020sd16p.h>
int val;
int resetPin = 2;  // The pin number of the reset pin.
int clockPin = 3;  // The pin number of the clock pin.
int dataPin = 4;  // The pin number of the data pin.
int busyPin = 5;  // The pin number of the busy pin.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

void setup()
{
  //get on same serial communication with other arduino
  Serial.begin(115200);
  Serial.println("Serial Monitor Connected");
  wtv020sd16p.reset();
}

void loop()
{
  //check to see if communication exists
  int incoming = Serial.available();
  
  if (incoming > 0)
  {
    //play slime sound for 30 seconds
    wtv020sd16p.asyncPlayVoice(0);
    delay(30000);
  }
}

Comments

Similar projects you might like

Windows IOT - Automate your power outlets

Project tutorial by Syed Sanoor

  • 22,140 views
  • 13 comments
  • 48 respects

Two Mode Robot Controlling through Android and Windowsphone8

Project tutorial by Anas Siddiqui

  • 16,314 views
  • 9 comments
  • 48 respects

Personal Home Assistant

Project tutorial by 3 developers

  • 4,006 views
  • 0 comments
  • 26 respects

Gesture Drive: Accelerate with Freedom

Project tutorial by Shahariar

  • 2,834 views
  • 0 comments
  • 12 respects

Windows Remote Arduino

Project tutorial by Team Windows IoT

  • 166,289 views
  • 167 comments
  • 339 respects

Simple Arduino Uno - ESP 8266 Integration

Project tutorial by circuito.io team

  • 93,214 views
  • 23 comments
  • 75 respects
Add projectSign up / Login