Lou the Toilet indicator!

Bathroom occupancy detector & indicator using Adafruit IO and a cute lil' toilet…

Similar projects worth following
Cute as a button, this lil' internet-connected, miniature toilet model sits on my desk and lets me know when the house's only bathroom is free. Equipped with a servo, a NeoPixel, and a ESP32 breakout board, Lou the Toilet glows different colours and raises and lowers its lid to indicate if the bathroom is occupied.

Powered by Arduino and using Adafruit's IO service (, Lou uses a separate internet-connected microcontroller, a magnetic door switch, and a light sensor to determine whether the bathroom is free and clear!

The Problem

Locked down in a house with 5 adults and only 1 bathroom, the long walk across the house only to find that the bathroom was occupied was getting tiresome. We needed a way to see whether the bathroom was free without having to leave our suddenly very utilised home office. 

The Project

Lou the Toilet is a 3D printed miniature toilet that uses a microcontroller (a spare Trinket Pro 5V I had laying around), a NeoPixel, and a miniature servo (an old one from RadioShack… remember RadioShack?). Lou indicates the status of the bathroom with a lifting and closing of its lid, a coloured glow, and a stop sign that hangs from the underside of the lid.

An ESP32 breakout board (Adafruit AirLift – ESP32 WiFi Co-Processor) does the hard work and connects Lou to the internet and the Adafruit IO service to get updates about the bathroom's availability.

Just provide Lou with 5v and it's good to go, merrily opening and closing its lid all day!

The Bathroom Occupancy Detector covers the bathroom side, and is made up of an ItsyBitsy M0 with an ESP32 add-on (Airlift Bitsy), a magnetic door switch I've had forever, and a light sensor that came out of an old project. Together they monitor the state of the door (open or closed) and the bathroom light (off or on) to determine whether the bathroom is free. 

The bathroom status can be viewed anywhere from the house, using Lou or a private Adafruit IO dashboard.

Web page from Adafruit IO that displays the bathroom status. Here having the bathroom light off and the open door indicates that the bathroom is free, which the page shows with a green indicator and the text "Free!".

The Code

The code for Lou and the Occupancy Detector are pretty straight forward. Both use Arduino IDE and the Arduino Adafruit IO library. Since Lou only monitors one feed from the IO service, it can get away with something like a 32u4 microcontroller and still have enough program storage space. The Occupancy Detector has a bigger job, updating multiple feeds and ideally needs something with more flash memory (in this case a ATSAMD21 Cortex M0 processor).

Code can be view over on the Lou the Toilet GitHub page.

3D Modelling & Printing

Lou is based on a GrabCad toilet model by Jari Ikonen. I edited the design to fit the electronics and house the stop sign when the lid is closed.

Other parts, including the stop sign and case for the Occupancy Detector were designed by me.

You'll find some STLs and .3mf files in the file section. The majority of the parts were printed with the following settings on a Prusa i3 Mk2.5S:

Layer Height:0.2 mm
Infill:15% Gyroid
Supports:Support enforcer only used in the main Lou body,
and only for the area that holds the servo

The majority of the parts were printed at the same time and should take just over 4 hours to print for ~ 50 g of filament.

The stop sign was printed in silver and red, with a colour change to really make the text pop.


Added a new version of Lou, with a gap in the back to help with wire routing.
I've also added two .3mf files with all the parts and settings pre-loaded.

Background & Decoration  

I couldn't help but make a little bathroom diorama for Lou to sit in. It's made out of cardboard, paper, an old wash cloth, and some carefully rolled up tissue to make toilet roll. 

At one point Lou had more toilet paper in the bathroom than I did. 

Future Improvements

  • The original Lou uses an old Adafruit Trinket Pro 5v as a microcontroller (mostly because I had a few collecting dust!). I've since updated the project to use an ItsyBitsy 32u4 - 5V, since it has USB serial and native USB. 
  • I also used an old RadioShack servo I've had forever. The new CAD and print files now fit a more commonly sourced servo. 

  • I 3D printed Lou using some grey-silver filament I had. Using white filament would eliminate the need to paint it.

I've finally... Read more »


Print files and settings for Lou's main body, cistern lid, and seat lid.

- 488.71 kB - 07/23/2020 at 20:14



Print files and settings for the stop sign.

3mf - 50.47 kB - 07/23/2020 at 20:14



V2 — 3D print file for the main Lou body. Now includes a slit in the back to make wire routing easier.

- 1.59 MB - 07/23/2020 at 16:34



3D print file for the seat lid that lifts up and down.

- 241.78 kB - 06/30/2020 at 22:11



3D print file for the lid that covers the cistern (that holds the AirLift breakout board and reset button).

Standard Tesselated Geometry - 171.47 kB - 06/30/2020 at 22:11


View all 7 files

View all 7 components

  • 1
    Before we begin…

    We'll be creating the Lou portion of the project. If anyone is interested in building the occupancy detector (using the magnetic door switch and light sensor) let me know!

    A few more parts:

    All the major components are listed in the component section, however we'll need a few more parts:

    • Acrylic paint (optional).
    • Mod Podge/PVA glue (optional).
    • 30 AWG silicone wire (ideally various colours).
    • 2 tiny screws (2-3 mm long, 1.3 mm 7/128ths thread?).
    • M2 bolt (10 mm long) and nut.
    • Medium sized paperclip (1 - 1.25 mm thick).
    • The wire legs off of a resistor/capacitor/LED.


    These tools would also be helpful:

    • Wire strippers.
    • Flush wire cutters.
    • Soldering iron.
    • Tweezers.
    • Pair of needle-nosed pliers.
    • Screw driver/hex driver.
    • Access to a 3D printer.

    The plan:

    Lou is 40 mm wide, 75 mm long, and 80 mm tall (1.6 x 3 x 3.25 in). 

    The cistern will contain the AirLift breakout board and a momentary tactile switch that pokes out of the top of the cistern lid, like the button for a toilet flush. This switch will act as the reset button for the microcontroller.

    Speaking of micronctroller, the ItsyBitsy 32u4 5v board will rest on the bottom, under the cistern with the USB connector facing out of the back.

    The NeoPixel will sit inside a specially sized inset within the toilet bowl. The servo has a space above the microcontroller, where the servo can rest on its side, it's arm poking out. It'll be fixed to the toilet via a single M2 nut and bolt.

    The seat lid will attach to the toilet body via a straightened paperclip, while the stop sign will hang with the wire from a resistor/led/capacitor. 

    Screenshot of the CAD model of the toilet, complete with seat lid and stop sign in their upright positions. The toilet has been made slightly transparent to show the components within. Labels along the side point out the locations of the reset switch, the airlift board, the ItsyBitsy 32u4 microcontroller, the neopixel, and the micro servo.

    OKAY… let's make a miniature toilet!

  • 2
    Print parts using a FFM 3D printer.

    Lou is made up of several 3D printable parts, including the seat lid, cistern lid, and stop sign… so let's print all the parts!

    You'll find 3D printable files in the file section and on the Lou GitHub page. There are also two .3mf files that will load all of parts using the settings I used. 

    You can use whatever colour you like (I chose silver because that was the lightest shade of filament I had. White would probably look very nice and would allow you to skip step 2).

    Screenshot of Lou's 3D printable parts loaded into slicer software, with different colours highlighting the different layer features.

    I printed everything together (except for the stop sign) using the following print settings on a Prusa i3 Mk2.5S:

    Layer Height:0.2 mm
    Infill:15% Gyroid
    Supports:Support enforcer only used in the main Lou body, and only for the area that holds the servo

    Depending on your 3D printer and the settings you use, you should expect all of the parts to take just over 4 hours to print for about 50 g of filament. 

    Stop Sign:

    The stop sign was designed to be printed in two colours (although you can print it using just one). For a sign that really pops, start with a red filament and add a colour change right before the text layer starts. Changing to a white or silver filament colour really helps to highlight the text (plus it'll make it look like a stop sign!).

    Screenshot of the stop sign part loaded into slicer software. A colour change setting has been used, with the slicer showing the background layers using a red filament, and the upper layers (with the text and border) using a silver filament.
  • 3
    Clean & Paint parts (optional).

    Clean up prints:

    Carefully remove supports and clean up the 3D printed parts. Pay close attention to the holes for the seat lid, using a needle or very fine drill bit to make sure the holes are open and will be able to accept the wire we'll be using later on. 

    Paint parts:

    If you're like me and started with a filament colour that's not the final colour you want, then you'll have to paint your freshly printed parts.

    I painted Lou, the cistern lid, and the seat lid using white acrylic. Several coats with some light sanding between coats is all that's needed. I found that painting the inside of the toilet bowl and the underside of the toilet seat white helped to reflect the glow of the NeoPixel. 

    Photo showing me mid-way through painting the grey Lou the Toilet part white using acrylic paint.

    Extra fancy:

    One dry, use some Mod Podge/PVA glue to seal the paint and add some extra gloss. This should make Lou gleam like the porcelain throne it wants to be!

View all 15 instructions

Enjoy this project?



tlcom913 wrote 11/25/2022 at 11:03 point

All toilets look the same, but when it comes to performance, there are significant differences between all of them. All toilets are not made for the same purpose, that’s why you need to select the right one for your needs. For instance, the best strong flushing toilets are specially created to flush away large waste and prevent clogging issues.

  Are you sure? yes | no

lindajons536 wrote 09/05/2022 at 15:10 point

this is really amazing project. i am also working on a toilet adviser  site . i just want to share this on my site . 

  Are you sure? yes | no

jimimelboe wrote 12/08/2020 at 00:06 point

I really like this project of toilet indicator. Can I embed it on my blog of bathroom products reviews, see the detail here

  Are you sure? yes | no

Dan Maloney wrote 04/09/2020 at 16:56 point

Lou, lol

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates