Solstice is an open-source printed circuit board by trailcurrentoss, from the trailcurrentoss/TrailCurrentSolstice repository on GitHub, published under the MIT licence. It is a 2-layer board of 48.4 × 46.1 mm with 17 parts on 46 nets, routed with 140 tracks and 11 vias.
It is built around the ESP32-WROOM-32 and SN65HVD230D. Its parts include 6 capacitors, 4 resistors, 3 ICs, 3 connectors and 1 inductor. It belongs with the interfaces and adapters and power boards and the ESP32 boards of this library.
Solar gateway module that reads data from a Victron MPPT (Maximum Power Point Tracker) solar charge controller via serial and relays the readings over a CAN bus interface. Part of the TrailCurrent open-source vehicle platform.
# Clone the library
git clone git@github.com:trailcurrentoss/TrailCurrentKiCADLibraries.git
# Set environment variables (add to ~/.bashrc or ~/.zshrc)export TRAILCURRENT_SYMBOL_DIR="/path/to/TrailCurrentKiCADLibraries/symbols"export TRAILCURRENT_FOOTPRINT_DIR="/path/to/TrailCurrentKiCADLibraries/footprints"export TRAILCURRENT_3DMODEL_DIR="/path/to/TrailCurrentKiCADLibraries/3d_models"
Chunked protocol for sending WiFi SSID and password over CAN. Credentials are stored in NVS and persist across reboots. See ota.h for the protocol details.
Message 0x04 (6 bytes) - Firmware version report (transmitted once on boot):
Byte
Description
0-2
Last 3 bytes of device WiFi MAC (matches hostname esp32-XXYYZZ)
3-5
Semantic version: major, minor, patch
Sent after CAN initialization. Headwaters uses this to track the running firmware version, including after OTA updates.
Message 0x2C (7 bytes) - Solar panel basics (transmitted every 33ms):
Byte
Description
0-1
Panel voltage
2-3
Solar watts
4-5
Battery voltage
6
Solar status
Message 0x2D (3 bytes) - Solar current:
Byte
Description
0
Current sign
1-2
Current magnitude
Message 0x2E (1 byte) - Load control (received):
Byte
Description
0
Load state (0x00=OFF, 0x01=ON, 0x04=Default)
When a 0x2E message is received over CAN, the gateway sends a VE.Direct HEX SET command to register 0xEDAB on the MPPT to control the load output.
Message 0x2B (6 bytes) - Shunt extended live data (transmitted every 33ms):
Byte
Description
0-1
Temperature (int16 BE, centidegrees C — multiply by 0.01 for °C)
2-3
Midpoint voltage (uint16 BE, millivolts)
4-5
Alarm reason (uint16 BE, bitmask)
Message 0x2F (6 bytes) - Shunt extended history (transmitted every 33ms):
Byte
Description
0-1
Deepest discharge (uint16 BE, whole Ah)
2-3
Cumulative Ah drawn (uint16 BE, whole Ah)
4-5
Charge cycles (uint16 BE, count)
Both shunt extended messages are populated by periodic VE.Direct HEX GET requests to the SmartShunt. Values update every ~12 seconds (6 registers polled at 2 s intervals).
It measures 48.4 × 46.1 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Solstice use?
17 parts, built around the ESP32-WROOM-32 and SN65HVD230D. 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 Solstice KiCad files?
From the trailcurrentoss/TrailCurrentSolstice repository on GitHub, at the commit this page was made from: the board is EDA/solstice.kicad_pcb and its schematic EDA/can.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Solstice design in my own project?
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).
CAN to WiFi Converter PCB using ESP32! This step-by-step tutorial covers schematic creation, PCB layout, and best practices for signal integrity. Perfect for automotive and IoT applications!