SmartCat Toilet – simple to build, surprisingly smart
How it works:
Once powered on, the litter box automatically searches for its home position. After that, it waits for input. You can now fill in the cat litter and use the website (on your phone or PC) to calibrate it to zero.
When your cat enters, you can see its live weight on your phone or PC via the built-in web interface. After the cat finishes its business and leaves the litter box, the system waits 10 seconds and then automatically starts cleaning. Through a smart rotating motion, the waste is moved into the rear container. After that, it returns to the home position, ready for the next visit.
If the cat re-enters during those 10 seconds or while cleaning, the process stops immediately and resets the timer for maximum safety. Once the cat has left again, the system waits another 10 seconds before restarting the cleaning cycle.
The litter box runs quietly and uses a safe 24V system – no electrical hazard for maximum safety. Don’t overfill it with litter, or the motor might struggle. A good amount is enough to cover around 16 cm width, reaching all the way to the back. You can experiment with the best amount. Overfilling may also prevent the waste from reaching the side pouch properly.
Boost Me (for free)
I've spent countless hours developing this project – from the design and electronics to the step-by-step guide. If you like what I’ve built and want to support me, leaving a free boost would be an amazing help! It doesn’t cost you anything, but it really motivates me and makes it possible for me to keep creating big, detailed projects like this one. Thank you!
Why 3D print a cat litter box instead of buying one?
Because it’s cheaper, fully repairable, customizable – and honestly, building it yourself is just way more fun!
After more then - 800 hours - of development, my automated litter box is finally ready.
I made sure it's also beginner-friendly, both in terms of setup and understanding.
The parts are easy to print, the electronics are simple, and the system works entirely without a cloud or app – just via WiFi in your browser.
During this project, I learned more than I ever expected:
I realized how important capacitors are in real-life circuits – not just in theory like we learned in technician school.
I also had to teach myself how to build websites using HTML, CSS, and JavaScript, and how to program microcontrollers using C++ for the ESP32.
It was a steep learning curve, but an amazing experience!
The entire build uses around ~12 kg of filament ( ~11,5 Days printtime) and is designed to be modular, reliable and beginner-friendly:
There's no glue needed (except magnets) – all components are screwed together, making it super easy to replace parts if something breaks – no hassle, no frustration.
In this project you'll find step-by-step instructions:
What parts you need, how to assemble everything, and how to bring your own smart litter box to life.
Cats are only detected once they weigh around 1.5 kg or more, assuming the system is properly calibrated.
So it's not suitable for kittens. If needed, you can manually trigger the cleaning cycle by briefly pressing on the platform yourself.
A Quick Note Before We Start
If you’re interested, I also offer a fully assembled version of the Smart Cat Toilet.
That means I will print all the parts, purchase all required components, assemble the entire system, and ship the finished product to you.
We can discuss the final price individually – but I wanted to let you know that this option is available.
If you don’t own a 3D printer or only have a small one, I can also offer to print all the parts for you and ship them. You would just cover the material and shipping costs.
As an alternative, I can prepare a complete DIY kit:
I would order all non-printed parts, solder the electronics, and include all necessary screws and hardware. You would then only need to print the plastic parts and assemble the litter box yourself. Think of it as a convenient, ready-to-go maker kit.
If you're interested in any of these options, feel free to reach out to me directly here on the platform or contact me directly via email at
dominikhoffmann1999@gmail.com
– I'm sure we can find a solution that works for you, or if you'd like a different option, feel free to contact me.
📩 Interested in commercial use?
If you would like to print, build, and sell this project yourself, I also offer a commercial license. Just send me a message!
Got ideas to improve the code or spotted something? I'd love to hear your feedback!
Thank you for your interest – and now, let’s get building! 😺
Enjoy building it! 🐾
Part 1
Parts List for the SmartCat Toilet
Part | Description | Qty | Total Price | Source |
---|---|---|---|---|
1 | Gear Motor 24v 16RPM | 1 | 17,99€ | AliExpress |
2 | 10P Terminal Block | 3 | 6,75€ | AliExpress |
3 | Buck Converter (LM2596) | 1 | 1,35€ | AliExpress |
4 | Load Cell Sensor 20KG | 4 | 7,56€ | AliExpress |
5 | HX711 Module | 1 | 1,19€ | AliExpress |
6 | L298N Dual Motor Driver | 1 | 1,69€ | AliExpress |
7 | Power Supply 24V 3A | 1 | 15,99€ | Amazon |
8 | Silicone Cable Kit (20AWG, 6 colors) | 1 | 23,99€ | Amazon |
9 | Push Button Switch (LED, 16mm) | 1 | 7,49€ | Amazon |
10 | ESP32 Dev Boards (set of 3) | 1 | 15,99€ | Amazon |
11 | Hall Effect Sensor (Magnet Sensor set of 5) | 1 | 5,99€ | Amazon |
12 | Electrolytic Capacitor Set (100uF used) | 1 | 10,99€ | Amazon |
13 | Screw Set (M2–M5 sizes) | 1 | 16,99€ | Amazon |
14 | BT2x5 Screws (set of 20: AA191) | 1 | 1,06€ | Bambu Lab |
15 | BT3x5 Screws (set of 20: AA199) | 1 | 1,10€ | Bambu Lab |
16 | BT3x10 Screws (set of 20: AA200) | 1 | 1,12€ | Bambu Lab |
17 | BT3x14 Screws (set of 20: AA201) | 3 | 3,36€ | Bambu Lab |
18 | BT3x18 Screws (set of 10: AA202) | 6 | 6,54€ | Bambu Lab |
19 | Magnet 4x2mm (set of 20: CA001) | 1 | 2,06€ | Bambu Lab |
20 | Magnet 8x2mm (set of 20: CA005) | 1 | 2,68€ | Bambu Lab |
21 | Steel Bearings (set of 2: EA041) | 2 | 7,24 | Bambu Lab |
Filament ABS white (my choice) | 12 | 203,88€ | Bambu Lab | |
Filament ABS white Bundle Eleg oo | 3 | 149,97€ | Amazon | |
= | Total cost without Filament | ~160€ |
19: eu.store.bambulab.com/de/collections/magnets/products/rundmagnet
20: eu.store.bambulab.com/de/collections/magnets/products/rundmagnet
21: eu.store.bambulab.com/de/collections/bearings/products/steel-deep-groove-ball-bearings-1
If you'd like, you can scroll down to the description – I've listed all the Bambu Lab items there. You can simply select everything at once and order directly. That way, you don’t have to search for each item individually, and you'll also be supporting me. Thank you!
📦 Notes:
Items are sourced from AliExpress, Amazon, and Bambu Lab for the best price-performance ratio.
You could buy everything from Amazon only, but that would cost significantly more.
Screws from Bambu Lab may already be in your collection if you're using a Bambu 3D printer.
You'll also need ~12 kg filament (e.g., PETG or PLA+).
Assembly is fully screw-based – no glue needed!
Damaged parts can be replaced easily.
Required Tools
- Phillips screwdriver (standard size)
- Small flathead screwdriver (for terminals)
- Allen keys (M2/M3 sizes – e.g. for Bambu Lab screws)
- Wire stripper or sharp knife
- Side cutters
- Soldering iron and solder
- Heat shrink tubing or electrical tape (optional)
- Ferrules (for clean terminal connections)
- Optional: small drill or tweezers
Part 2
Pre-Assembly Preparation
Before starting the build, it’s smart to prepare everything properly.
This avoids mistakes and saves time later.
✅ What to do before assembly:
- Unpack and sort all parts: Organize screws by sizeCheck if all electronics and components are present
- Inspect 3D printed parts: Make sure everything printed correctly. Look out for warping, missing layers or weak areas
- Pre-test the power setup: Set the buck converter to 5 V using a multimeter. Power up the ESP32 once to verify functionality
- Flash the ESP32 with a test sketch: For example, upload a simple Blink sketch. This helps ensure the USB connection is working
- Check and clean holes and threads: Make sure all screw holes are clean. Tap or widen holes if needed
- Prepare your workspace: Clean and well-lit desk. Keep tools and parts sorted and ready
Part 3
Prepare the ESP32 & Test the Website
Before starting the build, test if your ESP32 connects to WiFi and serves the live web interface and Adding the Required Libraries.
#include <WiFi.h>
#include <WebServer.h>
#include “HX711.h”
These are called libraries – they give your program the tools it needs to host a website or read weight from the HX711 chip.
How to install them:
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries
- Search for "HX711"
- Install it (e.g. the one by "Bogde")
- Repeat the search for "WebServer" (this one is often pre-installed)
- WiFi.h is already included with the ESP32 board package
Connect the ESP32
- Plug the ESP32 into your PC via USB.
- Go to Tools → Board → ESP32 Dev Module -esp32
- Then Tools → Port → COM5 (or whichever COM your ESP32 uses)
- Enter your WiFi name and password
At the top of the code, edit:
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
Upload and test
- Upload the sketch
- Open the Serial Monitor (115200 baud)
- Look for the IP address the ESP32 prints – e.g.:
Connected! IP address: 192.168.178.32 ( or 192.168.178.35 or 192.168.178.60 etc. )
During the upload process to the ESP32, you might see the message "Connecting..."
Sometimes, the board doesn't connect automatically. In that case, you need to press the "BOOT" button on the ESP32 exactly at the time when there is a connection….
You’ll usually find it on the right side of the board. Keep it pressed for a few seconds until the upload starts.
Open the website
- Type that IP into your browser (PC or smartphone).
You should now see the live interface.
Add the page to your home screen
On Android (e.g. Chrome):
- Open the page in Chrome
- Tap the 3 dots menu
- Select “Add to Home screen”
- Name it → Done!
On iPhone (Safari):
- Open the page in Safari
- Tap the Share icon
- Select “Add to Home Screen”
- Name it → Add → Done!
Here is the complete code.
You can see the scroll bar on the left – it shows how far the code goes down.
Please copy and paste the entire code exactly as it is, without changing (except of course your wifi name and password) or skipping anything.
If you run into any issues: Just ask – I’ll be happy to help!
Line 15 (const float amplification = 120.0;) controls the weight accuracy.
If you place 3 kg in the litter box but it only shows 2.6 kg, try increasing this value slightly.
If the displayed weight is too high, reduce it.
Would you like a German version? Just leave a comment and I'll send it to you.
#include <WiFi.h>
#include <WebServer.h>
#include "HX711.h"
// WLAN
const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
// HX711
#define HX711_DT 22
#define HX711_SCK 21
HX711 scale;
float calibration_factor = 4500.0;
const float amplification = 120.0;
// Motor
const int MOTOR_ENA = 32;
const int MOTOR_IN1 = 27;
const int MOTOR_IN2 = 26;
// Magnetic sensor
const int MAGNET_SENSOR = 4;
// Weight buffer
const int BUFFER_SIZE = 10;
float weightBuffer[BUFFER_SIZE] = {0};
int bufferIndex = 0;
bool bufferFull = false;
float lastDisplayKg = 0.0;
// Cleaning logic
bool tare_done = false;
bool catPresent = false;
bool cleaningPending = false;
unsigned long startTime = 0;
unsigned long leaveTime = 0;
const float THRESHOLD = 1.5; // in kg
const unsigned long CLEANING_DELAY = 10000;
// Webserver
WebServer server(80);
// Web page
const char MAIN_page[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Smart Cat Toilet</title>
<style>
body { font-family: sans-serif; background: #f3f4f6; display: flex; justify-content: center; align-items: center; flex-direction: column; height: 100vh; margin: 0; }
.box { background: white; padding: 30px; border-radius: 20px; box-shadow: 0 0 20px rgba(0,0,0,0.1); text-align: center; margin-bottom: 20px; }
h1 { margin: 0 0 20px; font-size: 2em; color: #1f2937; }
#weight { font-size: 3em; color: #2563eb; }
.btn { margin-top: 20px; padding: 12px 24px; background: #3b82f6; color: white; font-size: 16px; border: none; border-radius: 12px; cursor: pointer; transition: background 0.3s ease; }
.btn:hover { background: #2563eb; }
.author { font-size: 14px; cursor: pointer; color: #3b82f6; margin-top: 12px; }
.links-popup { display: none; position: fixed; top: 100px; left: 50%; transform: translateX(-50%); background: white; padding: 20px; border-radius: 16px; box-shadow: 0 8px 20px rgba(0,0,0,0.15); z-index: 100; text-align: center; width: 90%; max-width: 350px; }
.links-popup h3 { margin-top: 0; }
.links-popup a { display: flex; align-items: center; justify-content: center; margin: 8px 0; color: #1e293b; text-decoration: none; font-size: 15px; }
.links-popup img { width: 22px; height: 22px; margin-right: 8px; }
.links-popup .btn { margin-top: 16px; background: #e5e7eb; color: #111827; }
.links-popup .btn:hover { background: #d1d5db; }
</style>
</head>
<body>
<div class="box">
<h1>Smart Cat Toilet</h1>
<div id="weight">Loading...</div>
<button class="btn" onclick="calibrate()">Calibrate</button>
</div>
<div class="author" onclick="toggleLinksPopup(true)">Made by <span style="color:#3b82f6">Dominik ›</span></div>
<div class="links-popup" id="linksPopup">
<h3>Dominik's Links</h3>
<a href="https://makerworld.com/de/@Dododomme" target="_blank"><img src="https://o1m.cn/wp-content/uploads/2024/02/2f739-makerworld.com.png">Makerworld</a>
<a href="https://www.printables.com/@Dododomme_3020836" target="_blank"><img src="https://www.printables.com/favicon.ico">Printables</a>
<a href="https://www.instagram.com/dm_n_k/?next=%2F" target="_blank"><img src="https://cdn-icons-png.flaticon.com/512/2111/2111463.png">Instagram</a>
<a href="https://buymeacoffee.com/dododomme" target="_blank"><img src="https://cdn-icons-png.flaticon.com/512/649/649931.png">Buy Me a Coffee</a>
<button class="btn" onclick="toggleLinksPopup(false)">Cancel</button>
</div>
<script>
async function updateWeight() {
try {
const res = await fetch('/weight');
const text = await res.text();
document.getElementById('weight').innerText = text + ' kg';
} catch (e) {
document.getElementById('weight').innerText = 'Error';
}
}
function calibrate() {
fetch('/tare')
.then(() => { alert('Calibration successful!'); })
.catch(err => { alert('Error during calibration.'); });
}
function toggleLinksPopup(show) {
document.getElementById("linksPopup").style.display = show ? "block" : "none";
}
setInterval(updateWeight, 1000);
updateWeight();
</script>
</body>
</html>
)rawliteral";
void motorStop() {
analogWrite(MOTOR_ENA, 0);
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
}
void motorForward(int speed = 180) {
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_ENA, speed);
}
void motorReverse(int speed = 180) {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, HIGH);
analogWrite(MOTOR_ENA, speed);
}
void driveToHome() {
Serial.println("↔ Searching for home position with oscillation...");
int maxSteps = 10; // Max. 10 Fahrzyklen
int duration = 1000; // Startdauer in ms
bool forward = true;
for (int i = 1; i <= maxSteps; i++) {
Serial.print("🔁 Step ");
Serial.print(i);
Serial.println(forward ? " → Forward" : " ← Reverse");
// Starte Motor in entsprechender Richtung
if (forward) {
motorForward(180);
} else {
motorReverse(180);
}
unsigned long startTime = millis();
while (millis() - startTime < duration) {
if (digitalRead(MAGNET_SENSOR) == LOW) {
motorStop();
Serial.println("✅ Home position found!");
return;
}
delay(10);
}
// Stoppe nach Ablauf der Zeit, wenn kein Sensor ausgelöst wurde
motorStop();
delay(300); // kurze Pause vor Richtungswechsel
forward = !forward; // Richtung wechseln
duration += 1000; // Dauer um 1 Sekunde erhöhen
}
Serial.println("❌ Home position not found after full search.");
}
void safeTare() {
if (scale.is_ready()) {
scale.tare();
Serial.println("📏 Tare completed.");
lastDisplayKg = 0.0;
} else {
Serial.println("⚠ HX711 not ready for tare.");
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected! IP address: " + WiFi.localIP().toString());
server.on("/", []() { server.send(200, "text/html", MAIN_page); });
server.on("/weight", []() {
server.send(200, "text/plain", String(lastDisplayKg, 1));
});
server.on("/tare", []() {
safeTare();
server.send(200, "text/plain", "OK");
});
server.begin();
Serial.println("🌐 Webserver started.");
scale.begin(HX711_DT, HX711_SCK);
scale.set_scale(calibration_factor);
pinMode(MOTOR_ENA, OUTPUT);
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
pinMode(MAGNET_SENSOR, INPUT_PULLUP);
delay(500);
driveToHome();
delay(500);
safeTare();
tare_done = true;
startTime = millis();
}
void loop() {
server.handleClient();
if (!tare_done) return;
if (scale.is_ready()) {
float w = scale.get_units(1);
if (abs(w) < 100.0) {
w = -w;
weightBuffer[bufferIndex] = w;
bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;
if (bufferIndex == 0) bufferFull = true;
int n = bufferFull ? BUFFER_SIZE : bufferIndex;
float sum = 0;
for (int i = 0; i < n; i++) sum += weightBuffer[i];
float avg = sum / n;
float kg = max((avg * amplification) / 1000.0, 0.0);
lastDisplayKg = kg;
Serial.print("📊 Avg Weight (");
Serial.print(n);
Serial.print("): ");
Serial.print(kg, 2);
Serial.println(" kg");
// Cat detected
if (!catPresent && kg > THRESHOLD) {
catPresent = true;
leaveTime = 0;
Serial.println("😺 Cat detected!");
}
// Cat has left
if (catPresent && kg < THRESHOLD) {
if (leaveTime == 0) {
leaveTime = millis();
Serial.println("🚶 Cat left, waiting...");
} else if (millis() - leaveTime > CLEANING_DELAY) {
catPresent = false;
cleaningPending = true;
leaveTime = 0;
Serial.println("🧼 Starting cleaning...");
}
} else if (catPresent && kg > THRESHOLD) {
// Cat returned — reset leave timer
if (leaveTime != 0) {
leaveTime = 0;
Serial.println("⏱ Cat returned – cleaning timer reset.");
}
}
}
}
if (cleaningPending) {
cleaningPending = false;
Serial.println("➡ Cleaning: reverse (7s)");
motorReverse(180);
delay(7000);
motorStop();
delay(2000);
Serial.println("↩ Driving forward (9s)");
motorForward(180);
delay(9000);
motorStop();
delay(2000);
driveToHome(); // sucht Magnet-Sensor
delay(500);
safeTare();
}
}
Part 4
Mechanical Assembly Starts Here
This is where the fun begins: assembling your smart litter box.
In the following sub-chapters (Part 4.1 to 4.8), I’ll show and explain step by step how to build everything.
For each section, I’ve recorded videos so you can follow along easily.
All videos are in real time (1x speed) and completely uncut, so you can watch and build at the same time – just like we’re doing it together.
One thing to mention:
🎥 The videos aren’t super professional – I’m not a YouTuber or filming expert –
but I did my best to keep it clear and honest, so you can build this project without confusion.
And most importantly: It works!
I printed everything with 2% infill, and increased it to 10% in areas where screws go, around curves, or on visible surfaces – just because it was originally meant as a test. You can see in the videos that a lot of light shines through.
Later, I printed one part with 15% infill, and in my opinion, it turned out perfect.
Even with my light test settings, I still used about 8.5 kg of filament. So compared to the 11.3 kg you'd need for everything at 15% infill, it's not a huge difference – but the results and stability are significantly better.
You might notice that some parts look slightly different than in the videos – these are just visual improvements and don’t affect the overall construction.
During testing, I made a few cosmetic adjustments. For example, the bearing holders now have a small pause so you can insert the bearings mid-print.
All other parts are printed in one go.
Part 4.1
Rotating Unit: Assemble Parts 1 to 16
In this step, you build the rotating unit, which is the part where the cat enters and that will later rotate to clean the box.
You’ll need:
- All printed parts from 1 to 16
- 55 screws M3 x 18
- 24 screws M3 x 5
- 1 screw M3 x 10
(for the small recess on the back side near the gears) - The small rectangular inserts (printed)
Assembly:
- Carefully screw together all 16 parts of the rotating unit – just as shown in the full-length video.
- Inside the structure (where the cat enters), there are small gaps between the parts.
You insert the small rectangular pieces into those gaps to stabilize the structure.
In the video, I didn’t include those rectangles because my printer was broken at the time–
but you should definitely print and use them. No glue needed – just drop them in.
- The one M3 x 10 screw goes on the back side near the gears, into a small recessed hole. Don’t use a longer one there – it will poke out on the other side and doesn’t look clean.
Optional Tip:
If you want, you can gently melt the seams between the parts on the inside using a soldering iron.
This will make the unit more or less watertight.
However, if you always use enough litter, that’s usually not necessary, since it absorbs everything anyway
Part 4.2
Assembling the Lid
The lid consists of two parts that are simply screwed together.
You’ll need eight M3 x 14 screws for this step.
The two parts only fit together in one correct orientation, so it’s almost impossible to mess up.
Just align them properly and insert the screws into the provided holes.
There’s no glue required and nothing complicated to adjust.
It’s a super quick and easy step that takes just a few minutes.
Part 4.3
Connecting the Weight Sensors
In this step, you’ll connect the four load cells to the HX711 module.
Each sensor is mounted using four screws (M4 x 16 or similar).
Depending on the sensor model, screw size may vary –
I once had a set from Amazon that required M5 screws.
That’s why I included a screw assortment kit in the parts list – it’s super useful here.
The HX711 board is mounted with two M3 x 5 screws.
Wiring the load cells:
Each sensor has four wires. Connect them like this:
- Red → E+
- Black → E-
- Green → A+
- White → A-
Also check for a small arrow engraved on the metal body of each sensor –
it shows the force direction and must face the correct way, otherwise the readings will be wrong.
I also show that in the video.
⚠ Important:
The wires on the HX711 output side will be soldered later.
Part 4.4
Mounting Electronics on 3 Stacked Boards
In this step, you’ll mount all electronic components onto the three printed mounting plates.
These plates will later be stacked vertically inside the enclosure – not side by side.
This keeps the design compact and tidy.
Required screws:
- 10 × M3 x 10
→ For the terminal blocks and power input bracket - 2 × M3 x 5
→ For the step-down converter (e.g. LM2596) - 8 × M2 x 10
→ For the ESP32 base board and the L298N motor driver
In the video, I show exactly which board each part goes on.
You can follow my layout exactly, or rearrange it if you prefer.
The three boards are designed to stack on top of each other
This stacked structure saves space while still being easy to access for maintenance.
All you have to do in this part is screw everything down – wiring comes in the next step.
Part 4.5
Power Supply & Main Switch Wiring
In this step, we wire the entire power supply up to the Step-Down Converter.
This includes:
Connecting the 24 V power supply
Routing the main power through terminal blocks
Wiring the main ON/OFF switch
in the second video I show you how to connect and properly set the step-down converter to 5.0 V.
▶ In the video, I walk you through the setup step by step.
Part 4.6
Wiring Overview
The table below shows exactly how all components are connected.
In the videos, I walk you through every wiring step so you can follow along without making mistakes.
From | To | Description | |
---|---|---|---|
1 | Power supply 24 V + | Main ON/OFF switch (input) | Main power is controlled via switch |
2 | Switch output | Terminal block 24 V (bottom) | Feeds power to the rest of the system |
3 | Power supply GND | Terminal block GND (bottom) | Ground for entire system |
4 | Power supply 24 V + | LED in the switch | Powers the built-in LED in switch |
5 | Power supply GND | LED in the switch | Ground for switch LED |
6 | Terminal 24 V | Step-Down VIN + | Power input for step-down converter |
7 | Terminal GND | Step-Down GND | Ground for step-down converter |
8 | Step-Down OUT + | Terminal block 5 V (middle) | 5 V output for ESP32 and sensors |
9 | Terminal GND (bottom) | ESP32 GND | Ground connection |
10 | Terminal 5 V (top) | ESP32 5V | ESP32 power |
11 | HX711 DT | ESP32 GPIO 22 | Data from load cell |
12 | HX711 SCK | ESP32 GPIO 21 | Clock |
13 | HX711 VCC | 5 V | Power supply |
14 | HX711 GND | GND | Ground |
15 | L298N IN1 | ESP32 GPIO 26 | Motor direction |
16 | L298N IN2 | ESP32 GPIO 27 | Motor direction |
17 | L298N ENA | ESP32 GPIO 32 | PWM speed control |
18 | L298N VCC 24V | 24 V | Power for driver |
19 | L298N VCC 5V | 5V | Power for logic driver |
20 | L298N GND | GND | Ground for driver |
21 | OUT1 | Motor + & - | Motor drive outputs |
22 | Magnet sensor signal | ESP32 GPIO 4 | Detects home position |
23 | Magnet sensor VCC | 5 V | Power supply |
24 | Magnet sensor GND | GND | Ground |
Part 4.7
Stack the Electronics & Install Everything into the Base
In this step, we stack the three electronic boards and install the entire module into the base of the smart litter box.
You might notice in the video that one printed part has a slightly rough surface – this happened because I used too little filament at the time. But after that, I optimized everything, and all other parts were printed cleanly and smoothly.
Yes, this project does require quite a bit of filament – but keep in mind: the litter box is built to be durable, strong, and long-lasting. Compared to smart litter boxes you can buy online, this one is still much more affordable, fully repairable, and doesn’t rely on expensive electronics.
If you really want to experiment with lower infill to save filament, you can – but be aware that you might need to reprint some parts if they break or warp.
The main thing to watch out for in this step is that no wires get pinched during assembly, and that you use the correct screw lengths.
Also, don't forget: the gear that connects to the rotating part must be placed in position before closing the body. Once everything is screwed together, there’s no way to fit it in afterward.
Screw Overview
To screw the three electronics boards together, you’ll need 8 screws M3x10. These connect the stacked layers firmly and ensure that everything stays aligned.
To mount this assembled board block into the base frame, you’ll insert 4 screws M3x14 from underneath. These hold the entire electronics module securely in place.
For the final assembly of the main body, you’ll use two different types of screws as well:
First, you’ll need 6 screws M3x5, which are used to attach the two thin side walls at the sides.
Then, you’ll need approximately 53 screws M3x14 to fully secure the remaining outer parts of the body. This combination gives the structure its full strength and stability.
Video Guide
Video 1: Mounting the electronics into the frame and screwing everything up to the load cells
Video 2: Soldering the HX711 board to the four load cells, including the 100 µF capacitor
→ This capacitor is extremely important: it filters out electrical noise. Without it, your scale won’t give stable readings.
Video 3: Mounting the final parts
→ Make sure the gear is already inserted – once the body is fully assembled, it can’t be added anymore.
Part 4.8
Adding the magnets
In this step, we insert the magnets.
In the first video, I used 8×2 mm magnets – one is glued in place, and the other one simply sits on top. You might have to test what works best for you, as it can depend on your print quality.
The key is: when the cat toilet rotates, the magnet should reliably trigger the sensor.
For me, using two magnets worked perfectly.
Additionally, you’ll insert like in video two 4×2 mm magnets into the lid and the main frame to keep everything nicely in place – and that’s it!
Now all that’s left is to attach the lid and the rotating cylinder where the cat enters – and you’re done! Have fun, and I hope you like the result. If you have any feedback or suggestions, feel free to reach out. 😺
