Introduction: The Idiot Proof Dishwasher

A crack team of Carnegie-Mellon students attempt to stop college roommates from improperly loading a dishwasher which results in cruddy dishes, a waste of energy, and often some hard feelings :(

What was our solution? Follow the steps below to see. Keep in mind, what's shown is a prototype that doesn't address certain concerns such as, oh, water in an electrical circuit :0 So we don't recommend installing this exact setup in your own dishwasher, unless you do a little re-design.



Team: Ana Alves, Torrey Brenner, Zack Jacobson-Weaver & Gabriela Marcu from Eric Paulos' Activating Objects and developed in part at CodeLab.

Step 1: Step 1: Get the Stuff

Here's what you'll need:

Tools: SHARP KNIFE (X-acto);  STRAIGHT EDGE;  RULER;  CUTTING BOARD;  HOT GLUE/GUN;  DRILL w/  DRILL BIT INDEX,  SOLDERING TOOLS/SOLDER;   PC or MAC w/ ARDUINO SOFTWARE ;  ARDUINO BOARD (PIC) (if you get a good kit, you'll have just about everything you need for the electronic stuff)...

Materials:  FOAM CORE (otherwise something that would bio-degrade a little faster than 10,000 years); THIN DOWEL RODS;  LED'S (in the kit);  PIEZO SPEAKER (in the kit);  ELECTRICAL WIRE (<= 22ga.);  TACTILE SWITCH (pictured: not in kit);  JUMPER WIRES (yup, kit);  SOLDERLESS BREADBOARD (kit);  PHOTO RESISTOR (kiz-nit);  RESISTORS (kiiiittt);  HATRED OF DIRTY DISHES (innate);




Step 2: Honor the CODE

Here's the code and a pseudo-schematic for the Arduino.  If you don't know what this stuff means, there are alot of self-starter web sights for Arduino.  I recommend Arduino.cc and Lady Ada.  Don't let all this technical garble stop you from playing with it.

CODE: (copy and paste this into your Arduino sketch.  It's not cheating)

/*This code will use a 'tunable' light sensor (photo-resistor) to do two things
when the light level is BELOW a certain threshold: Turn on some flashing LEDs,
and sound an alarm!!!

This code was compiled using source code from http://www.arduino.cc/en/Tutorial/Melody
(2005) D. Cuartielles for K3, and http://ardx.org/CODE09.

The COPY and PASTE functions were written sometime long ago by a really
lazy person...who I personally love.*/

//PhotoResistor Pin
int lightPin = 0;
//LED Pin
int ledPin = 9;
int ledPin2 =11;
int ledPin3 =13;
//Soundpin
int soundPin= 3;
//number of notes
int length = 7;
char notes[]= "cacacaa";
int beats[] = {1,1,1,1,1,1,1};
int tempo = 300;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(soundPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(soundPin, LOW);
    delayMicroseconds(tone);
  }
}

void playNote(char note, int duration) {
  char names[] = { 'c', 'a' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014 };

  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}


void setup()
{
  pinMode(ledPin, OUTPUT);
 pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT); //sets the led pin to output
  pinMode(soundPin, OUTPUT);
}

void loop()
{
 int threshold=500;       /*<---- THIS IS THE KEY FEATURE ! ! ! */

    while (analogRead(lightPin)>threshold)

    {
    for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo/3); // rest
    } else {
      playNote(notes[i], beats[i] * tempo*1.3);
    // pause between notes
    delay(tempo/2); }

     if (analogRead(lightPin)>threshold)
 {
  digitalWrite(ledPin,HIGH);
  digitalWrite(ledPin2,HIGH);
  digitalWrite(ledPin3,HIGH);
  delay (20);
  digitalWrite(ledPin,LOW);
  digitalWrite(ledPin2,LOW);
  digitalWrite(ledPin3,LOW);
  delay(20);
  digitalWrite(ledPin,HIGH);
  digitalWrite(ledPin2,HIGH);
  digitalWrite(ledPin3,HIGH);
  delay (20);
  digitalWrite(ledPin,LOW);
  digitalWrite(ledPin2,LOW);
  digitalWrite(ledPin3,LOW);
  delay(20);
  digitalWrite(ledPin,HIGH);
  digitalWrite(ledPin2,HIGH);
  digitalWrite(ledPin3,HIGH);
  delay (20);
  digitalWrite(ledPin,LOW);
  digitalWrite(ledPin2,LOW);
  digitalWrite(ledPin3 ,LOW);
  delay(20);

 }else{

  digitalWrite(ledPin, LOW); 
 }
    } 
  }
}


:END CODE

The trick in this code is to use the "threshold" to tune the light sensor for the local conditions.  If you get everything else to work on your work bench, remember to anticipate adjusting the threshold in ANY other lighting condition.

Also, the second image show's a MESS of wires and the BREAD BOARD.  We used the BREAD BOARD because it's a quick way to build a circuit AND , because we could use the TACTILE SWITCH to turn on/off the signals from the ARDUINO when the dishwasher door was closed/open.  In other words, we didn't have to write some code for the switch to enter the system.  The switch just connected power from the ARDUINO to the BREAD BOARD when the door closed.  It'll make more sense in a minute.




Step 3: Rack 'Em

You need to build two things to idiot proof your dishwasher, according the teams' design.  The first was a modular rack which is designed to accommodate only a particular kind of dish, and only to fit in a place that dish belongs (That is to say:  get the best scrub).  

DISCLAIMER:  We're not going to illustrate how to measure and cut foam core or ,for the rack, the dowels that make up the bottom and the pins.  That's where your measuring, marking, and cutting tools come in along with a little HOT GLUE.  We're assuming if you're an "Instructables" viewer, you have that covered so we'll just say: make this, make that.

The key features of the rack design are:

Modularity:  there's a 'cups' rack, a 'bowls' rack, a 'pots' rack etc. that position particular wares in the optimal cleaning orientation and location.

ADA shout out:  Each rack has a 'key' on one corner indicating which it is.  The model, for instance, is for cups ONLY!  The key in the corner let's the sighted and blind alike know what rack they have, what goes in it, and where it goes in the washer.

Step 4: Raise the Alarm!

Time to assemble the electronic gizmos. 

First, take some measurements on the space you'll need to install things in.  It doesn't make sense to try to shove a 3inch box into a 2inch gap.  Second, take some measurements on the items you'll be using that already exist!  If you want to cover the leads from your LEDs or in this case, the resistor + LED, then there is a real measurement  you can make ahead of time, right?  Diameter of the LEDs, the PIEZO, distance for lead wires to travel etc. etc.

SOLDERING : Go ahead and solder RESISTORs to LEDs and lead wires to everything.  

FIRST IMAGE: Make a box  out of FOAM CORE for the PHOTO RESISTOR.  Run the two wires thru to the inside until the surface of the PHOTO RESISTOR is flush to the top.  (OH! The tape is just what we used to attach the box to the dishwasher. Don't worry.)

SECOND IMAGE: Make another box for the LEDs and the PIEZO.  This is where the DRILL and DRILL BITS come in.  The diameter of the parts was matched to a DRILL BIT and we just marked the center points of each part.  (Hint:  practice on some scrap to figure out how to get a clean cut.  And good luck with that by the way.)

THIRD IMAGE:  Insert each component into its respective place.  Run the lead wires out together and bundle them with tape to keep things neat.

FOURTH IMAGE:  The TACTILE SWITCH is placed just inside the door so when the door's closed, the switch is ON and provides power to the BREAD BOARD allowing ARDUINO to tell the other stuff "You can do your job now".

Step 5: Install and Calibrate

IMAGE ONE: Find a suitable postion for the alarm box.  Somewhere where its dual (audio/visual) functions will be sensed by the dish loader.  We found HOT GLUING it under the edge of the counter to be appropriate, vandalistic fun.

IMAGE TWO:  Install the PHOTO RESISTOR under the bottom rack in the washer where, if someone blocks too much light from above (IMAGE THREE) with a huge dish, the sensor will say, "Hey!  That also means you're blocking too much cleansing water from bellow!  How will those poor cups up top get the bath they deserve?! I'm sounding the ALARM!"

IMAGES FOUR & FIVE:  This is where the calibration thing comes in.  We had to tweak the 'int threshold' value several times before the sensor worked inside the washer.  The number can be quite different!  From the work bench to the dishwasher the value changed from 30 to 500!   And don't forget, the TACTILE SWITCH has to be depressed to run the program.

Note:  Ideally, the light in image three would turn ON via the TACTILE SWITCH and OFF when a properly loaded (a.k.a. no alarm) dishwasher began doing its thing.  For the demonstration, a camping headlamp was used because it was the only thing bright enough, and small enough to run the program well.  We hope you understand the concept in spite of our having to adjust on the fly.

Step 6: A Demo

Here's a peak at the thing in action.  Our goal was to find a way to address the needs of top-rack dishes who so often are marginalized in dish society.  And we think this concept works. it's reasonably realistic.  With a little detail work it could even become a real thing!!!


(TROUBLE VIEWING THE VIDEO?  CLICK HERE!)

Full disclosure: we (a.k.a. I) broke the PIEZO while installing the alarm box!  Don't expect that sound out of the code.  It is however, just as annoying.

Thank you from the TEAM, and please hack away to improve the system!