Introduction: Building a Dishwasher From Scratch
Admittedly, this probably wasn't the best first-time project. At the time I started it, I couldn't find anyone else who had attempted it. So it was kinda a crazy idea. And my family lets me try crazy stuff, p̶r̶o̶b̶a̶b̶l̶y̶ ̶b̶e̶c̶a̶u̶s̶e̶ ̶i̶t̶'̶s̶ ̶f̶u̶n̶ ̶t̶o̶ ̶w̶a̶t̶c̶h̶ ̶p̶e̶o̶p̶l̶e̶ ̶f̶a̶i̶l̶.
Why a dishwasher?
Without a lot of space in the kitchen, and with a tendency to make a lot of dirty dishes at each meal, dishes often take an hour or more (this includes drying dishes that don't dry well in high humidity, wiping counters, moping the floor if the pipes are leaking, etc.). Figuring 3 hours per day × 365 days = 1,095 hours per year, or 45.6 days. If you don't count sleeping hours, that's like washing dishes 12 hours a day for three months straight! Horrors! So that's where all that time is going. Sure, a dishwasher won't save all that time, but maybe a little bit of it? That was my hope when I started this project.
Of course, building a dishwasher takes a long time, and the result won't be as good as what you can buy commercially. Therefore, if your goal is to save time, just buy a dishwasher. Going the DIY route won't give you the same results, and might not save you much, depending on where you live (I didn't look very hard, but those I saw here in China cost roughly ¥10,000, or $1,500, so I figure I'm saving money). On the other hand, if you feel adventurous and think you're up to the challenge, then this just might be the project for you.
Pioneering the field of modern DIY dishwashers was challenging, and I made a lot of mistakes, which I'll be pointing out along the way. I have suggestions for improvements, but it won't be a completely step-by-step "follow me" approach. If you're going to attempt this, be prepared to improvise and come up with solutions to the challenges you face. Commenting and asking for suggestions is also a good way to go.
And now, let's look at how this machine works and what it can do.
Step 1: How It Works
The main area consists of two racks, each of which has a water input and a drain. The water is sprayed onto the dishes from tiny holes in pipes, and then runs down the drain in each tub, to where it is pumped away. The control center is on the right, and controls the water using solenoids. On the front panel is the user interface.
The Arduino uses two thermistors to sense which solenoid controls hot water and which one is cold (This is just a cool bonus feature. That way you don't have to check which hose you connect to which inlet).* The pump runs when water is detected in the drain pipe (Right now I'm using a crude sensor that consists of two 10k resistors and two wires with their ends in the pipe). There's also a piezo to beep when the cycle is finished.
*Disclaimer: I haven't made any cycles that use only hot or only cold at one time, so the detection of the temperature isn't being put to work yet, though the code is detecting which is which and controlling the solenoids accordingly accordingly.
Step 2: A Bit of History
An early electric dishwasher. Image in public domain.
One of the first dishwashers ever invented consisted mainly of a tub of water which was repeatedly wacked by an object. It had two major flaws: it didn't get the dishes clean, and it broke the dishes. Subsequent attempts were mildly better, but none were very effective.
The first practical dishwasher, invented in 1887 by Josephine Cochrane, sprayed water down on top of a rotating tub of dishes, thus demonstrating that Mother really is the necessity of invention. In any case, the key difference between this model and the previous models was the use of water pressure.
The dishwasher I made likewise uses water pressure, but both the dishes and the sprayers are stationary. Despite my best attempts to find a suitable rotating sprayer, I was unsuccessful. This is, perhaps, the single biggest issue with my model, and I hope it can be improved upon in the future.
Step 3: Tools & Supplies
As previously stated, you're likely to get the best results by not copying me exactly. That said, I intend my work to be used as a starting point, so here's a complete list of the tools and parts I used. Most of the supplies are rather generic, so I'll only be providing links for some things.
NOTE: None of the linked products have been used by me, and I can not vouch for their quality. Research before buying.
- Basic woodworking
- Basic knowledge of Arduino or another controller board
- Basic knowledge of electricity
- Fusing polypropylene (PPR) piping
- Measuring tape and/or yardstick
- Soldering iron
- Caulk gun
- Electric drill
- Polypropylene (aka PPR) pipe welding iron (only needed if you use PPR)
- Pipe cutter (optional)
- Plywood (I used two 4ft × 8ft × 1/4in sheets, with a significant amount left over)
- Several 1×1's, or 2×4's cut to size (for screwing the plywood together at the corners)
- Small screws (about 100)
- 8 large screws
- Small nuts and bolts (exact quantity dependent on whether you attach wheels and your exact design, etc.)
You'll need to use polypropylene (PPR) piping, or other heat-tolerant piping (such as CPVC), because PVC can't handle hot water. What I used is 20mm in diameter (3/4in). I suggest buying a little extra so you have room for mistakes. Look for these at a hardware store; I couldn't find decent prices on Amazon.
- About 25 feet of pipe (a bit more than 8 meters)
- 9 tees
- 14 elbows
- 8 corner pieces, aka "3-way" (like an elbow, but in three different directions). May be substituted by an additional 8 tees and 8 elbows.
- One meter (3 feet) of heat-tolerant hose that will fit over the PPR pipe, plus enough length to hook up the dishwasher to your hot and cold water supplies, and reach to the drain.
- 4 hose clamps for attaching the hose to the pipes (see Wikipedia)
- Connectors to connect your supply hoses to the solenoids
- Connectors to connect the solenoids to the pipes, and the pipe to the pump
- 2 12v solenoid valves to control water flow (Make sure to use ones that can handle hot water. The linked solenoid can take up to 75°C, or 167°F)
- Arduino, Raspberry Pi, or other controller board (I used an Arduino Uno)
- 16×2 LCD display
- 3 push buttons for user input (or try these for a nicer button)
- 12v DC power adapter Use an adapter than can provide at least 3A, and watch. Familiarize yourself with the difference between regulated and unregulated power supplies.
- 12v pump for pumping away the drain water (about 4 liters/min should be fast enough)
- 3 TIP120 transistors for controlling the solenoids and pump
- 3 diodes to protect your circuitry from the kickbacks of the pump and solenoids
- 3 1k resistors for controlling the TP120 transistors
- 2 10k resistors for detecting water
- 1 piezo for beeping (optional)
- 2 thermistors for detecting which hose is hot and which is cold (optional feature)
- Perfboard/protoboard (recommended)
- Breakaway headers (optional)
- Insulated wire to connect the components
- Wheels (optional, but they make moving it much easier)
- Large plastic tubs with snap-on lids for the dishes. The exact size is up to you (I used 45 liter/47.5 quart), but make sure they're big enough to hold your dishes, and that they're dishwasher safe. They'll also need to have a large lip around the rim (see step 5 for why). Something like these. Finding a good price may be difficult. You might be able to get a better deal at a garage sale or something similar.
- Two water bottles (or soda bottles) to make funnels
- 2 sets of drawer slides. The length you need depends on the size of tubs you use and how far you want them to be able to slide out.
- Silicone caulk (try a hardware store)
Step 4: Build the Frame
I changed plans after building my frame, so it ended up too large. Follow the advice below to choose a size that works for you and your dish tubs. In case you're wondering, I made mine 2 feet deep, 2 1/2 feet wide, and 3 feet tall. The control center on the right is 6 inches wide.
To calculate the height you need, measure the tubs and decide how much space is needed below each tub for the drainage funnel and pipe. See step 8 to see what I'm talking about. Then add a little extra space in case plans change.
To calculated how deep (that is, how far from front to back) it needs to be, measure the tubs and calculate how much space you'll need at the back for attaching the hose (several inches). See step 7.
To calculate width, measure the tubs and add some space for the drawer sliders and the board you'll mount them on (see step 5). Then add some space on the right for a control area. I used 6 inches (15cm). That gives plenty of space for a front panel for user input, and an area to switch water on and off.
If all that doesn't make sense, look at the pictures.
Draw up a pattern and cut the plywood. Cut the thin boards (I suggest cutting 2×4's the long way if you can't get smaller pieces) to size and screw them into the plywood in the corners. I suggest drilling small holes first, as this will make it much easier for the screws to go in, and they won't be as likely to pop their heads. It's also a good idea to countersink the holes. Otherwise the screw heads can scratch things. You can do this with a countersink or a large screw bit and an electric drill.
Once the frame is done (or far enough along) you can bolt on the wheels from the bottom (if you're using wheels).
Step 5: Mount the Drawer Sliders
At this point it's time to mount the sliders that will hold the tubs of dishes. I did this by screwing a 1×1 board into each side of the main area for each tub. Then screw the sliders on, and screw another 1×1 board onto the sliders. This can be a bit tricky with some sliders, as the screw holes may be covered depending on how far the slider is extended. If the space for the tub between the sliders is a bit too large, you can add shims on each side or use thicker boards. The tub should fit nicely between the two sliders.
To attach the tubs to the 1×1 boards, extend the sliders all the way out and place the tubs so the lips rest on them. You want the tubs' lips to fit over screws which will hold the tubs in place. Mark the spots for screws, remove the tubs, and screw long screws part way into the 1×1 boards from the top. It doesn't work very well, but it's pretty straightforward and the tubs will be easy to remove when necessary.
Depending on your tubs, you might have to cut off a bit of reinforcing plastic that's supporting the lip. I did this with a hacksaw blade (separate from the hacksaw) and the strength didn't noticeably suffer.
Step 6: Cut and Fuse the PPR Pipe
Each tub will need a sprayer to spray the water onto the dishes. The best solution I could come up with (after failing with several other ideas) was to have a frame of piping all around the edges, and drill tiny holes for the water to spray out. The disadvantage with this design is that the sprayer is stationary, so it can be difficult to get the water sprayed everywhere on all the dishes. I tried to compensate for this by making the holes tiny and having lots of them, but it's still far from optimal.
If you bought 3-way corner pieces, this is the step where we'll use them. I found them to be more expensive than a tee and an elbow, so I improvised by combining tees and elbows to make the equivalent.
To start, look at the pictures to see the shape we're building. Then take your measuring tape and measure the insides of your plastic tubs to determine the exact size you'll need to cut the pipe. Try to measure accurately, but keep in mind that being a little small is OK, while being too large will mean it won't fit. You don't want it too small though, or it will jiggle around in the tub and break our silicone seal (we'll get to that later).
If you're using a saw to do the cutting (as opposed to a pipe cutter) I suggest using a file to smooth the ends a bit.
DISCLAIMER: The PPR iron is very hot and can severely burn you! Use protective gloves and work carefully! I am not responsible for any accidents. Use common sense and be very careful.
Here's how my iron and many others work: You set the thermostat, set it down in it's base, and plug it into an outlet. I've found something around 250°C works well. When the iron is heated the green light will turn off and the red one will turn on.
Then take the piece of pipe and the joint you're connecting it to, and steadily push them onto the iron. After a couple seconds, pull the pieces off the iron, avoiding twisting. Then push the pipe into the joint (don't twist) and make sure you have it on straight. If there are other joints on the pipe, make sure you get them oriented correctly, relative to each other. Although the joint will remain hot for a couple minutes, it will be set within a few seconds, so work quickly.
Since PPR fusing isn't the main topic of this instructable, I'm not going to go into extreme detail. You can watch an instuctional video at https://youtu.be/eMQRX2yXIsE, or search online for "ppr fusing" or "ppr welding."
Step 7: Cut Holes for Water Intake and Drain
Cut an inlet hole
Once you have your pipe frame in place in each tub, it's time to make a place for the water input. To do this you have to cut a hole in the side of the tub. Be warned that some plastic is prone to cracking, so you need to be very careful. There are several ways you could do this (for example, this hot blade might do the trick), but I'll be using an electric drill and a file.
With the PPR pipe frame complete, all you have to do is mark where the input meets the tub. From outside the tub, use a marker to mark where the tee faces outward. Then remove the piping from the tub. Using a small drill bit (larger ones are more prone to cracking plastic) drill lots of small holes at the edge of the circle, all the way around. Keep in mind that if the hole is a tad too low, it won't work, but if it's a tad high the pipe will still be able to connect. Once you've gone all the way around, use the drill to merge all the holes into one (this takes some pressure and patience). When the piece is free, use a small file to remove the jagged edges. When you think you're close to having it filed enough, try pushing a piece of pipe through so you can see where you still need to work. Don't make the hole any larger than necessary for the pipe to fit through.
Cut a drain hole
Water needs to drain from the low point of each tub. My tubs were lower in the front and the back than in the center, so I chose the back center for the drain. Mark the spot and drill a hole using a small drill bit. Keep changing to a slightly larger bit until you have a significantly-sized hole that's smaller than the inside of your piping. It doesn't need to be as big as your pipe. We'll work with this hole in a future step.
Add an input pipe
Cut about 2 inches (5cm) of pipe to stick out the inlet hole. Remove the frame from the tub. Melt the tee and the short pipe on the welding iron (get them plenty melted as this will take a couple seconds), stick the frame back into the tub, and push the short pipe in through the hole from the outside.
Caulk the hole
If you haven't worked with caulk before it won't hurt to read a bit about how to do it. In particular, I like this tip for getting a nice finish and this one on how to get the caulk to stick. Caulk around the edges, and be really generous with it. Then let it sit still and dry. According to one source, it should be "tack-free" in half and hour and ready for water in three hours, but may take up to 48 hours to "cure" (follow the link for more details and lots of great information). Mine took significantly longer.
It's important that the caulk seal isn't stressed. The best way to do this is to make sure the pipe frame can't move around in the tub. If it's a tad too small and won't sit perfectly still, you could add a shim on the opposite side to hold it in place. A short piece of pipe cut in half the long way may do nicely.
Drill lots of tiny holes in the piping in the tubs for the water to spray out. Start will the smallest drill size, and angle them all so they point towards where the dishes will be. You can always add more later, so don't get too carried away. You want the water pressure to be very strong; too many holes will weaken it.
Step 8: Make the Drain System
Cut about a half inch of pipe (1.25cm) and caulk it to the bottom of the drain hole. This is important so that the water will not run back on the bottom of the tub.
Cut the top off of each water bottle, trying to leave the funnel size as large as possible, but the height of the funnel as short as possible. I cut off the threads (where the water bottle lid screws on) to make them shorter. Then use caulk to "glue" the funnel to a pipe elbow. This piece will sit right below the drain and catch the water.
I chose this configuration because it allows the tubs to freely be pulled in and out, and doesn't stick up higher than the bottom of the tubs (that is, it doesn't cause water to stand in the tubs and have to reach a certain height before flowing out).
Step 9: Cut the Pipe Holes
At this point it's time to cut four holes in the divider between the main section and the side section of the dishwasher. Two pipes will bring water to the tubs, and two will drain water away. Measure the distance from the front of the frame to the back of the tubs. You want the water to come in right behind each tub and preferably just a bit higher than the bottom of each one (So water will tend to flow out of the machine rather than sit in the system. Not a big deal, really).
The holes for the drain pipes need to be placed more precisely. The funnel-and-elbow system you made in the previous step to collect water from the drain will run a pipe straight to the holes we cut in this step. You want the funnel as close to the bottom of the tubs as as possible, and to fit right over the drain pipe (in a future step we'll cut a notch in the funnel so the tubs can be moved in and out freely. The center of the funnel should be a bit farther forward than the center of the drain pipe, so water won't spill out the notch. Measure the height the drain needs to be, and make the holes low enough that the drain pipe can have a tiny slope downwards.
Measure, mark, and cut the holes (Trace around a short piece of pipe to mark the size you need to cut). I found using a large drill bit to cut several holes and then using a rasp to remove the rough parts worked quite well.
Step 10: Add the Water Supply Pipes
Measure the distance between the water supply holes you cut in the previous step, and cut a piece of pipe that length. It helps if you hold an pipe elbow at the top hole and a tee at the bottom hole, mark where they are, and measure between those markings.
Melt a pipe elbow onto one end of the pipe and a tee onto the other (make sure the elbow and tee point the same direction!).
Then cut two pieces of pipe at least 2 inches long (5cm) and fuse them to the elbow and tee. The piece should now fit through the holes in the wood. If the holes are a little off you may have to make them a bit larger.
Then use pipe clamps and hose to connect the water supply pipe to the tubs' input pipes.
Step 11: Add the Drain Pipes and Funnels
First, as in the previous step, measure the distance between the holes (this time the drain holes) and cut a piece of pipe that length. Fuse an elbow and a tee onto each end.
Measure the distance between the tubs' drains and the wooden divider and cut two pieces of pipe accordingly. Fuse one pipe into the pipe elbow and one into the tee. Give them a very slight slant so the water will drain better. Make sure they're in there just so, because they're all that will be holding the drain funnels in place. In fact, it's probably best to stick the pipe through the hole immediately after fusing it so you can make any necessary adjustments while the plastic is still melted. Have your drain funnels ready for this so you can hold them in place and get a good idea where the drain pipes need to be.
Add the funnels
After fusing both drain pipes, fuse on the drain elbows with the funnels. Remember, you won't be able to remove the pipes once you do this, because they will no longer fit out through the holes.
Carefully place the tubs on the rails, so that the drain pieces fit inside the drain funnels. Cut a notch in each funnel so the drain pipes won't catch on them when the tubs slide in and out (see pictures). If you accidentally break the funnels off while cutting the notch, don't feel bad; it happened to one of mine too.
Step 12: Connect Solenoid Valves and Water Intake
Connect the two solenoid valves to a tee. Then run a pipe from the tee to the water supply pipe. On the other ends of the solenoid valves, attach two connectors for your supply hoses (for whatever hookup you're using).
Then connect the pump's input to the drain pipe, and its output to a pipe to run water out the machine and to your drain hose.
Step 13: Wire Up the Main Parts
Connect the LCD to the Arduino according to the following schematic: https://www.arduino.cc/en/Tutorial/HelloWorld
I recommend using a larger resistor value than the 220Ω one used on arduino.cc in the linked guide. I actually used a 10kΩ resistor, because I don't want a bright back light. In fact, if your display is visible without a back light, you don't need to wire anything to the last two pins at all.
Pump and solenoids
Connecting the pump and solenoids is a bit more difficult. I used the schematic here: https://www.instructables.com/id/Controlling-solenoids-with-arduino/
Essentially, we connect the base of the transistor (the "control pin" so to speak) to the Arduino via a 1k resistor (pin 1 of the TIP120). The ground of our power adapter and of the Arduino's ground are connected to the emitter pin (pin 3). Finally, the negative end of our load (solenoid, pump, etc) is connected to the collector pin (pin 2). The positive end of our load is connected to the positive end of the power supply, and a diode is used to protect the Arduino from high kickback voltage momentarily created when the pump runs or the solenoids switch. The diode needs to be connected to both terminals of the load, with the stripe of the diode pointing away from the transistor. See the linked instructable for schematics.
Please not that most solenoids do not have a polarity. You can connect the positive wire to either terminal, and the negative to the other terminal. The pump on the other hand must be wired correctly or the motor will most likely spin backwards. The positive wire will probably be red, and the negative one black.
Make sure you use thick enough wire for the current ratings of your pump and solenoids. You can look up how much current your wire can handle if you know the wire gauge, in AWG.
To learn more about transistors, visit https://learn.sparkfun.com/tutorials/transistors for a detailed walk through on how they work and how to use them.
Solder a ground wire to one pin of each of the push buttons, and run it to the Arduino's ground. Assuming you're using four-pin push buttons, solder another wire to each button, diagonally across from the ground wire (catercorner). Connect these wires to the Arduino's digital pins. That's all; we don't need to connect any pull-up resistors; we'll be using the Arduino's internal pull-up resistors.
How you connect the wires to the Arduino is up to you, but I prefer breakaway headers because they make a nice and clean connection. Not counting ground and 5v wires, the LCD has 6 wires, the buttons 3, and the solenoids and pump have 3. Pins 0 and 1 are for serial communication, so I wired the LCD to pins 8-13, the buttons to pins 5-7, and the solenoids and pump to pins 2-4.
Step 14: Wire Up the Minor Parts
To detect water in the drain pipe, all you need is two wires, one connected to the Arduino's ground, and the other to a digital pin (I used analog pin 0). Strip the wire off the ends that will be submerged, and knot them together, making sure their ends stick away from each other. Connect one wire to one of the Arduino's digital pins via a 10k resistor. Connect the other one to ground. I used a 10k resistor on this one too, since being extra cautious is a good idea when working with water (I've had plenty of leaking).
Drill a hole in each of your inlet pipes, just large enough to fit a thermistor. Stick one just a little ways in to the hole, and caulk it in place really well. Connect one wire to ground and the other to a digital pin on the Arduino (I used analog pins 1 and 2 for my thermistors).
Connect the negative pin to ground and the positive to a digital pin (I used analog pin 3). Simple, eh?
Step 15: Program the Arduino
Attached is the code to run the dishwasher. Open it with the Arduino IDE and install the dependencies by going to Sketch > Include Library > Manage Libraries..., and install RBD_Timer, RBD_Button, and elapsedMillis. For more detailed instructions on installing libraries, visit https://www.arduino.cc/en/Guide/Libraries.
Change any pinout as needed (all the pins are specified near the top of the file) and upload the code to an Arduino.
Most of what's done in the code is quite straightforward. I'm using a library for the button inputs, which does automatic debouncing, and another library for tracking elapsed time. This greatly simplifies things.
The code is still work-in-progress, but it appears to be working. A washing cycle is simply turning the solenoids and pump on for 90 minutes. I'm planning to support multiple washing cycles, with much more advanced options than "turn everything on." For example, a cold water rinse cycle, then a hot wash, a long period of warm water, and a rinse.
You can find the very latest code, as well as more detailed instructions for using it, at https://github.com/Nateowami/arduino-dishwasher. I'll continue to update the code attached to this step, however.
NOTE: The code attached to this step is at commit ba6118afe9a036166bc3f3d53a02d52cd2dbccd8, the latest version as I write.
Step 16: Going Further
There are several improvements that could be done.
- The sprayers are motionless, and therefor not as effective. I considered a lot of options for a long time before settling on this one, so I can't think of any other viable options.
- There's no soap input. I thought about this, and considered adding a soap input, but never came up with a good way to implement it. I intend that you simply drizzle soap onto the dishes before starting a cycle, but you could also pause the load part way through and add soap (the software allows pausing).
- The software could automatically detect which solenoid controlled hot water and which was cold using a couple thermistors. This would remove the need for manually checking which hose is connected to which input, and would be a cool feature to have.
I'm interested to hear your ideas. Please leave a comment if you have any thoughts.