Skip to the content
2 layers100 × 100 mmHydroponics reservoir controller, the printed circuit board in 3D

Hydroponics reservoir controller

bookofthefuture/hydroponics-pcb

KiCad PCB designs for the two-tier IKEA hydroponics monitoring/control system

Size
100 × 100 mm
Copper layers
2
Thickness
1.6 mm
Parts
82
Nets
61
Pads
219
Tracks, vias
606, 111
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
28 Aug 2026
Updated
1 Oct 2026

Overview

Hydroponics reservoir controller is an open-source printed circuit board by bookofthefuture, from the bookofthefuture/hydroponics-pcb repository on GitHub. It is a 2-layer board of 100 × 100 mm with 82 parts on 61 nets, routed with 606 tracks and 111 vias.

It is built around the AMS1117-3.3, SP3485EN-Y and TPS54302, with the AO3400A and SS14 among its other parts. Its parts include 31 resistors, 10 diodes, 9 capacitors, 8 transistors and 4 ICs. It belongs with the ESP32 boards of this library.

Main components

5

README

README.md

hydroponics-pcb

KiCad PCB designs for the hydroponics monitoring/control system on a two-tier IKEA growing rack.

Boards

BoardStatusMCUPurpose
tray-boardfab-ready: ERC/DRC/schematic-parity clean, routed with GND pours + stitching, full JLC BOM (all Basic parts) / CPL / gerbers generatedsocketed ESP32 30-pin DevKitPer-tray sensor + display node. One per tray (top / bottom).
reservoir-boardnot startedESP32 (TBD)Reservoir-side control: fill pumps, A/B + pH dosing pumps, level/EC/pH/temp sensing.

Grow-lamp switching currently stays on the original ESP8266 hydroponics_monitor node and is out of scope for these boards (may move to the reservoir board later).

Tray board peripherals

FunctionPartBusNotes
ToF distance (water level)VL53L0X / VL53L1XI²C 3.3 VShared SDA/SCL
Air pressure (+ humidity/temp on BME)BMP280 / BME280I²C 3.3 VShared SDA/SCL
Lux levelBH1750I²C 3.3 VShared SDA/SCL
Water temperatureDS18B201-Wire 3.3 VDedicated GPIO, 4.7 kΩ pull-up
User inputRotary encoder + push switchGPIO / quadrature3.3 V
Display2.4" ILI9341 240×320, resistive touch (XPT2046) + SD cardSPI (shared bus, separate CS lines)LVGL, encoder-driven UI; SD card wired but not yet used by firmware

Display connector (J2, 14-pin) pinout: VCC, GND, CS(D5), RESET(D4), DC(D2), MOSI(D23), SCK(D18), LED(D15), MISO(D34), T_CLK(D18, shared), T_CS(D14), T_DIN(D23, shared), T_DO(D34, shared), T_IRQ(D35). SD card connector (J3, 4-pin, separate from J2): CS(D19), MOSI(D23, shared), MISO(D34, shared), SCK(D18, shared). New GPIOs used: 14, 19, 34, 35 — none of these were previously assigned, so add them to the ESPHome configs without touching the existing pin numbers.

No high-power switching on the tray board. An SP3485EN RS-485 transceiver (120 Ω termination, direction pin on GPIO12) links the two tray boards to the reservoir board.

Comms

All three ESPs talk to Home Assistant over WiFi (ESPHome native API). The tray boards also talk to the reservoir board over RS-485 — a local wired link so fill-level reads and pump control don't depend on WiFi/HA. The reservoir is the controlling node.

Firmware

ESPHome configs live in the separate ha-config repo under esphome/ (hydro-tray-top.yaml, hydro-tray-bottom.yaml). The pin map is shared between the schematic here and those configs — keep them in sync.

Repo layout

text
tray-board/        KiCad project for the tray sensor board
reservoir-board/   (future) KiCad project for the reservoir board
shared-library/    custom symbol (New_Library) + footprint (Library.pretty)
                   library, referenced by both boards' sym-lib-table/
                   fp-lib-table via ${KIPRJMOD}/../../shared-library/ - keep
                   custom parts (ESP32 DevKit socket, display modules, etc.)
                   here rather than per-board copies, which drift silently
docs/              pin maps, block diagrams, datasheets

Working with KiCad from the CLI

Requires KiCad 10.x (kicad-cli) plus the standard symbol/footprint libraries.

text
tools/fab.sh tray-board

runs ERC + DRC (fails on any error/warning) and writes a JLCPCB-ready set to tray-board/production/ (git-ignored — regenerated from source): gerbers (Protel extensions) + separate PTH/NPTH Excellon drill files, zipped as <name>-gerbers.zip; <name>-cpl.csv (SMD-only pick-and-place, DNP parts excluded); <name>-bom.csv (DNP excluded, LCSC Part # column from each part's LCSC schematic field). Parts you're sourcing/fitting yourself (e.g. the socketed ESP32 module) should be marked Do Not Populate in the schematic so they're left out of both the BOM and the CPL automatically.

It also runs tools/check_pins.py, which checks the MCU's pin usage for hardware hazards ERC doesn't catch — currently ESP32 strapping pins (GPIO0, 2, 5, 12, 15) with an external pull that conflicts with their required boot-time level, GPIO6-11 (internal flash, must never be used externally), and UART0 (GPIO1/3, reserved for USB-serial). Fails the build on any ERROR-severity finding; can also be run standalone:

text
tools/check_pins.py path/to/board.kicad_sch

Parts

82
QtyValueFootprintReferences
1110kResistor_SMD:R_0805_2012MetricR3, R7, R9, R11, R13, R15, R17, R19, R21, R28, R30
9100Resistor_SMD:R_0805_2012MetricR6, R8, R10, R12, R14, R16, R18, R20, R26
8AO3400APackage_TO_SOT_SMD:SOT-23Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8
8SS14Diode_SMD:D_SMAD3, D4, D5, D6, D7, D8, D9, D10
6Screw_Terminal_01x02TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_HorizontalCH1, CH2, CH3, CH4, CH5, CH6
41kResistor_SMD:R_0805_2012MetricR4, R27, R29, R31
4MountingHoleMountingHole:MountingHole_3.2mm_M3_PadH1, H2, H3, H4
3100nFCapacitor_SMD:C_0805_2012MetricC5, C6, C7
34.7kResistor_SMD:R_0805_2012MetricR22, R23, R24
222uFCapacitor_SMD:C_1206_3216MetricC8, C9
2Conn_01x04_SocketConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalLevel Sensor, Trays
2Screw_Terminal_01x03TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-3-3.5-H_1x03_P3.50mm_HorizontalCH7, CH8
1100kResistor_SMD:R_0805_2012MetricR1
1100nfCapacitor_SMD:C_1206_3216MetricC4
1100uFCapacitor_SMD:CP_Elec_6.3x7.7C2
110uFCapacitor_SMD:C_1206_3216MetricC1
1120Resistor_SMD:R_0805_2012MetricR5
11Wire_PeripheralsConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical1Wire
122uFCapacitor_Tantalum_SMD:CP_EIA-3528-21_Kemet-BC3
12kResistor_SMD:R_0805_2012MetricR25
14.7uHInductor_SMD:L_Bourns_SRP6060FAL1
175kResistor_SMD:R_0805_2012MetricR2
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U3
1D_SchottkyDiode_SMD:D_SMAD1
1ESP32Library:ESP32_DevKit_30PinU1
1FuseFuse:Fuse_2920_7451MetricF1
1JumperConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ1
1LEDLED_SMD:LED_0805_2012MetricD2
1SP3485ENPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU2
1Screw_Terminal_01x02TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-5.0-H_1x02_P5.00mm_HorizontalPOW1
1TPS54302Package_TO_SOT_SMD:SOT-23-6U4
1i2c_PeripheralsConnector_JST:JST_XH_B6B-XH-A_1x06_P2.50mm_Verticali2c Peripherals

More from bookofthefuture/hydroponics-pcb

1
  • 2 layers99.5 × 99.5 mmHydroponics tray controller, the printed circuit board in 3D

    Hydroponics tray controller

    bookofthefuture/hydroponics-pcb

    KiCad PCB designs for the two-tier IKEA hydroponics monitoring/control system

    23 parts

Similar boards

  • 2 layers70 × 65 mmFluepdot, the printed circuit board in 3D

    Fluepdot

    Fluepke/Fluepdot

    Project for controlling Annax flipdot panels used by the Berliner Verkehrsbetriebe

    116 parts17AGPL-3.0
  • 2 layers100 × 100 mmV2 Estacion Nviel, the printed circuit board in 3D

    V2 Estacion Nviel

    HecVelaz/Proyecto-Mburica-

    Repositorio central del Proyecto Mburicao: Sistema IoT de monitoreo de nivel de cauces, modelos de predicción con IA y documentación científica

    62 parts3MIT
  • 2 layers87 × 72 mmEasyprb, the printed circuit board in 3D

    Easyprb

    KrogeChen/easyprintf

    easy printf debug box for small mcu

    104 partsGPL-3.0
  • 2 layers60 × 65 mmLED driver2, the printed circuit board in 3D

    LED driver2

    xtompok/LED_driver

    3x5A PWM driver for LED strips

    98 partsMIT
  • 2 layers200 × 200 mmSignalFLowLab, the printed circuit board in 3D

    SignalFLowLab

    Serpant4632/SignalFLowLab

    130 parts
  • 2 layers100 × 100 mmFertilizer Pump, the printed circuit board in 3D

    Fertilizer Pump

    Handkep/Fertilizer-Pump

    The fertilizer dispenser automatically doses fertilizer concentrates or stock solutions using one or more peristaltic pumps. The amount dispensed depends on the selected recipe and the intended irrigation water volume.

    102 parts
  • 4 layers130 × 100 mmAtlas carrier ctrl, the printed circuit board in 3D

    Atlas carrier ctrl

    md-sazzad-eee/ATLAS

    Modular multi-robot system: a carrier robot that docks, transports, charges and redeploys two small agent robots. KiCad, FreeCAD, MATLAB/Simulink, COMSOL and ESP32 firmware.

    157 parts

Questions

How big is the Hydroponics reservoir controller PCB?

It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Hydroponics reservoir controller use?

82 parts, built around the AMS1117-3.3, SP3485EN-Y, TPS54302 and AO3400A. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Hydroponics reservoir controller KiCad files?

From the bookofthefuture/hydroponics-pcb repository on GitHub, at the commit this page was made from: the board is reservoir-board/hydroponics_reservoir_controller/hydroponics_reservoir_controller.kicad_pcb and its schematic reservoir-board/hydroponics_reservoir_controller/hydroponics_reservoir_controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Hydroponics reservoir controller design in my own project?

Its repository states no licence, so its author keeps all rights: ask bookofthefuture before reusing the design.