Кухонні ваги на HX711: тензодатчик, тарування й калібрування
Тензодатчик змінює опір на мільйонні частки, а 24-бітний АЦП HX711 перетворює це на грами. Збираємо ваги до 5 кг з індикатором TM1637: підключення мосту, тарування, калібрувальний коефіцієнт і боротьба з дрейфом.
Про проєкт
Тензодатчик (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()) запам'ятовує показ порожніх ваг як нуль. - Калібрувальний коефіцієнт — скільки «сирих» одиниць АЦП припадає на один грам. Його визначають один раз для конкретного датчика:
- Поставте в коді
set_scale(1)і тарируйте порожні ваги. - Покладіть відому вагу, наприклад 500 г.
- Коефіцієнт = показ
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 % номіналу: брусок деформується назавжди. Симулятор про це попередить.