A fully wireless, low-cost corner-weight scale system built using ESP32 boards, HX711 load cell amplifiers, and a simple web interface.
Build your own race scales for approximately $80–$100 instead of spending $1000+ on commercial systems.
This fork of traviscea/DIY-ESP32-Race-Scales promotes an accuracy-focused v1.1 firmware to the repository root: multi-point calibration, statistical stability locking, rotation calibration (pad-to-pad gain trims using the car as a transfer standard), per-pad packet-loss tracking, session JSON snapshots, and a versioned wire protocol.
Layout:
| Path | Contents |
|---|---|
firmware/master/ |
Master sketch (master.ino + ScaleProtocol.h) — open directly in Arduino IDE |
firmware/pad/ |
Remote pad sketch (pad.ino + ScaleProtocol.h) — one binary for all three pads |
docs/OPERATING.md |
Full v1.1 change list, operating procedure, calibration and flashing guide |
docs/WIRING.md |
Plate wiring guide (12-cell, three-layer bridge) |
tools/ |
verify.py (host checks + pinned PlatformIO compile), host_check.py, build_check.py |
The original v1.0 firmware is preserved at the v1.0 git tag and remains
available upstream.
v1.0 and v1.1 wire formats are incompatible — flash all boards together.
The current v1.1 protocol is 0x12: a 13-byte packet with explicit magic,
version, numeric pad ID, and a per-pad sequence counter. The master rejects
older formats instead of silently treating their payload as weight data.
Note also that v1.1 changes the cross-weight convention to the standard
RF + LR (v1.0 reported LF + RR), so cross % values are not directly
comparable across versions. See docs/OPERATING.md
for the full change list, operating procedure, and flashing instructions.
Before flashing, run the complete pinned verification gate:
python tools/verify.pyIt runs host protocol/source checks and compiles both sketches for the
lolin32_lite profile using espressif32@6.5.0 (Arduino core 2.0.14) and
bogde/HX711@0.7.5. Use --board <id> if the delivered clone identifies
differently. Hardware qualification and automatic v1.0 NVS migration remain
deferred; after upgrading, reset and perform fresh ZERO, weight calibration,
and rotation calibration.
The setup instructions below cover hardware, wiring, and flashing; pad
identity is set over serial (see docs/OPERATING.md), not a source edit.
- Wireless communication using ESP-NOW between pads and master
- Real-time corner weights (FL / FR / RL / RR)
- Mobile-friendly web UI (no app required)
- Battery monitoring for each pad (implemented in v1.1; batteries last 8-10 hrs)
- Stability locking (auto-detect when weight settles)
- Unit switching (lbs / kg)
- Calibration and zeroing from browser
- Smart filtering for stable readings
4 ESP32 boards total: one master (which also reads the FL pad directly) plus three remote pads (FR / RL / RR). The 4-pack in the BOM covers the whole system.
- ESP32 (Lite or Dev board)
- HX711 amplifier
- 12 load cells
- Wiring and connectors(comes with hx711's)
- Battery(optional)
Disclaimer: Some of the links below are affiliate links, which means I may earn a commission at no extra cost to you.
As an Amazon Associate I earn from qualifying purchases.
Alternate link for esp32 lites if others are sold out(you need 4 esp32s): https://www.amazon.com/V1-0-0-Bluetuth-Development-ESP-32-MicroPython/dp/B0FBGKK484?crid=17WSD3V9NQ413&dib=eyJ2IjoiMSJ9.0mMutUw27FQh3oBplnQp1ehm2_8dKdtx9ewAsDJyPX2TvjIiAv0tHRh221LBU5XGbP78VNZbeMEqlELbOma7iFtdZbbSTFPk0mZLl5Yqcgoe_Exm8BTwBnzIoaSUUZM4gp5d5-_vyUAqpObyvbEQcYg1qrUN0IIQcIhH8B1XkMQyrHryTqTa_Y1MONCmQ7wu_7TbilEwf21As29RzhMz1QMHID95MqGbWyS1HaGAPak.Z9JD3uAwjzWMCq5MB7yQeq_6o0ThsDc1C0nS0Tonipk&dib_tag=se&keywords=esp32+lite+4&qid=1777433267&sprefix=esp32+lite+%2Caps%2C191&sr=8-17&linkCode=ll2&tag=traviscea05-20&linkId=6603be8a29e5e0e344c7640111766d7e&language=en_US&ref_=as_li_ss_tl
JST battery connectors(for more length) = 6$ https://www.amazon.com/dp/B0FW4Y4FSL?&linkCode=ll2&tag=traviscea05-20&linkId=2dc5248c0eb4ad13a03cd092e03af09c&language=en_US&ref_=as_li_ss_tl
Load cells(48, buy 3 sets of 20) = $45 https://www.amazon.com/dp/B09KGSGL18?social_share=cm_sw_r_cp_ud_dp_BH1Y8XC925MPHF1E74TW&linkCode=ll2&tag=traviscea05-20&linkId=46be772bed19824dc515417869be07c8&language=en_US&ref_=as_li_ss_tl
Alternative Link for Load cells if others sell out(50 pack) = 35$ https://www.amazon.com/dp/B0FMNHCGMB?social_share=cm_sw_r_cso_cp_apin_dp_ZTAPC0312YVC65RHH3ZX&linkCode=ll2&tag=traviscea05-20&linkId=66c7a8294df63c4d4caa6ed5f871bc77&language=en_US&ref_=as_li_ss_tl
Wood 2x12x8 = $20 ***I used 18in sections here for my 245 tires. You may want more or less distance depending on your tire width.
PETG filament I used: Amazon link
Load cell holder:
Stl file: https://drive.google.com/file/d/1BfqhXBpTUUBheZa0adTtnxa-Y_LcbjTP/view?usp=sharing
Box for Esp32:
Stl file: https://drive.google.com/file/d/1Z9YkdcgCBxQTEjgYmJWulF77Iv5ffJcg/view?usp=sharing
Full guide: docs/WIRING.md — covers the 12-cell,
three-layer Wheatstone bridge layout, pre-power continuity checks, and the
first-power test procedure. The quick reference below is a summary; the
detailed guide is authoritative if they ever disagree.
Make sure to check the polarity on the battery/esp32 connection. Some esp32s would be backwards on the jst connection from the battery. I had to swap mine to ensure it didn't blow the board. The board will have the positive side labeled and that should be the side that gets the red wire from the battery.
Make the wheatstone bridges as I have described in the video above(black to black, white to white). Then wire the all the red wires from each corner as shown below
PAD layout:
______________
| A C |
| |
| B D |
______________
PAD(Labeled above) → HX711
A → E+
D → E-
B → A-
C → A+
HX711 → ESP32
VCC → 3.3V
GND → GND
DT → GPIO 4
SCK → GPIO 5
If you see something like master.ino:12:10: fatal error: HX711.h: No such file or directory
Open Arduino IDE.
Go to Sketch > Include Library > Manage Libraries....
Search for "HX711" in the search bar.
Select the "HX711 Arduino Library" by Bogdan Necula (this is the most widely used and recommended version) and click Install
- Each pad ESP32 reads load cell data and transmits it
- Master ESP32:
- Receives all pad data
- Applies calibration
- Hosts the web interface
- Each pad reads raw load cell data via HX711
- Pads apply offset (tare) locally
- Data is transmitted via ESP-NOW
- Master ESP32:
- Applies calibration
- Filters and stabilizes readings
- Serves data through a web interface
Connect to WiFi:
- SSID:
DIY_Race_Scales - Password:
12345678
Open in browser: http://192.168.4.1
- ZERO: Tare all pads
- CAL: Calibrate individual pad
- Units: Toggle between lbs and kg
- Zero the system
- Place a known weight on a pad
- Click CAL
- Enter:
- Pad (FL / FR / RL / RR)
- Known weight
- Upload pad firmware to each pad ESP32
- Upload master firmware to the main ESP32
On pads:
uint8_t masterAddress[] = {0xXX,0xXX,0xXX,0xXX,0xXX,0xXX};Retrieve the MAC address from the master ESP32 serial output.
v1.0:
#define PAD_ID "FR" // Change per boardv1.1: no source edit — the pad prompts for its ID (FR / RL / RR) over
serial on first boot and stores it in NVS. See
docs/OPERATING.md.
- Let scales settle before zeroing
- Use solid ground wiring
- Add capacitors to HX711 (0.1µF + 10µF)
- Avoid long signal wires
Check:
- HX711 wiring
- Grounding
- Offset correctness
- Packet validation
Add:
delay(1);
WiFi.setSleep(false);- Track day corner balancing
- Suspension tuning
- Weight distribution analysis
- DIY race car setup
This project was created as an affordable, open-source alternative to professional race scales, which typically cost $1000 or more.
Contributions are welcome, including:
- UI improvements
- Filtering algorithms
- BLE or logging features
- Hardware variations
This project is source-available and free for personal and educational use. Commercial use is NOT permitted.
If this project helped you:
- Star the repository
- Share your build
- Contribute improvements