This is the problematic dishwasher I have. It's a Maytag (so much for never needed a repairman...). The control panel on the front of it died, it failed from corrosion getting into the laminated plastic PCB that it's made up of. Not really repairable, just meant to be replaced, except that it's a $150 part. From what I could find online, it seems to be a common failure, so why buy an overpriced part that's just going to fail all over again?
This is one of the things I love about the Arduino, it allows me to consider alternatives that I'd have NEVER been able to consider before. If I had to program a controller in assembly, or flat do it with just discrete chips, I'd have never considered this as an option. But with the Arduino, not only can I build my own controller, but it's almost stupidly simple to do.
The picture above is from the original control circuitry in the dishwasher. This part still worked, but without the control panel working, there was really no reasonable way to activate it. As you can see, it was very well labeled, the only thing I had to figure out was that some of the circuits were neuteral switched, and some were hot switched.
In my initial tests, I wanted to get an idea of how long to run each circuit to get the desired result. I found that 1 minute, 45 seconds was just the right amount of time to fill the dishwasher with water, with the lackluster water pressure I have. It seems to take about the same amount of time to fully drain. I have to run the soap dispenser for 30 seconds to get it to actually pop open.
Somewhere along the way I realized the dishwasher had a built in temperature sensor. It's a 10k NTC thermistor. I found a couple great thermistor reading examples on the Arduino Playground, and chose a short and sweet one. I loaded a very simple sketch onto my Uno and had it feed the temperature out the serial, once per second.
Doing more testing with the temperature sensor wired up, I found that the water comes out of my tap at about 125f. Often much less, because it takes forever for the hot water to get from the water heater to the dishwasher, so it fills with cold water and starts the cycle at less than 100f. Doing some googling, I found that you shouldn't release the soap from the dispenser until the water hits 120f, it does it's best cleaning over 140f, and hitting 155f is considered sanitary (sanitizes the dishes).
I found that it takes a long long time to get from 100f to 155f, about an hour of run time with the heater on during the wash. I tried just leaving the heater on without the wash going, but it didn't seem to work (I don't think the heating element is even under water normally). An hour of wash time seemed fine to me, so I decided to program it to just monitor water temperature rather than do any actual timing. When the water hits 155, the cycle is done. (I had the thing up to 167f a couple times, when I was doing my jumper testing and forgot about the thing.. hahaha)
The last thing I determined with my testing is that I need a pre-rinse. I can't just wash, rinse, and be done, it left bits of food debris on the dishes. So it does a quick pre-rinse to flush the debris out of the dishwasher before the actual rinse cycle. I don't run the heater on the pre-rinse.Between the dishes being really hot, and 10 minutes of running the heater doing almost nothing, it seemed like a waste of energy. I do run the heater on the final rinse, but I only bring it up to 140f, so the rinse cycle is much shorter.
This is the relay bank I came up with to control the 6 circuits in the dishwasher. Bolted them to a bit of wood to keep them from flopping around and looking any worse than they already do.
This is my current prototype/rough draft setup that I'm running the dishwasher with. I used some CAT5 ethernet cable to run down from the low voltage circuitry to the relays that control the high voltage circuitry. I used 2n2222 transistors and 1N4001 diodes to control the relays. I'm not running it off my Arduino Uno, I keep that for my day to day use, it's running off a chinese Dueliminova for now. I'll probably move to a standalone chip when I get the setup all finalized. I'm using a 20x4 LCD screen to monitor the status of the unit. It displays the date and time when the dishwasher is idle.
This is the highlights from a complete run cycle, I cut the video down to be about as short as possible. 2 and a half hour cycle cut down to 6 and a half minutes.
Update - June 6th, 2011
I've now completed the install of the Arduino into the control head of the dishwasher. In the picture above, you can see the dishwasher's original control panel, and the new panel that I had made.
You're probably wondering how we made the new panel, and what it's made out of. First we took the old panel and put it on a scanner, we scanned the image into the computer, and loaded that image up in AutoCad. We then recreated the angles as closely as we could in AutoCad. We also measured the two buttons I bought (SparkFun LED buttons) and the LCD screen, and placed their cutouts inside the new shape. We then transfered that AutoCad drawing to CorelDraw, and scaled the image to get the size just right, and finally sent it out to the laser.
The new panel is made out of 1/8" thick Lexan, which was cut out with a 50watt CO2 laser. After we had the oval shape cutout (with the button and LCD openings cut out at the same time) we painted the back of it white with basic spray paint. We then jumped through all kinds of hoops to come up with the Arduino and OpenHardware logos, and added them to our design in CorelDraw. We also added the text for the buttons. We toyed with the idea of putting "Maytagged" at the top, but decided it was goofy and immature. ;)
Anyways, after we had the logos and the text drawn out on the computer, we sent those to the laser and set it to just etch off the white spray paint that we had just put on. Then we hit the now clear lexan with black paint on the back side. Giving us black letters and logos, through a glass like panel.
Next up, I placed the panel on the dishwasher, and traced the openings with a pencil before cutting them out with my dremel. I didn't really get any pictures of the cutout process. It's hard to make a pretty cut with a dremel, so I wasn't feeling particularly photogenic after making those cuts.
This is actually the only picture I took of the cuts of the glue. So I'll just go into what I did here. After making the pencil outline, I did my best to make the cuts with the dremel. Then I placed the new panel back into place and taped it on with some basic packing tape (what I had handy at the time). Then from the inside of the door, I inserted the buttons, and the screen into the newly cut holes. Once I felt they were square and installed in the right location, I used some hot glue to tack them into place. I didn't feel hot glue would be reliable in the long term, especially with the temperatures this dishwasher runs at, so I only used it to keep things held still while the real glue I wanted to use had a chance to cure. What was this "real glue" I used? I chose "Plumbers Goop", it's good stuff, cures to a hard rubber, it's water proof, doesn't harm plastics or circuitry, and it holds really really well. I used to use the stuff a lot when I was watercooling computers.
This is what it looked like from the back side after all the glue. You can just see the tilt sensor below the button on the door here, it's inside some black heatsink tube. That will be used to monitor when the clean dishes have been put away.
I decided to just use a whole Arduino in this permanent installation, it's a clone from China, which cost me about $10. At that price, I'm fine with leaving it inside the machine. I sprayed the board with clear spraypaint to waterproof it, both sides. I hotglued it to the door of the dishwasher. Same deal with the relay control board, it's hotglued to the door of the dishwasher. The metal of that door never gets hot enough to even soften hot glue, so I think it'll be fine.
On the left here, I have the contrast adjust pot, and on the right is the reset button. I drilled fairly small holes up the bottom of the control head to create the access to these. It turned out really nicely in the end.
And here's the final picture with it all up and running. You can just see the reset button peaking out below the panel. You might also be able to tell that I managed to drop the lexan control panel at one point and it broke in half. If you can't tell, I'm not going to point it out. It was a shame, but I'm not going to go through all the work of making the panel again.
There's still more on the to-do list. I've got basic functionality right now. I haven't even programmed in the cancel/drain button functionality. I'd like to add things like scheduled start, using the RTC to make it start at a specific time. Add a menu system so I can select a specific cycle to run (press both buttons to pull up the menu, left navigates up, right navigates down, both to select the option, and a timeout to leave the menu). The tilt sensor inside the door has no support code written yet, so it doesn't clearsthe "Dishes are clean" indicator on the screen yet. That will monitor the door opening when the dishwasher is idle, if it's open long enough to empty it, clear that line, but if it's only open long enough to get get something out and then closes again, the dishes are probably still clean. But for now, I'm happy that my prototype design is buttoned up, and I'm very happy that my concept for the control panel has panned out. I bet some people wouldn't even know it wasn't how this thing originally looked.
Below is the "sketch" (program/firmware) I'm running on the Arduino currently.