← До всіх проєктів
Сенсори Середній

Кухонні ваги на HX711: тензодатчик, тарування й калібрування

Тензодатчик змінює опір на мільйонні частки, а 24-бітний АЦП HX711 перетворює це на грами. Збираємо ваги до 5 кг з індикатором TM1637: підключення мосту, тарування, калібрувальний коефіцієнт і боротьба з дрейфом.

Складність
Середній
Час
1 h
Категорія
Сенсори
Оновлено

Про проєкт

Тензодатчик (load cell) — алюмінієвий брусок із наклеєними тензорезисторами. Під вагою він ледь-ледь згинається, опір змінюється, і міст видає кілька мілівольт. Звичайний АЦП ESP32 такого не побачить, тому потрібен HX711: 24-бітний АЦП з підсилювачем ×128, створений саме для ваг. Збираємо кухонні ваги до 5 кг із цифровим індикатором.

Що знадобиться

  • ESP32 DevKit
  • Тензодатчик-брусок 5 кг (4 дроти) + модуль HX711
  • Індикатор TM1637 (4 цифри)
  • Дві пластини (основа й платформа) і гвинти M4/M5
  • Бібліотеки HX711 (bogde) і TM1637Display

Схема

Тензодатчик → HX711 (кольори найпоширеніші, але перевіряйте за даташитом):

Провід HX711
червоний (E+) E+
чорний (E−) E−
білий (A−) A−
зелений (A+) A+

HX711 і TM1637 → ESP32:

Модуль Вивід ESP32
HX711 VCC / GND 3V3 / GND
DT (DOUT) GPIO16
SCK GPIO4
TM1637 CLK / DIO GPIO22 / GPIO23
VCC / GND 3V3 / GND

Механіка важливіша за електроніку. Брусок кріпиться одним кінцем до основи, другим до платформи, «Z-подібно», щоб середня частина з тензорезисторами могла згинатися. Стрілка на бруску показує напрямок навантаження.

Як це працює

  • HX711 видає 10 вимірювань на секунду. get_units(5) усереднює 5 з них, тобто одне значення за ~0.5 с.
  • Тарування (tare()) запам'ятовує показ порожніх ваг як нуль.
  • Калібрувальний коефіцієнт — скільки «сирих» одиниць АЦП припадає на один грам. Його визначають один раз для конкретного датчика:
    1. Поставте в коді set_scale(1) і тарируйте порожні ваги.
    2. Покладіть відому вагу, наприклад 500 г.
    3. Коефіцієнт = показ get_units(10) / 500.

Код

// Кухонні ваги: тензодатчик 5 кг + HX711, показ на TM1637
#include "HX711.h"
#include <TM1637Display.h>

const int HX_DT = 16, HX_SCK = 4;
// одиниць АЦП на грам: покладіть відому вагу й підберіть, щоб показувало правильно
const float CALIBRATION = 429.5;

HX711 scale;
TM1637Display display(22, 23);   // CLK, DIO

void setup() {
  Serial.begin(115200);
  display.setBrightness(5);
  scale.begin(HX_DT, HX_SCK);
  Serial.println("Тарування... платформа має бути порожня");
  scale.tare(10);
  scale.set_scale(CALIBRATION);
  Serial.println("Готово. Надішліть 'tare', щоб обнулити ваги.");
}

void loop() {
  if (Serial.available()) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();
    if (cmd == "tare") {
      scale.tare(10);
      Serial.println("Обнулено");
    }
  }
  float grams = scale.get_units(5);   // середнє з 5 вимірювань, ~0.5 с
  if (fabs(grams) < 0.5) grams = 0;   // прибираємо «мерехтіння» біля нуля
  display.showNumberDec((int)round(grams));
  Serial.printf("%.1f г\n", grams);
}

Типові проблеми

  • Від'ємна вага. Переставте A+ і A− місцями або поставте від'ємний коефіцієнт.
  • Показ «пливе». Тензодатчики чутливі до температури і «повзуть» під тривалим навантаженням. Прогрійте ваги 5–10 хвилин і додайте автоматичне обнулення дрейфу біля нуля.
  • Шум ±2–3 г. Короткі дроти, спільна земля, живлення без пульсацій. Модулі HX711 з окремим стабілізатором (фіолетові, SparkFun) шумлять менше за дешеві зелені.
  • Не перевантажуйте датчик більш ніж на 120–150 % номіналу: брусок деформується назавжди. Симулятор про це попередить.