
Hydroponics tray controller
bookofthefuture/hydroponics-pcb
KiCad PCB designs for the two-tier IKEA hydroponics monitoring/control system

KiCad PCB designs for the two-tier IKEA hydroponics monitoring/control system
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.
KiCad PCB designs for the hydroponics monitoring/control system on a two-tier IKEA growing rack.
| Board | Status | MCU | Purpose |
|---|---|---|---|
tray-board | fab-ready: ERC/DRC/schematic-parity clean, routed with GND pours + stitching, full JLC BOM (all Basic parts) / CPL / gerbers generated | socketed ESP32 30-pin DevKit | Per-tray sensor + display node. One per tray (top / bottom). |
reservoir-board | not started | ESP32 (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).
| Function | Part | Bus | Notes |
|---|---|---|---|
| ToF distance (water level) | VL53L0X / VL53L1X | I²C 3.3 V | Shared SDA/SCL |
| Air pressure (+ humidity/temp on BME) | BMP280 / BME280 | I²C 3.3 V | Shared SDA/SCL |
| Lux level | BH1750 | I²C 3.3 V | Shared SDA/SCL |
| Water temperature | DS18B20 | 1-Wire 3.3 V | Dedicated GPIO, 4.7 kΩ pull-up |
| User input | Rotary encoder + push switch | GPIO / quadrature | 3.3 V |
| Display | 2.4" ILI9341 240×320, resistive touch (XPT2046) + SD card | SPI (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.
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.
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.
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, datasheetsRequires KiCad 10.x (kicad-cli) plus the standard symbol/footprint libraries.
tools/fab.sh tray-boardruns 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:
tools/check_pins.py path/to/board.kicad_sch| Qty | Value | Footprint | References |
|---|---|---|---|
| 11 | 10k | Resistor_SMD:R_0805_2012Metric | R3, R7, R9, R11, R13, R15, R17, R19, R21, R28, R30 |
| 9 | 100 | Resistor_SMD:R_0805_2012Metric | R6, R8, R10, R12, R14, R16, R18, R20, R26 |
| 8 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 |
| 8 | SS14 | Diode_SMD:D_SMA | D3, D4, D5, D6, D7, D8, D9, D10 |
| 6 | Screw_Terminal_01x02 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_Horizontal | CH1, CH2, CH3, CH4, CH5, CH6 |
| 4 | 1k | Resistor_SMD:R_0805_2012Metric | R4, R27, R29, R31 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3_Pad | H1, H2, H3, H4 |
| 3 | 100nF | Capacitor_SMD:C_0805_2012Metric | C5, C6, C7 |
| 3 | 4.7k | Resistor_SMD:R_0805_2012Metric | R22, R23, R24 |
| 2 | 22uF | Capacitor_SMD:C_1206_3216Metric | C8, C9 |
| 2 | Conn_01x04_Socket | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | Level Sensor, Trays |
| 2 | Screw_Terminal_01x03 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-3-3.5-H_1x03_P3.50mm_Horizontal | CH7, CH8 |
| 1 | 100k | Resistor_SMD:R_0805_2012Metric | R1 |
| 1 | 100nf | Capacitor_SMD:C_1206_3216Metric | C4 |
| 1 | 100uF | Capacitor_SMD:CP_Elec_6.3x7.7 | C2 |
| 1 | 10uF | Capacitor_SMD:C_1206_3216Metric | C1 |
| 1 | 120 | Resistor_SMD:R_0805_2012Metric | R5 |
| 1 | 1Wire_Peripherals | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | 1Wire |
| 1 | 22uF | Capacitor_Tantalum_SMD:CP_EIA-3528-21_Kemet-B | C3 |
| 1 | 2k | Resistor_SMD:R_0805_2012Metric | R25 |
| 1 | 4.7uH | Inductor_SMD:L_Bourns_SRP6060FA | L1 |
| 1 | 75k | Resistor_SMD:R_0805_2012Metric | R2 |
| 1 | AMS1117-3.3 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U3 |
| 1 | D_Schottky | Diode_SMD:D_SMA | D1 |
| 1 | ESP32 | Library:ESP32_DevKit_30Pin | U1 |
| 1 | Fuse | Fuse:Fuse_2920_7451Metric | F1 |
| 1 | Jumper | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J1 |
| 1 | LED | LED_SMD:LED_0805_2012Metric | D2 |
| 1 | SP3485EN | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U2 |
| 1 | Screw_Terminal_01x02 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-5.0-H_1x02_P5.00mm_Horizontal | POW1 |
| 1 | TPS54302 | Package_TO_SOT_SMD:SOT-23-6 | U4 |
| 1 | i2c_Peripherals | Connector_JST:JST_XH_B6B-XH-A_1x06_P2.50mm_Vertical | i2c Peripherals |

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

Fluepke/Fluepdot
Project for controlling Annax flipdot panels used by the Berliner Verkehrsbetriebe

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





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.

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.
It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask bookofthefuture before reusing the design.