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.stlsensor_mount_lid.stlsensor_retainer_frame.stl
Step 1: Seat the ESP32 Supermini
- Orient the carrier board with the battery/power connector at the bottom
- Align the ESP32-C3 Supermini male header pins with the green female socket in the center
- 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
| Wire | From (Carrier) | To (Sensors) | Function |
|---|---|---|---|
| SDA | Left signal pin 4 | All sensor SDA pins | I2C data (GPIO4) |
| SCL | Right signal pin 5 | All sensor SCL pins | I2C clock (GPIO5) |
| VCC | Power rail 3.3V (red wire) | All sensor VCC/VDD pins | 3.3V power |
| GND | Power rail GND (black wire) | All sensor GND pins | Ground |
Making the Y-Splitter
- Take 4 dupont F-F wires (one per signal: SDA, SCL, VCC, GND)
- Strip the middle of each wire and solder additional female ends to branch to each sensor
- Or crimp multiple female connectors onto a single wire
- Heat shrink the splice points for durability
Power Rail Wire Colors
Warning: The carrier board power rail uses non-standard colors:
| Rail | Wire Color | Voltage |
|---|---|---|
| 5V | Blue | 5V — do NOT connect 3.3V sensors here |
| GND | Black | 0V |
| 3.3V | Red | 3.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:
- Power the board via USB
- Set multimeter to DC voltage
- Probe the B+ and B- pads — B+ should read ~4.2V relative to B-
- 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):
- Solder a 100kΩ resistor from B+ pad to left-side signal pin 4 (GPIO4)
- Solder a 100kΩ resistor from left-side signal pin 4 (GPIO4) to GND
- 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.
| Probe | Signal Wire (Yellow) | Power Wire (Red) | Ground Wire (Black) | ESP32 Pin |
|---|---|---|---|---|
| Soil 1 | Left signal 1 | Left VCC1 row 1 | Left GND row 1 | GPIO1 (ADC1_CH0) |
| Soil 2 | Left signal 2 | Left VCC1 row 2 | Left GND row 2 | GPIO2 (ADC1_CH1) |
| Soil 3 | Left signal 3 | Left VCC1 row 3 | Left GND row 3 | GPIO3 (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):
- Wire an N-MOSFET (2N7002) gate to right-side signal pin 6 (GPIO6)
- MOSFET drain connects to soil probe VCC lines
- MOSFET source connects to GND
Do not use GPIO8 — it's hardwired to the Supermini's onboard LED.
Step 5: Flash Firmware
- Connect USB-C cable to ESP32 Supermini
- Flash ESPHome config:
esphome run plant-monitor.yaml - See
hardware/firmware/for firmware configuration - 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:
| Sensor | Expected Reading | Check |
|---|---|---|
| SCD41 CO2 | 400–600 ppm (fresh air) | [ ] |
| SCD41 temperature | Room temp ±1.5°C | [ ] |
| SCD41 humidity | 30–70% indoors | [ ] |
| BH1750 light | 0 lux (dark) to 10,000+ (sunlight) | [ ] |
| Soil probe 1 | ~2.7V dry, ~1.1V wet | [ ] |
| WiFi signal | Better than -75 dBm | [ ] |
Troubleshooting
| Problem | Likely Cause | Fix |
|---|---|---|
| No I2C devices found | SDA/SCL swapped, missing power, or bad splitter | Check GPIO4=SDA, GPIO5=SCL, verify 3.3V on splitter |
| Only some I2C sensors work | Bad connection on one splitter port | Reseat sensor cable, try different port |
| Soil reads 0 or 4095 | Wrong ADC channel or ADC2 pin | Must use GPIO1–3 (ADC1 only) |
| WiFi drops soil readings | Using ADC2 pin | Move soil to ADC1 (GPIO1–3) |
| SCD41 reads 0 ppm | Sensor warming up | Wait 30 seconds after power-on |
| Blue LED always on | GPIO8 hardwired | Normal — ignore or cover with tape |