Load cell bar with HX711 module and OLED weight readout on a kitchen counter

Beginner

Build a Digital Kitchen Scale

SensorsDisplays

A classic beginner load-cell project: weigh something real and see the exact number on a screen, the same sensing technology behind an actual digital kitchen scale.

3 real parts included

Total for this kit: 1,485.00 ฿

Doesn't include any order discount you may get at checkout.

What you'll need

Project Goal

This project builds a real digital scale: put something on the load cell and see an actual weight reading appear on screen, in grams, updating live. It is a genuinely useful beginner build, not just a demo.

What the Controller Does

It continuously reads the amplifier's digital output, converts that raw value into a real weight using a calibration factor set once during setup, and updates the display with the current reading.

What the Load Cell Does

It's a small metal beam that flexes by a genuinely tiny, otherwise unmeasurable amount under load, changing its electrical resistance slightly as it bends. On its own, that signal is far too small and noisy for a controller to read directly.

What the HX711 Amplifier Does

This is the part that actually makes the load cell usable: it amplifies that tiny signal and converts it to a clean digital reading the controller can read over a simple 2-wire interface, precision analog work that would be genuinely difficult to do well from scratch.

What the Display Does

It shows the current weight reading in real time, updating continuously as items are added or removed from the scale.

Calibration

Every individual load cell needs a one-time calibration: read the raw output with nothing on the scale to find zero, then place a known weight, an object you can verify on another scale, and record the raw reading. The ratio between those two numbers becomes the calibration factor used for every future reading. This step matters, skipping it means the scale will display a number, but not the correct one.

Testing and Troubleshooting

  • Readings drift over time with nothing on the scale, let the load cell warm up and settle for a minute after power-on before calibrating, and re-zero occasionally.
  • Weight readings are consistent but obviously wrong by a fixed ratio, this is almost always a calibration factor problem, redo the known-weight step carefully.
  • No reading at all, double check wiring to the HX711 board specifically, and confirm the load cell's own four wires are connected in the correct order, a commonly swapped pair on these modules.

Optional Upgrade

Add a tare button using any spare button already in the parts bin, so the scale can zero itself out with a container already on it, exactly like a real kitchen scale.

Wiring

  • HX711 VCC → ESP32-C3 3.3V
  • HX711 GND → ESP32-C3 GND
  • HX711 DT → ESP32-C3 GPIO3
  • HX711 SCK → ESP32-C3 GPIO4
  • Load cell 4-wire (E+/E-/A+/A-) → HX711 module's screw terminals — the load cell connects to the HX711 module, not directly to the ESP32
  • Tare button → ESP32-C3 GPIO5 and GND (INPUT_PULLUP)
  • OLED VCC → ESP32-C3 3.3V
  • OLED GND → ESP32-C3 GND
  • OLED SDA → ESP32-C3 GPIO8 (default I2C)
  • OLED SCL → ESP32-C3 GPIO9 (default I2C)

There is no universal calibration factor — every load cell + HX711 pair is different. Derive yours by taring with nothing on the scale, placing a known weight, and dividing the raw reading by that known weight in grams; the placeholder value in the code is only a starting point to replace. Make sure the scale is empty at power-on since `tare()` runs in `setup()`.

Wiring Diagram

VCC → 3.3V GND DT → GPIO3 SCK → GPIO4 GND VCC → 3.3V GND SDA → GPIO8 SCL → GPIO9 ESP32-C3 HX711 Tare button OLED Load cell 4-wire HX711 module's screw term…

Starter Code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <HX711.h>

// --- Pin definitions: adjust to match your ESP32-C3 SuperMini board if different ---
#define HX711_DT   3
#define HX711_SCK  4
#define TARE_BTN   5   // optional push button to GND, uses INPUT_PULLUP
#define OLED_SDA   8   // ESP32-C3 default I2C SDA
#define OLED_SCL   9   // ESP32-C3 default I2C SCL

#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_ADDR     0x3C

// --- Calibration ---
// You must derive this yourself: upload with tare() only, confirm ~0 with
// nothing on the scale, then place a known weight (e.g. a 100g reference
// weight) and note the raw get_units() reading.
// CALIBRATION_FACTOR = (raw reading with known weight) / (known weight in grams).
// There is no universal value - every load cell + HX711 pair is different.
float CALIBRATION_FACTOR = 420.0; // placeholder - replace with YOUR derived value

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
HX711 scale;

void setup() {
  Serial.begin(115200);
  pinMode(TARE_BTN, INPUT_PULLUP);

  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println("OLED init failed");
    while (true) delay(1000);
  }

  scale.begin(HX711_DT, HX711_SCK);
  scale.set_scale(CALIBRATION_FACTOR);
  scale.tare(); // zero the scale on boot - make sure it's empty when powering on

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("Scale ready");
  display.display();
}

void loop() {
  if (digitalRead(TARE_BTN) == LOW) {
    scale.tare();
    delay(300); // simple debounce
  }

  if (scale.is_ready()) {
    float weight = scale.get_units(5); // average of 5 readings
    if (weight < 0.5 && weight > -0.5) weight = 0; // clean up noise near zero

    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(0, 20);
    display.print(weight, 1);
    display.print(" g");
    display.display();
  } else {
    Serial.println("HX711 not found - check wiring");
  }

  delay(200);
}

Not sure about a step? Ask us