A brilliant display of over-engineering that applies industrial-grade precision to a trivial domestic task. It perfectly captures the maker spirit of solving simple problems with unnecessary yet impressive technical sophistication.
Deep Dive
Prerequisite Knowledge
- No data available.
Where to go next
- No data available.
Deep Dive
I Built a Shower That Starts ItselfAdded:
This is my smart shower controller. It attaches to a normal shower valve, turns the water on by itself, and adjusts the water valve until the shower reaches the temperature I've set. So instead of standing there waiting for hot water, I can start the shower from my phone, Siri, or Alexa. And when the water reaches the target temperature, Home Assistant sends me a notification that it's ready. The reason I built it is simple. From a cold start, it takes almost 2 minutes before the water is actually usable, which is not a huge problem, but it is exactly the kind of small daily annoyance where a normal person calls a plumber. And I start wondering if I can automate the whole thing. I already built version one of this, and it worked. It could turn the water on locally and remotely, get to temperature automatically, and keep it stable most of the time. But it still felt like a prototype because it was a prototype. The temperature control had a tendency to overshoot, then take too long to settle back down. The enclosure looked unfinished. And the worst part was that sometimes it entered a fault state where the controller stopped responding while the shower stayed on, usually at the hottest setting. To fix that, I had to power cycle it from another room, which is not great when you are already in the shower. So, for V2, I wanted the reliable version.
cleaner hardware, better packaging, faster temperature sensing, and fewer situations where I have to negotiate with my own shower. But the part that was supposed to make the temperature sensing better ended up creating one of the weirdest failures I've ever run into. It was the kind of problem where every obvious answer looked right, and every obvious fix did nothing. With that, I pulled version one off the wall and started rebuilding the whole thing properly. The first step was taking version one apart and figuring out what actually worked. Some parts of V1 were worth keeping.
The motor setup worked, the gear system worked, the display worked, and the basic control concept was solid. But other parts needed to be upgraded. The enclosure needed to look better. The wiring needed to be cleaner. The temperature sensing needed to be faster, and the whole thing needed to feel less like a prototype and more like something I could actually trust in the shower.
Behind the plate, you can still see the scanning markers from the first build. I used those to 3D scan the actual shower hardware, the valve stem shape, how far it sticks out from the wall, and the valve bolt locations. Reliability was the whole point of V2. So, before designing around the same motor setup, I wanted one number I never properly measured the first time. How much force does this valve actually need to move?
To measure it, I put a small wrench on the valve stem. In theory, if I know how much force it takes to move the wrench and I know how far that force is from the center of the valve, I can calculate the torque needed to turn it. So, I just needed the right tool for the job. Maybe something a little more precise than that.
This is a tiny handheld force gauge. It measures push force, shows the result on a small OLED display, and runs from USBC. The main sensor is this bar style load cell. I'm using this one because I already had it, which is one of the strongest arguments in engineering. When force is applied, it bends a tiny amount. And the HX711 reads that tiny electrical change. From there, the electronics are pretty simple. Arduino Nano to HX711, HX711 to load cell, and the Arduino sends the reading to the display.
The frame needs to be rigid, so I designed it in aluminum and cut it on the CNC.
You need it. You need it.
and of course chamfers because according to Blondie Hacks, that's what separates us from the animals. Now, the quick measurement tool has a machined aluminum frame. Next, I printed a transparent enclosure, mostly so the Arduino's RGB LED can shine through for absolutely no functional reason. Then, the load cell bolts directly to the frame.
After that, it was just final assembly.
Display in, electronics packed inside, wires routed badly enough to build character, and the case closed up.
A few screws later, the force gauge was done. To check it, I used a battery that weighs 70 g on the kitchen scale. On the force gauge, it reads 69 g within tolerance.
And that is the finished handheld force gauge.
Hey, that's mine. Anyway, now I could finally measure the shower valve for real. The force gauge pushes on the end of the wrench and once the valve starts moving, I get the force required to turn it. The reading was about 553 g and I was pushing 108 mm from the center of the valve. Tiny math section. Nobody panic. 553 g is 0.553 kg of force and 108 mm is 10.8 cm. So 0.553 * 10.8 gives about 6 kg cm of torque at the valve. That is the whole math. We survived.
The motor is rated for 25 kg cm and the gears double that before it reaches the valve. So, the motor and gear setup had plenty of margin, which meant the noisy little motor could stay. The rest of the controller was getting rebuilt around it. V1 donated the parts that already made sense. The gears, the display, the motor driver, and the basic mechanism, but almost everything else around those parts needed to change. The first piece was the new main plate. It still mounts to the same shower hardware, but now it has standoffs for the part I was most excited about, the module plate. This is the piece that holds all the electronic modules, but it is also a huge part of why the finished device looks the way it does. The module plate is printed in matte black with copper looking traces and dedicated holes for each module's legs. It looks like a custom PCB, but it is really a 3D printed mounting plate.
The actual wiring happens on the back, hidden from the front, which is basically cheating, but it is the useful kind of cheating. The magnetic sensor holder also got redesigned. The old one worked, but the new version matches the rest of the controller vibe better and hides the sensor wires inside the part.
The sensor reads the valve angle using a magnet, so the controller knows the current position of the shower valve instead of guessing based on how long the motor ran. That little detail becomes important later, especially after the controller restarts.
Then came the part I was most excited to print, the cover. V1 had a plain gray cover, which was fine. 10 out of 10 on cover behavior. But for V2, I wanted the exact opposite. Instead of hiding the inside, I wanted the front to show how everything worked through a clean acrylic window. So, I designed the cover with a small ledge that holds the acrylic. Once the printer finished that ledge, I paused the print, dropped in the round acrylic, and let the next layers trap it inside the cover. I had never done an insert this big during a print before, and the first layers around the acrylic were not exactly confidence inspiring, but after some cleanup, it came out really good. To light the inside, I added an addressable LED strip around the cover. Very necessary, extremely practical, basically a safety requirement. I taped the strip in, tried to close everything, and it did not fit. The strip was taking up just enough space that the cover would not sit down properly. So, I removed the strip and taped it tighter, basically flush against the acrylic.
That helped, but now the LED wire was getting squeezed between the cover and the module plate. It technically closed, but it felt like future me was not going to love present me. So, I printed a new module plate with a slightly smaller diameter. And after that, everything fit. The cover closed properly. The acrylic showed the module plate and the LEDs made the inside look exactly as unnecessary as I wanted. Which left one small but very important question. How do you convince a pile of tiny circuit boards to live inside a shower?
This is also where the project became real. Until now, V1 could still go back on the wall if I needed it, but now I had to take parts from the working controller, the motor driver, the display, and soon the shower head valve.
So, from this point on, the shower was officially out of service. The deadline was simple. Get it working again before my wife needed to shower that night. No pressure, just plumbing, firmware, wet electronics, and an actual shower that needed to work again by tonight. The first job was preparing the modules for the new module plate. I used the old oversized plate as a soldering template so the pins would stay straight and land cleanly in the final version. Then each module went into its actual position and I soldered the pins in place. Now the module plate was starting to become the actual electronics assembly. Next, everything had to be cleaned before coating. ESP32 butt converter, motor driver, ADS115, logic level shifter, and another buck converter. Then I soldered the tiny wires onto the magnetic sensor module, and that went into the IPA 2. After the boards soaked for a bit, I pulled them out, dried them, and cleaned around the components with cotton swabs. The goal was to get rid of flux, oils, and anything else that could get trapped under the conformal coating. Then came the coating. I used acrylic conformal coating, which is made to protect circuit boards from moisture, humidity, and contamination. It does not make the boards waterproof, but it adds a protective layer over the components, which is exactly what I wanted before putting electronics anywhere near a shower. I brushed it onto each module carefully, trying to cover the exposed electronics while keeping connectors and moving parts usable. I did coat the ESP32 buttons, though, and I can now confirm tactile buttons do not become more tactile when you paint them shut, so that was noted for next time. The round LCD also got the same treatment.
The front looks like one clean display, but inside it is another PCB that also has to survive this very questionable career path. So, I opened the enclosure and coated the exposed board areas. Next was the temperature sensor. In V1, the sensor was mounted inside this brass extension between the wall pipe and the shower head. It worked, but I did not like the extension. When I took it apart, I also found the old probe covered in epoxy. That probably did not help the response time. For V2, I wanted to remove the brass extension completely and use a bare glass thermister directly in the shower head selector body. less metal around the sensor, less material between the water and the thermister, and hopefully a faster reading. So, I put it on the drill press and started drilling. The hole started normally, right until it didn't. The drill bit snapped inside the part. Under the brass, there was what looked like a much harder metal nut. Definitely harder than my drill bit. Luckily, the brake was clean and I was able to get the bit out.
I found another drill bit, moved the location slightly closer to the selector mechanism, and tried again. Now, in the Cyber Quad video, I learned a very important life lesson. Mistakes are fine as long as you learn from them. Anyway, this location was riskier, but it worked. The hole landed right where I needed it, and the bare thermister fit into the water path nicely. Before installing the thermister, I tried to isolate the exposed sensor leads with epoxy. The idea was simple. The sensor can touch the water thermally, but the electrical leads should stay isolated from it. At least that was the theory, and that theory is going to matter a lot later. I glued the sensor into the hole, sealed it with epoxy, and left the selector body outside in the sun to cure. While the epoxy cured, the coated modules needed to become one connected system. I put the modules into the actual module plate and started wiring everything from the back. This was the vision for the module plate. The front gets the clean layout and the wiring happens where it does not distract from the design. I am not going to turn hours of wiring into hours of video. But the basic job was connecting power, I2C, sensor inputs, motor control, display, and LEDs between all the modules. The thermostatrmister also needed its divider resistor. So the ADS could turn the resistance change into a temperature reading. The magnetic sensor needed a little extra attention. It has to sit close to the rotating magnet, but this build had a strict no visible wires from the front rule. So, I glued the sensor into its holder and routed the tiny wires through one of the arms, then down through a hole under the back plate. I had to use really thin wire to make that work. But from the front, the sensor wiring basically disappears. After that, the module plate had all the main wiring in place. Not finished, but connected enough for the first full system test.
Around 6:00 p.m., I had all the major pieces connected on the bench. The module plate, motor, display, magnetic sensor, LED cover, and the new temperature sensor in the shower selector body. The evening shower deadline was around 900 p.m., so I had about 3 hours to get the bench test passing before final assembly. The code was already based on V1, so in theory, this should have been the easy part.
Move a few pin definitions around, add the new LED strip code, upload it, and watch the system come to life. Very clean plan. Extremely optimistic. Then came the actual firmware.
So, the 900 p.m. deadline was successfully converted into a morning deadline, not by engineering, by negotiation. And with that new deadline secured, I kept debugging. After many more hours of coding, uploading, checking serial output, and fixing the little integration issues that only show up when all the real hardware is connected, we were finally ready. The bench test passed. The screen was on.
The motor responded correctly. The LEDs worked. The temperature reading looked stable. and the controller was no longer doing anything unexpected. At 2:23 a.m., that was enough to move from the bench back to the shower. Before final assembly, I still had a few small parts to finish. The display needed this bracket so it could mount cleanly to the acrylic from the inside with the ribbon cable passing through the center. At the time, it looked like a simple mounting detail. Later, that tiny stackup would matter way more than it had any right to. I also printed a new black motor mount. The white V1 mount worked, but it did not match the V2 design.
With the electronics coated, the module plate wired, and the bench test passing, it was time to put the shower back together.
The evening deadline was gone, but the morning deadline was still on the table.
Heat. Heat.
Heat. Heat.
I walked back into the bathroom and the whole thing was alive.
After way too many hours of printing, soldering, coding, wiring, debugging, and chasing tiny mechanical details, it actually looked like the thing I had imagined. And I'm not going to lie, this was one of those moments where the sleep deprivation briefly turns into pride.
So, naturally, I pressed the button to start the shower, and nothing happened.
Perfect. The controller was alive. Home Assistant saw it, and the motor worked.
But the physical button was not emotionally ready to participate.
Luckily, the shower could still start from my phone, which is literally the reason I built this thing. Before that, I had one last adjustment. This cover holds the two- pole magnet for the angle sensor. The sensor reads the magnets's absolute angle. So, after a power cycle, the controller immediately knows where the valve is. No timing the motor, no guessing, no trusting memory. To set zero, I rotated the magnet by hand until the motor corrected itself to off. The button still didn't work, but at 5:20 a.m. that was future MI's problem. I started the shower from my phone. The motor opened the valve.
The temperature came up and it worked.
Not perfectly, but well enough to take a shower. It was not better than V1 yet.
The temperature control still needed tuning. The button needed fixing and I needed to experience sleep. But the shower worked. More importantly, it worked well enough for my wife to use, too. So, the morning deadline was met.
Not gracefully, not elegantly, but met.
And for that one mediocre shower, I thought the hard part was behind me. The next morning, I started with the obvious problem, the button. Thankfully, this one was not a mystery. The screws on the display bracket were just tall enough to stop the button from pressing all the way. I swapped in two flathead screws and problem one was solved. Actual clean fix. Very rare. Enjoy it while it lasts.
Then I put the cover back on and that's when the temperature sensor started lying to me. Not a little noisy lying, more like jumping several degrees in seconds while no water was even flowing.
So I started debugging. First the code.
It didn't feel likely because V1 used basically the same temperature reading logic and that was solid. Still, I checked it. Nothing. Next suspect wiring. I pulled the cover off, removed the module plate, and traced the sensor and ADS connections, and I found something. Past me had routed the ADS ground through both noisy butt converter areas before it got back to the ESP32.
Perfect ground noise. Easy fix. I cleaned up the ground path, put everything back together, powered it on, and the temperature was still all over the place. So, the controller came back off the wall again. This time, I changed the thermostatrmister divider resistor.
The sensor is a 100K NTC, and I had been using a 10K series resistor, so I swapped it to 100K, updated the code, and tried again. Back to the shower.
Plate installed, cover on, no change.
So, it came apart again. Next idea, add a capacitor on the temperature input.
Maybe the ADC just needed some filtering. Still wrong. At that point, I went with the subtle, delicate version of debugging. Armageddon rewiring. I cleaned up the wiring, skipped the second buck converter completely, and added capacitors everywhere.
electrolytic, ceramic, power rails, sensor input, 5 volts, 3.3 volts, whatever looked like it wanted a capacitor. And if you guessed that the buck converter and the logic level shifter were the modules that didn't survive the final version, you were correct. The logic level shifter was eliminated on the bench because it was most likely too slow for the LED strip data. And the second buck converter was eliminated here because I no longer trusted anything with an inductor. This time I was sure I had it. I installed it again, powered it up, and the temperature was still wrong. Then I noticed something important. When the controller was powered from my Mac over USB, the reading was perfectly smooth.
But when it was powered from the wall supply, the reading lost its mind. So I pulled out the oscilloscope.
The 12vt input looked clean.
The 5V rail looked clean. The 3.3 volt rail on the ADS looked clean. So before I show you the next probe, pause the video and guess what was actually causing it. Because when I probed the actual analog input from the temperature sensor, there it was a 60 Hz sine wave on the thermostatrmister signal. To confirm it, I powered the same wall supply from a portable battery power station instead of the house outlet.
Same controller, same power supply, but now isolated from the grid, and the reading was clean. Then I tried a grounded three-prongong supply, hoping for an easy fix. It didn't fix it. That pointed to the real problem, the sensor itself. At some point, water made it past my failed epoxy seal and reached one or both sensor legs. that turned the shower water into part of the circuit and the water or plumbing was picking up main's frequency noise and feeding it straight into the ADC input. So, the thermostatrmister was no longer just measuring temperature. It was accidentally listening to the house. Bad feature. After all the rewiring, capacitors, resistor changes, and confident wrong guesses, the fix was to give up on the bare thermostat and use the less ideal sensor in the metal housing. It responds slower, but it is sealed. And in a shower, sealed beats theoretically better every single time.
I installed the metal sensor, powered everything back up, and finally the reading was stable. No random jumps, no 60 Hz waveform, just a boring temperature number doing boring temperature number things, which after this much debugging was beautiful.
Up to this point, V2 was still using basically the same temperature control logic as V1, and it worked, but not good enough. It would get close to the target, overshoot, correct, undersshoot, and oscillate until it eventually settled down. So, the goal was simple.
Get to the target temperature as fast as possible with the lowest error. Too aggressive and it shoots past the target. Too careful and the shower takes forever to get ready. So, I let AI take the wheel. It adjusted the control values in the code, started the shower through MQTT, logged the temperature, valve angle, target angle, and error, then use that data to try the next version. And eventually, I got it to a place I was actually happy with. At this point, V2 did not just look better, it worked better. It gets the shower to temperature faster with less overshoot, less hunting, and fewer tiny motor corrections.
And that's why this became one of my favorite projects. Not because it's the most complicated thing I've designed, because I actually use it every day. It solves a real annoyance in my house in a completely unnecessary but very satisfying way. And before this ends, seriously, thank you. The response to the Cyber Quad video was way beyond anything I expected. And I really appreciate everyone who watched, commented, and subscribed. I have a lot more builds coming. Some useful, some fast, some probably more complicated than they should be. If that sounds like your kind of thing, subscribe. I'll see you in the next one.
Related Videos
U.S. Military Just Flexed The Most Dangerous Aircraft Ever Built The F-47
MaxAfterburnerusa
11K viewsβ’2026-05-29
Heating Staying On On The Hottest Day Of The Year
PlumbLikeTom
507 viewsβ’2026-05-29
λ°μ ν¨μ¨μ λμ΄λ νμκ΄ μΆμ μμ€ν μ κΈ°μ μ μ리 #곡ν #곡μ #νμκ΄ #μκ³ λ¦¬μ¦ #μ¬μμλμ§
μ°νμ₯κΈ°μ
2K viewsβ’2026-05-29
Peterborough to Newark Northgate Driver's Eye View aboard an InterCity 225 - East Coast Main Line
TrainsTrainsTrains
822 viewsβ’2026-05-31
AI turbine design: hypersonic cooling leap #shorts #ai #hypersonic
bobbby_rn
671 viewsβ’2026-05-31
μ§κ΄ λ° κ³‘κ΄ λ°°κ΄ κ²°ν© κ³ μ μμ #worker #process #fabrication #pipework #clamp
μλμ΄μ΄
2K viewsβ’2026-05-30
How Far Can A Tomahawk Missile Actually Travel?
WarCurious
13K viewsβ’2026-05-28
Wire To Wire Connection Trick | Strong And Secure Electrical Joint #shortvideo #wireworks
ElectricianTips-b1h
5K viewsβ’2026-06-02











