Skip to the content
4 layers135 × 101.3 mmNft hydroponic controller, the printed circuit board in 3D

Open-hardware ESP32-S3 controller for NFT hydroponics: pH/EC/level sensing, 6 relay channels, ESPHome + Home Assistant

Size
135 × 101.3 mm
Copper layers
4
Thickness
1.6 mm
Parts
107
Nets
138
Pads
412
Tracks, vias
1,166, 207
Pours
35
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
26 Sep 2026
Updated
26 Sep 2026

Overview

Nft hydroponic controller is an open-source printed circuit board by hasan-abuzaid, from the hasan-abuzaid/nft-hydroponic-controller repository on GitHub, published under the CERN-OHL-S-2.0 licence. It is a 4-layer board of 135 × 101.3 mm with 107 parts on 138 nets, routed with 1,166 tracks and 207 vias.

It is built around the CH340C, ADS1115IDGS and BME280, with the LM2596S-5.0, AMS1117-3.3 and MB85RC256VPNF-G-AMERE2 among its other parts. Its parts include 22 resistors, 15 capacitors, 14 switches, 12 connectors and 8 diodes. It belongs with the home automation and IoT boards and the ESP32 boards of this library.

Main components

11

README

README.md

NFT Hydroponic Controller — Open-Hardware PCB

Status: v1.1 boards fabricated and assembled by JLCPCB. Bring-up and on-site testing in progress.

A 4-layer, ESP32-S3 based controller board that turns a manual NFT (Nutrient Film Technique) hydroponic system into a self-regulating one. It reads pH, EC and water level from the main reservoir, switches up to six 12 V pumps (nutrient A, nutrient B, pH adjust, circulation, …) and integrates natively with Home Assistant through ESPHome.

The goal: replace the breadboards, loose jumper wires and relay modules that most DIY hydroponic builds end up with, with one board you can order pre-assembled from JLCPCB, screw your sensors and pumps into, and flash.

Assembled v1.1 board


Why this exists

NFT systems work by running a thin film of nutrient solution under the plant roots. The hard part is not the plumbing, it is keeping the solution chemistry right: pH drifts, EC drops as plants feed, and the tank level falls. Doing that by hand every day is what makes most home systems fail.

This board closes that loop:

text
 pH / EC / level sensors ──► ESP32-S3 ──► Home Assistant (automations decide dose)
          ▲                                      │
          └──── main tank ◄── dosing pumps ◄── relays ◄─┘

The ESP reports readings, Home Assistant decides how much A/B nutrient or pH-down to dose based on calibrated set-points, and the board drives the pumps.

The NFT system


Features

BlockImplementation
MCUESP32-S3-WROOM-1 (N16R8) — 16 MB flash, 8 MB PSRAM, Wi-Fi + BLE
USBUSB-C, CH340C USB-UART bridge with auto-reset/auto-boot (flash with no button presses), ESD protection on the data lines
Power input12 V DC barrel jack (DC-005, 2.0 mm)
Power conversionLM2596S-5 buck (12 V → 5 V), AMS1117-3.3 LDO (5 V → 3.3 V)
ProtectionSMAJ15A TVS on the 12 V rail, resettable polyfuse, Schottky OR-ing between USB and 12 V supply
Analog front-endADS1115 16-bit ADC for the pH and EC probe signals (far more stable than the ESP32's internal ADC)
Sensor inputspH and EC analog headers, water-temperature screw terminal, ultrasonic level header (5 V / TRIG / ECHO / GND), I²C header, GPIO breakout
EnvironmentOn-board BME280 (air temperature, humidity, pressure)
StorageMB85RC256V 32 KB I²C FRAM — stores calibration and state without flash wear
Outputs6× relay channels (JQC-3FF, SPDT) on 3-pin screw terminals (Volt IN / Leg 1 / Leg 2-GND), each with flyback diode and transistor driver
Load supply selectPer-channel switch: power the load from the board's internal 12 V, or from an external supply wired into that channel's Volt IN terminal
ButtonsBOOT and RESET
Power outputs3.3 V / 5 V / 12 V header for external modules
PCB4-layer, 1.6 mm, JLCPCB-ready (LCSC part numbers in the BOM)

Repository layout

text
.
├── nft-hydroponic-controller.kicad_pro   KiCad project (open this)
├── nft-hydroponic-controller.kicad_sch   Schematic
├── nft-hydroponic-controller.kicad_pcb   PCB layout
├── nft-hydroponic-controller.kicad_dru   Custom design rules
├── nft-hydroponic-controller.csv         Bill of materials with LCSC part numbers
├── nft-hydroponic-controller.xml         Netlist
├── DRC.rpt, ERC.rpt                      Design rule / electrical rule check reports
├── libs/lcsc/                Symbols, footprints and 3D models imported from LCSC
├── Custom_JLCPCB_Parts/      Custom parts library
├── compunents/               Additional vendor symbols/footprints
├── fp-lib-table, sym-lib-table   Project-relative library tables
├── firmware/esphome/         ESPHome config + secrets template
└── docs/images/              Photos and renders

All library paths are project-relative, so the project opens without missing symbols or footprints on a fresh machine.

3D render Schematic PCB layout


Requirements

  • KiCad 10 or newer (the files are saved in KiCad 10 format and will not open in older versions)
  • Optional: the Fabrication Toolkit plugin (KiCad Plugin & Content Manager) to export JLCPCB-ready Gerbers, BOM and pick-and-place in one click — settings are included in fabrication-toolkit-options.json

Ordering the board

  1. Open nft-hydroponic-controller.kicad_pro in KiCad.
  2. Open the PCB editor and run Fabrication Toolkit (or export Gerbers, drill files, BOM and CPL manually).
  3. Upload the generated ZIP to JLCPCB. Select 4 layers, 1.6 mm.
  4. Enable PCB Assembly and upload the BOM and CPL. The LCSC part numbers are already assigned.
  5. Through-hole parts (relays, screw terminals, barrel jack, large electrolytic) can be assembled by JLCPCB or hand-soldered.

Ready-made manufacturing files are also attached to each Release.

Using the relay channels

Each channel's terminal block is Volt IN / Leg 1 / Leg 2-GND.

  • Internal 12 V (default): leave the channel's switch in the internal position. The pump connects between Leg 1 and Leg 2-GND and runs from the board's 12 V input.
  • External voltage: wire your supply into that channel's Volt IN terminal and flip the channel's switch to external. Use this for pumps or loads that need something other than 12 V.

Pin mapping

FunctionESP32-S3 GPIO
Relay 1GPIO39
Relay 2GPIO40
Relay 3GPIO14
Relay 4GPIO13
Relay 5GPIO35
Relay 6GPIO36
I²C SDA (ADS1115, BME280, FRAM)GPIO21
I²C SCLGPIO42
Water temperatureGPIO12
Ultrasonic level (trig / echo)GPIO4 / GPIO17 (echo through a 1k/2k divider, 5 V-safe)

ADS1115 (I²C address 0x48): pH → AIN0, EC → AIN3.


Firmware

The board runs ESPHome and reports to Home Assistant over MQTT (with MQTT discovery, so entities appear automatically). The config is in firmware/esphome/nutrient-controller.yaml.

This is the configuration used during development. Check the pin assignments against the pin mapping above before flashing it to the v1.1 board.

Setup:

  1. Copy firmware/esphome/secrets.yaml.example to secrets.yaml and fill in your Wi-Fi, MQTT broker and passwords.
  2. Plug the board into your computer via USB-C (no need to press BOOT, auto-reset is on board).
  3. In Home Assistant → ESPHome Builder, create a device, paste the config, and choose Install → Plug into this computer.
  4. After the first flash, updates happen over Wi-Fi.

Calibration

pH and EC probes drift and vary between units, so set-points must be calibrated per probe:

  • pH: two-point calibration with pH 4.0 and pH 7.0 buffer solutions.
  • EC: calibrate with a known reference solution (e.g. 1413 µS/cm).
  • Dosing: dose a small, measured volume, wait for the tank to mix, and record the change in pH/EC. This gives the "dose per unit change" used by the automations.

Safety

  • The relays are rated for mains voltage, but this board is designed for 12 V DC loads only. Do not switch mains through it unless you understand creepage/clearance requirements and have an enclosure rated for it.
  • Water and electronics: mount the board above the reservoir, in an enclosure, with drip loops on every cable.
  • Keep the pH-down acid and nutrient concentrates away from the electronics.

Project status

Revisionv1.1
BoardsFabricated and assembled (JLCPCB)
TestedNot yet — bring-up results will be posted here
Known issuesRelays 5 and 6 use GPIO35/36. On the N16R8 module these pins are wired to the octal PSRAM. Leave PSRAM disabled in firmware and verify both channels during bring-up; fix planned for the next revision.

Contributing

Issues and pull requests are welcome, especially: tested pin mappings for other sensor probes, enclosure designs, and Home Assistant automation improvements. If you build one, open an issue with a photo.


Credits

Designed by Hasan Abuzaid — Mechatronics Engineering, German Jordanian University. Developed during an IoT/embedded internship at Nexus Nature.

License

Hardware: CERN-OHL-S-2.0. Firmware and configuration files: MIT.

Parts

107
QtyValueFootprintReferences
8S8050Package_TO_SOT_SMD:SOT-23Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8
61N4148Diode_SMD:D_SOD-123D2, D3, D5, D6, D7, D8
6750ΩResistor_SMD:R_0805_2012MetricR3, R6, R10, R13, R18, R19
6JQC-3FF-012-1ZRelay_THT:Relay_SPDT_Hongfa_JQC-3FF_0XX-1ZK2, K3, K4, K5, K6, K7
6SW_SPSTlcsc_footprints:C515802_SW-SMD_NSI-10SSW4, SW5, SW6, SW7, SW8, SW9
6Screw_Terminal_01x03TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3-5.08_1x03_P5.08mm_HorizontalJ4, J5, J6, J7, J8, J9
5100nfCapacitor_SMD:C_0805_2012MetricC13, C14, C15, C18, C26
410kResistor_SMD:R_0805_2012MetricR33, R38, R47, R49
410kΩResistor_SMD:R_0805_2012MetricR4, R7, R14, R15
4MountingHoleMountingHole:MountingHole_3.2mm_M3_ISO7380H1, H2, H3, H4
4MountingHole_PadMountingHole:MountingHole_3.2mm_M3_Pad_ViaH5, H6, H7, H8
34.7kΩResistor_SMD:R_0805_2012MetricR11, R12, R16
3Conn_01x03Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalEC-sensor1, PH-sensor1, vout1
2100nFCapacitor_SMD:C_0805_2012MetricC8, C9
25k1Resistor_SMD:R_0805_2012MetricR36, R37
2B3U-1000PB3U-1000P:SW_B3U-1000PS1, S3
2PGB1010603MRHFPGB1010603:FUSE_PGB10106_LTFF1, F2
2SK34A-LTPSK34A-LTP:SMADO-214AC_MCCCR1, CR2
11000ufCapacitor_SMD:CP_Elec_10x10.5C21
1100uF 35vCapacitor_SMD:CP_Elec_6.3x7.7C12
110uFCapacitor_SMD:C_0805_2012MetricC6
110ufCapacitor_SMD:C_0805_2012MetricC16
11N5822Diode_SMD:D_SMCD4
11kΩResistor_SMD:R_0805_2012MetricR1
11nf 2kvCapacitor_SMD:C_1206_3216MetricC11
122Resistor_SMD:R_0805_2012MetricR35
12200uFCapacitor_THT:CP_Radial_D12.5mm_P5.00mmC10
1220uFCapacitor_SMD:C_Elec_5x5.4C5
122uF 10vCapacitor_SMD:CP_Elec_5x5.4C17
12kΩResistor_SMD:R_0805_2012MetricR2
133uHInductor_SMD:L_12x12mm_H6mmL1
1ADS1115IDGSPackage_SO:TSSOP-10_3x3mm_P0.5mmU5
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U3
1BME280Package_LGA:Bosch_LGA-8_2.5x2.5mm_P0.65mm_ClockwisePinNumberingU6
1CH340CPackage_SO:SOIC-16_3.9x9.9mm_P1.27mmU4
1Conn_01x02Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ2
1Conn_01x04Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_VerticalConn_01x04
1Conn_01x04Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ13
1Conn_01x06Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_VerticalJ10
1Conn_01x15Connector_PinHeader_2.54mm:PinHeader_1x15_P2.54mm_VerticalJ3
1DC-005 2.0mmlcsc_footprints:C84007_DC-IN-TH_DC-005C-20AJ11
1ESP32-S3-WROOM-1(N16R8)lcsc_footprints:C2913202_WIRELM-SMD_ESP32-S3-WROOM-1U8
1LM2596S-5Package_TO_SOT_SMD:TO-263-5_TabPin3U1
1LOGOLOGOG***
1MB85RC256VPNF-G-AMERE2lcsc_footprints:C45273903_SOP-8_L4_9-W3_9-P1_27-LS6_0-BLU7
1PolyfuseFuse:Fuse_2920_7451Metric_Pad2.10x5.45mm_HandSolderF3
1SMAJ15ADiode_SMD:D_SMAD9
1Screw_Terminal_01x03lcsc_footprints:C474921_CONN-TH_3P-P2_54_KF128-2_54-3Ptemp1
1SolderJumper_3_Bridged12Jumper:SolderJumper-3_P1.3mm_Bridged12_Pad1.0x1.5mmJP11
1USB_C_Receptacle_USB2.0_16PUSB_TYPE_C_standing:USB_C_StandingJ1

Similar boards

  • 4 layers152.5 × 161.6 mmMB PCB ControladorESP32, the printed circuit board in 3D

    MB PCB ControladorESP32

    Miguel-Barcelos/Electronics-Projects

    Este repositório contém projetos de eletrônica, incluindo circuitos eletrônicos, simulações e design de PCBs.

    203 parts
  • 4 layers113.4 × 73 mmSUB-00156 REV00, the printed circuit board in 3D

    SUB-00156 REV00

    bcdevices/example-projects

    PCBA files to test with

    153 parts
  • 2 layers52.8 × 71.8 mmESPBoosted, the printed circuit board in 3D

    ESPBoosted

    schoolllex/ESPBoosted

    A custom, feature-rich ESP32-WROOM-32 development board featuring built-in environmental sensors, power management, and expansion interfaces.

    51 parts
  • 4 layers89 × 58 mmHALMET, the printed circuit board in 3D

    HALMET

    hatlabs/HALMET-hardware

    Hat Labs Marine Engine & Tank interface hardware design files

    227 parts8CC-BY-4.0
  • 4 layers241.3 × 180.3 mmHALSPA, the printed circuit board in 3D

    HALSPA

    hatlabs/HALSPA-hardware

    HALSPA - Hat Labs Spaghetti Board: PCB Design Files

    10,275 parts
  • 4 layers82 × 35 mmESP32CAM, the printed circuit board in 3D

    ESP32CAM

    uawortu/BREAN

    custom esp32cam+oled

    91 parts2
  • 4 layers90.5 × 67 mmAS 4, the printed circuit board in 3D

    AS 4

    beaked99/air-scales

    2025-11-20. Updated all the footprints and symbols to their proper layouts. no more fkn errors. Hallefuckinglujah. Fucked up with LM74610 not using the right footprint. minor fix. 2025-11-16.

    131 parts
  • 2 layers61.3 × 63.3 mmMonitoring Gunung, the printed circuit board in 3D

    Monitoring Gunung

    rafdi03/PCB_Desain

    Schematic PCB Project

    50 parts

Questions

How big is the Nft hydroponic controller PCB?

It measures 135 × 101.3 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Nft hydroponic controller use?

107 parts, built around the CH340C, ADS1115IDGS, BME280 and LM2596S-5.0. 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 Nft hydroponic controller KiCad files?

From the hasan-abuzaid/nft-hydroponic-controller repository on GitHub, at the commit this page was made from: the board is nft-hydroponic-controller.kicad_pcb and its schematic nft-hydroponic-controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Nft hydroponic controller design in my own project?

Its repository publishes it under the CERN-OHL-S-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).