Wattplot Live ↗ Firmware on GitHub ↗

ESP32-S3 Pin Map

ESP32-S3-DevKitC-1-N16R8 · schematic rev B

14
pins assigned by schematic
3
compat entries (preserved, inert)
17
total pins
History: how the pin map evolved

Earlier revisions of this project used an ESP32-C3-era pinout in wattplot.yaml while the schematic had moved to ESP32-S3. That mismatch is now resolved. Limit switches (GPIO14, GPIO15) were removed in favor of current-based homing via the actuator H-bridge's IPROPI pin (GPIO4). Three schematic-removed components (H-bridge EN, Solenoid IN2, Status LED) remain defined in the firmware as compat entries on schematic-free pins, so existing state-machine scripts resolve without rewriting. Full changelog →

Actuator H-bridge (U5a) — panel tilt
Solenoid H-bridge (U5b) — water / latch
Analog (ADC)
I²C bus
1-Wire (DS18B20)
Fault input (nFAULT)
Status LED
Free

Pin map

Schematic (the source of truth) vs firmware.

📐 Schematic (rev B, 2026-08-03)
GPIO1
Actuator H-bridge IN1 (U5a) Actuator
GPIO2
Actuator H-bridge IN2 (U5a) Actuator
GPIO3
Strapping pin, do not drive
GPIO4
Actuator IPROPI (current sense) ADC1_CH4 Actuator
GPIO5
Solenoid IPROPI (jam detect) ADC1_CH5 Solenoid
GPIO6
Soil moisture AOUT ADC1_CH6 Sensors
GPIO7
Battery V ADC ADC1_CH7 Power tree
GPIO8
I²C SDA 4.7 k pull-up Sensors / Expansion
GPIO10
Solenoid H-bridge IN1 (U5b) Solenoid
GPIO11
free
GPIO12
free
GPIO13
Solenoid nFAULT (U5b) Solenoid
GPIO14
free
GPIO15
free
GPIO16
DS18B20 DQ (1-Wire bus) Sensors
GPIO18
I²C SCL 4.7 k pull-up Sensors / Expansion
GPIO21
Actuator nFAULT (U5a) Actuator
GPIO45
Strapping pin (VDD_SPI)
⚙️ wattplot.yaml
GPIO1
Actuator H-bridge IN1 (U5a) Actuator
GPIO2
Actuator H-bridge IN2 (U5a) Actuator
GPIO4
Actuator IPROPI (NEW, U5a) Actuator
GPIO5
Solenoid IPROPI (NEW, U5b) Solenoid
GPIO6
Soil moisture Sensors
GPIO7
Battery V ADC Power tree
GPIO8
I²C SDA Sensors / Expansion
GPIO10
Solenoid H-bridge IN1 (U5b) Solenoid
GPIO11
H-bridge EN (compat) Actuator (compat)
GPIO12
Solenoid IN2 (compat) Solenoid (compat)
GPIO13
Solenoid nFAULT (U5b) Solenoid
GPIO14
free
GPIO15
free
GPIO16
OneWire (DS18B20) Sensors
GPIO17
Status LED (compat) HMI / Status (compat)
GPIO18
I²C SCL Sensors / Expansion
GPIO21
Actuator nFAULT (U5a) Actuator

Component by component

What each component is wired to, in each design.

Component
Schematic
YAML
Status
Actuator H-bridge IN1 / IN2 Actuator (U5a)
GPIO1, GPIO2
GPIO1, GPIO2
✓ match
Actuator IPROPI (current sense) Actuator (U5a)
GPIO4
GPIO4
✓ match
Solenoid H-bridge IN1 Solenoid (U5b)
GPIO10
GPIO10
✓ match
Solenoid IPROPI (jam detect) Solenoid (U5b)
GPIO5
GPIO5
✓ match
Soil moisture Sensors
GPIO6
GPIO6
✓ match
Battery V ADC Power tree
GPIO7
GPIO7
✓ match
I²C bus (SDA / SCL)
GPIO8 / GPIO18
GPIO8 / GPIO18
✓ match
DS18B20 (1-Wire)
GPIO16
GPIO16
✓ match
Actuator nFAULT Actuator (U5a)
GPIO21 (direct)
GPIO21
✓ match
Solenoid nFAULT Solenoid (U5b)
GPIO13 (direct)
GPIO13
✓ match
Actuator H-bridge EN Actuator (compat)
tied to +3V3
GPIO11 (compat)
compat — board doesn't wire EN
Solenoid IN2 Solenoid (compat)
tied to GND
GPIO12 (compat)
compat — board doesn't wire IN2
Status LED HMI / Status (compat)
removed
GPIO17 (compat)
compat — board doesn't wire LED

Why "compat" entries remain: the state machine in wattplot.yaml references id(hb_en_sw), id(solenoid_in2_out), and id(status_led) in scripts. The schematic no longer wires these pins, but the firmware still defines the IDs on schematic-free pins so existing script.execute calls keep working without rewriting the control law.