Skip to the content
2 layers58.4 × 52.1 mmBrewery, the printed circuit board in 3D

contains firmwares and PCB layouts for my own homebrew homebrew setup. Mirror of git.8bitcloud.com/bruce/brewery (read-only; changes go to Forgejo)

Size
58.4 × 52.1 mm
Copper layers
2
Thickness
1.6 mm
Parts
34
Nets
60
Pads
213
Tracks, vias
439, 45
Pours
2
Routed
Yes
KiCad
KiCad 4
Created
26 Oct 2026
Updated
26 Oct 2026

Overview

Brewery is an open-source printed circuit board by brucejcooper, from the brucejcooper/brewery repository on GitHub. It is a 2-layer board of 58.4 × 52.1 mm with 34 parts on 60 nets, routed with 439 tracks and 45 vias.

It is built around the ESP32-WROVER, TSR 1-2433 and ULN2003A. Its parts include 17 capacitors, 4 ICs, 4 connectors, 2 switches and 1 resistor. It belongs with the ESP32 boards of this library.

Main components

3

README

README.md

Brewery control system

Monorepo of firmware and hardware for an automated HERMS brewery, built around a small fleet of networked temperature probes feeding a central heating controller — all coordinated over MQTT (with Home Assistant discovery, so the whole rig shows up in HA automatically).

Layout: stand_alone_temp_probe/ (RTD probe firmware), boil_controller/ (HERMS/boil controller firmware), brewery_common/ (shared ESP-IDF component: OTA, firmware version-check, network log tap — used by both firmwares via a component-manager path dependency), old/ (reference designs + the original KiCad schematic), tools/ (build helper), homeassistant/ (operator dashboard, brew phases and the fermenter dose controller), recipes/ (BeerXML exports), tilt_sensor/ (BLE hydrometer — nRF52840, Arduino toolchain, in progress).

text
            ┌──────────────────────┐
   HLT  ───▶│ temp probe (RTD)     │──┐
   mash ───▶│ temp probe (RTD)     │──┤   mechination/<id>/temperature
   boil ───▶│ temp probe (RTD)     │──┤      (WiFi, retained, >=1 Hz)
   …    ───▶│ temp probe (RTD)     │──┤
            └──────────────────────┘  │
                                      ▼
                             ┌─────────────────┐
                             │   MQTT broker   │  (+ Home Assistant)
                             └─────────────────┘
                                      │ subscribes to the probe temps
                                      ▼
                       ┌────────────────────────────┐
                       │  boil / HERMS controller   │  ESP32-WROVER
                       │  PID ──▶ ULN2003A ──▶ SSRs │
                       └────────────────────────────┘
                               │            │
                           HLT element   Boil-kettle
                          (heats HERMS)    element

The firmwares we host here

1. stand_alone_temp_probe/ — temperature probe

Seeed XIAO ESP32-C6 + Adafruit MAX31865 RTD amplifier. Reads a PT100/PT1000 RTD, joins WiFi, and publishes its temperature to MQTT (retained, ≥ 1 Hz) with Home Assistant discovery and RTD-fault reporting. One probe per measured point — give each a distinct device id (hlt, herms_out, boil_kettle, …) so they share the MQTT tree without colliding.

Note: the firmware is WiFi + MQTT (see main/temp_probe.h, idf_component.yml). The probe's own README.md still describes an earlier Zigbee revision and is being updated — trust the WiFi/MQTT build.

2. boil_controller/ — boil / HERMS controller

ESP32-WROVER + ULN2003A + 2× mains SSR. Subscribes to the probes' MQTT temperatures, runs a PID loop per heated vessel, and drives the SSRs with time-proportional output:

  • HERMS channel — modulates the HLT element to hold the mash temperature (wort recirculating out of the HERMS coil), with an HLT over-temp cutout.
  • Boil channel — drives the boil-kettle element to a setpoint.

The first two ULN2003A channels drive the SSRs; the other five are broken out for future use (pumps, alarm, …). It supports OTA updates over MQTT so we can iterate without touching the hardware. See boil_controller/README.md.

3. tilt_sensor/ — BLE hydrometer (in progress)

Seeed XIAO nRF52840 Sense. A homebrew Tilt clone: a sealed float in the fermenter that derives specific gravity from its inclination (LSM6DS3TR-C IMU) and BLE-broadcasts gravity plus temperature.

The odd one out in this repo — Arduino / arduino-cli, not ESP-IDF, and BLE, not WiFi/MQTT, so it does not use brewery_common. Bridging its beacon into MQTT/HA is a later job for the HA side. Right now it holds one bring-up sketch, battery_test, for validating the cell and the BQ25101 charge path. See tilt_sensor/README.md.

Temperature sensors

Each is an independent standalone probe publishing to MQTT. Planned points:

Probe device idMeasuresUsed by the controller for
hltHot Liquor TankHERMS over-temp cutout
herms_outMLT output / mash temp off the HERMS coilHERMS PID process variable
boil_kettleBoil kettleBoil PID process variable
(more)e.g. mash-in, ambientfuture channels / logging

Topic convention (shared prefix): mechination/<device_id>/temperature, with availability at mechination/<device_id>/status and a per-reading …/temperature/status that goes offline on an RTD fault (so the controller can fail-safe).

old/ — previous designs (reference only)

The earlier brewery was Bluetooth-based and is superseded by the WiFi/MQTT design above. Kept for reference:

  • old/brewery-circuit/ — the original controller schematic + PCB (Brewery.kicad_pcb, KiCad/2019): ESP32-WROVER + ULN2003A + LTC2986. This is where the boil-controller pinout came from.
  • old/ssr/ — BLE-central SSR firmware (an ESP-IDF BLE example, not the real app)
  • old/hw/SSR/ — single-channel SSR PCB (PN2222A driver + opto) — still useful HW
  • old/hw/Temp_probe/ — temp-probe PCB
  • old/temp_sensor/ — MicroPython MAX31865 driver
  • old/zephyr_temp/ — Zephyr RTOS temperature app
  • old/web/ — the old Web-Bluetooth brewery dashboard

The old boil-controller firmware was not recovered (nothing referencing the LTC2986 exists under ~/dev, and the old system was Bluetooth-based), so boil_controller/ is a clean rebuild. The hardware schematic survives in old/brewery-circuit/, and the controller pinout is taken from it:

FunctionGPIO
SSR — HERMS/HLT (ULN OUT6)GPIO26
SSR — Boil (ULN OUT7)GPIO27
Spare ULN outputs (OUT3–5)GPIO32/33/25
LTC2986 SPI (unused)MOSI 23, MISO 19, SCLK 18, CS 5, DRDY 4

⚠️ The board's first two ULN channels (DO1/DO2) land on GPIO34/35, which are input-only — they can't drive outputs. The unit as built wires the SSRs to OUT6/OUT7 (GPIO26/27); any of DO3..DO7 would do. The LTC2986 is dropped from the design (temps come over MQTT) but is held quiescent in firmware since it's still populated on the board. Details in boil_controller/README.md.

Building

Both firmwares are independent ESP-IDF projects (ESP-IDF ≥ 5.3; tested with the installed ~/esp/esp-idf). Build each from its own directory:

sh
. ~/esp/esp-idf/export.sh

# Temperature probe (XIAO ESP32-C6)
cd stand_alone_temp_probe
idf.py set-target esp32c6
idf.py menuconfig          # WiFi, MQTT, device id, RTD type/pins
idf.py -p <PORT> flash monitor

# Boil controller (ESP32-WROVER)
cd ../boil_controller
idf.py set-target esp32
idf.py menuconfig          # WiFi, MQTT, sensor topics, ULN GPIOs, PID gains
idf.py -p <PORT> flash monitor

The two boards target different chips (esp32c6 vs esp32), so keep their build trees separate (each has its own sdkconfig). A convenience script is at tools/build.sh:

sh
./tools/build.sh both        # build both
./tools/build.sh probe       # just the temp probe
./tools/build.sh boil flash  # build + flash the controller (auto-detects port)

After the controller's first USB flash, subsequent updates can go over the air — see boil_controller/README.md.

Parts

34
QtyValueFootprintReferences
70.01µFCapacitors_SMD:C_0805C4, C5, C6, C7, C8, C9, C11
40.1µFCapacitors_SMD:C_0805C2, C3, C12, C13
410µFCapacitors_SMD:C_0805C14, C15, C16, C17
110KResistors_SMD:R_0805R1
11KResistors_SMD:R_0805Rref1
11µFCapacitors_SMD:C_0805C10
122µFCapacitors_SMD:C_0805C1
1BOOTButtons_Switches_THT:SW_PUSH_6mmSW2
1ESP32-WROVERESP32-footprints-Lib:ESP32-WROVERU3
1JumperPin_Headers:Pin_Header_Straight_1x02_Pitch2.54mmJP1
1LTC2986Housings_QFP:LQFP-48_7x7mm_Pitch0.5mmU4
1RESETButtons_Switches_THT:SW_PUSH_6mmSW1
1Screw_Terminal_01x02Connectors_Terminal_Blocks:TerminalBlock_Pheonix_PT-3.5mm_2polJ1
1Screw_Terminal_01x08Connectors_Terminal_Blocks:TerminalBlock_Pheonix_PT-3.5mm_8polJ2
1Screw_Terminal_01x09Connectors_Terminal_Blocks:TerminalBlock_Pheonix_PT-3.5mm_9polJ3
1TSR_1-2433Converters_DCDC_ACDC:DCDC-Conv_TRACO_TSR-1U1
1UARTPin_Headers:Pin_Header_Straight_1x04_Pitch2.54mmJ4
1ULN2003AHousings_DIP:DIP-16_W7.62mmU2

The 30 most common of 34 parts.

More from brucejcooper/brewery

4
  • 2 layers63 × 45 mmSSR, the printed circuit board in 3D

    SSR

    brucejcooper/brewery

    contains firmwares and PCB layouts for my own homebrew homebrew setup. Mirror of git.8bitcloud.com/bruce/brewery (read-only; changes go to Forgejo)

    11 parts
  • 2 layers36.8 × 22.2 mmTemp probe, the printed circuit board in 3D

    Temp probe

    brucejcooper/brewery

    contains firmwares and PCB layouts for my own homebrew homebrew setup. Mirror of git.8bitcloud.com/bruce/brewery (read-only; changes go to Forgejo)

    8 parts
  • 2 layers9.2 × 15.5 mmPinMultiplexer, the printed circuit board in 3D

    PinMultiplexer

    brucejcooper/brewery

    contains firmwares and PCB layouts for my own homebrew homebrew setup. Mirror of git.8bitcloud.com/bruce/brewery (read-only; changes go to Forgejo)

    2 parts
  • 2 layers39 × 59.5 mmTemp probe zigbee, the printed circuit board in 3D

    Temp probe zigbee

    brucejcooper/brewery

    contains firmwares and PCB layouts for my own homebrew homebrew setup. Mirror of git.8bitcloud.com/bruce/brewery (read-only; changes go to Forgejo)

    2 parts

Similar boards

  • 2 layers33.7 × 66 mmSmartbell, the printed circuit board in 3D

    Smartbell

    Staacks/there.oughta.be

    Projects featured on my blog at https://there.oughta.be

    27 parts108GPL-3.0
  • 4 layers53.3 × 44.3 mmOcs tray mezzanine adapter v1, the printed circuit board in 3D

    Ocs tray mezzanine adapter v1

    j-marjanovic/ocs-tray-mezzanine-adapter

    PCIe adapter for an FPGA accelerator for Open CloudServer

    44 parts26
  • 2 layers25.4 × 30.5 mmRoomba, the printed circuit board in 3D

    Roomba

    kg333/roomba_esp_wifi

    Board for adding wifi using ESP-12 to Roomba 500/600 series

    16 parts16
  • 2 layers113 × 56.3 mmMP1Flight, the printed circuit board in 3D

    MP1Flight

    TangoPush/MP1Flight

    STM32MP1 based flight controller based off the Pixracer.

    72 parts5CC0-1.0
  • 2 layers273.1 × 186.1 mmIon pump controller, the printed circuit board in 3D

    Ion pump controller

    AlexW-proj/ion-pump-controller

    open source controller that takes 24V in and spits out 0 - 7000V, set by a knob with an adjustable ramp time

    63 parts2
  • 2 layers113.1 × 85 mmUniversal connector board, the printed circuit board in 3D

    Universal connector board

    HCL-Hbot/universal_connector_board

    1) Add explicit header pins next to the PICO. This can be useful to easily attach external equipment like a Logic Analyzer or TTL-module, or simply wires to a breadboard if needed.

    103 parts2
  • 4 layers115 × 75 mmRF module, the printed circuit board in 3D

    RF module

    putsolardynamics/Telemetry-Module

    146 parts2MIT
  • 2 layers101.6 × 152.4 mmShotTimer, the printed circuit board in 3D

    ShotTimer

    SnakeDoc/ShotTimer

    A Shot Timer for tracking shot times, splits and more.

    104 parts2MIT

Questions

How big is the Brewery PCB?

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

What parts does the Brewery use?

34 parts, built around the ESP32-WROVER, TSR 1-2433 and ULN2003A. 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 Brewery KiCad files?

From the brucejcooper/brewery repository on GitHub, at the commit this page was made from: the board is old/brewery-circuit/Brewery.kicad_pcb and its schematic old/hw/SSR/SSR.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Brewery design in my own project?

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