Assembly Guide — Dev Platform

Step-by-step build guide for the Plant Caravan dev platform.

Prerequisites

  • All components from bom.md
  • USB-C cable
  • Computer with ESPHome CLI or dashboard
  • Soldering iron (optional — only needed for custom cable lengths)

If you are printing your own enclosure

Before assembly, download and print the three enclosure parts listed in /docs/open-source-hardware-print-files:

  • enclosure_base.stl
  • sensor_mount_lid.stl
  • sensor_retainer_frame.stl

Step 1: Seat the ESP32 Supermini

  1. Orient the carrier board with the battery/power connector at the bottom
  2. Align the ESP32-C3 Supermini male header pins with the green female socket in the center
  3. Press firmly until fully seated — USB-C port faces the top of the carrier

Verify: USB-C port accessible at top. Onboard blue LED (GPIO8) visible through the socket.

Step 2: Connect I2C Sensors

ESP32-C3 only supports 1 hardware I2C bus. All I2C sensors must share GPIO4 (SDA) and GPIO5 (SCL). Use a DIY dupont Y-splitter cable to connect multiple sensors in parallel.

I2C Y-Splitter Cable

Make a 4-wire splitter cable using dupont connectors. Each line (SDA, SCL, VCC, GND) splits from one carrier pin to multiple sensor pins.

                         ┌──► SCD41 SDA
  Carrier pin 4 (SDA) ───┼──► BH1750 SDA
                         └──► [future sensor]

                         ┌──► SCD41 SCL
  Carrier pin 5 (SCL) ───┼──► BH1750 SCL
                         └──► [future sensor]

                         ┌──► SCD41 VDD
  Carrier 3.3V (red) ────┼──► BH1750 VCC
                         └──► [future sensor]

                         ┌──► SCD41 GND
  Carrier GND (black) ───┼──► BH1750 GND
                         └──► [future sensor]

I2C Wiring Table

WireFrom (Carrier)To (Sensors)Function
SDALeft signal pin 4All sensor SDA pinsI2C data (GPIO4)
SCLRight signal pin 5All sensor SCL pinsI2C clock (GPIO5)
VCCPower rail 3.3V (red wire)All sensor VCC/VDD pins3.3V power
GNDPower rail GND (black wire)All sensor GND pinsGround

Making the Y-Splitter

  1. Take 4 dupont F-F wires (one per signal: SDA, SCL, VCC, GND)
  2. Strip the middle of each wire and solder additional female ends to branch to each sensor
  3. Or crimp multiple female connectors onto a single wire
  4. Heat shrink the splice points for durability

Power Rail Wire Colors

Warning: The carrier board power rail uses non-standard colors:

RailWire ColorVoltage
5VBlue5V — do NOT connect 3.3V sensors here
GNDBlack0V
3.3VRed3.3V — use this for all sensors

Blue = 5V and Red = 3.3V is the opposite of common convention. Double-check before connecting sensors.

Step 2b: Connect Battery (Optional)

The carrier board supports a 3.7V LiPo battery via the B+/B- solder pads (or JST connector) at the bottom of the board. USB charges the battery; battery powers the board when USB is disconnected.

WARNING: The B+/B- silkscreen labels on the bottom of the carrier board are reversed on some units. The pad marked B+ may actually be B-, and vice versa. This has been confirmed on at least one production board (PLC-OX-BF30). Reversed polarity will destroy the charging IC instantly.

Always verify polarity with a multimeter before connecting a battery:

  1. Power the board via USB
  2. Set multimeter to DC voltage
  3. Probe the B+ and B- pads — B+ should read ~4.2V relative to B-
  4. If the reading is negative, the silkscreen is reversed — swap your battery wires accordingly

Battery Voltage Monitoring (Optional)

To monitor battery charge level, wire a resistor divider from the verified B+ pad to GPIO4 (ADC1_CH3, freed up since I2C moved to GPIO5/GPIO6):

  1. Solder a 100kΩ resistor from B+ pad to left-side signal pin 4 (GPIO4)
  2. Solder a 100kΩ resistor from left-side signal pin 4 (GPIO4) to GND
  3. Add the battery voltage sensor to the ESPHome firmware

See ESP32-C3 SuperMini Expansion Board docs for firmware configuration and voltage-to-percentage mapping.

The carrier board's charging IC does not expose a current sense pin, so direct solar charge rate measurement is not possible without additional hardware. However, the firmware can infer charging state from voltage trends — see the expansion board docs for a software-only charge trend sensor.

Step 3: Connect Soil Probes

The left-side servo groups make soil probe wiring straightforward — each group has Signal (yellow) + VCC (red) + GND (black) in one row.

ProbeSignal Wire (Yellow)Power Wire (Red)Ground Wire (Black)ESP32 Pin
Soil 1Left signal 1Left VCC1 row 1Left GND row 1GPIO1 (ADC1_CH0)
Soil 2Left signal 2Left VCC1 row 2Left GND row 2GPIO2 (ADC1_CH1)
Soil 3Left signal 3Left VCC1 row 3Left GND row 3GPIO3 (ADC1_CH2)

Each soil probe connects with 3 F-F dupont wires to its respective left-side servo group.

Do not use left-side group 0 (GPIO0) — boot strapping pin with ADC interference.

Step 4: Power Control (Optional)

To enable soil sensor power switching (saves power, reduces ADC noise when not reading):

  1. Wire an N-MOSFET (2N7002) gate to right-side signal pin 6 (GPIO6)
  2. MOSFET drain connects to soil probe VCC lines
  3. MOSFET source connects to GND

Do not use GPIO8 — it's hardwired to the Supermini's onboard LED.

Step 5: Flash Firmware

  1. Connect USB-C cable to ESP32 Supermini
  2. Flash ESPHome config:
    esphome run plant-monitor.yaml
  3. See hardware/firmware/ for firmware configuration
  4. Choose a telemetry target: /docs/observability-platform documents the current Plant Caravan hosted InfluxDB path, self-hosted InfluxDB path, and Prometheus scrape path.

Step 6: Verify

After flashing, confirm all sensors report in Home Assistant or ESPHome logs:

SensorExpected ReadingCheck
SCD41 CO2400–600 ppm (fresh air)[ ]
SCD41 temperatureRoom temp ±1.5°C[ ]
SCD41 humidity30–70% indoors[ ]
BH1750 light0 lux (dark) to 10,000+ (sunlight)[ ]
Soil probe 1~2.7V dry, ~1.1V wet[ ]
WiFi signalBetter than -75 dBm[ ]

Troubleshooting

ProblemLikely CauseFix
No I2C devices foundSDA/SCL swapped, missing power, or bad splitterCheck GPIO4=SDA, GPIO5=SCL, verify 3.3V on splitter
Only some I2C sensors workBad connection on one splitter portReseat sensor cable, try different port
Soil reads 0 or 4095Wrong ADC channel or ADC2 pinMust use GPIO1–3 (ADC1 only)
WiFi drops soil readingsUsing ADC2 pinMove soil to ADC1 (GPIO1–3)
SCD41 reads 0 ppmSensor warming upWait 30 seconds after power-on
Blue LED always onGPIO8 hardwiredNormal — ignore or cover with tape