Тензодатчик и HX711: делаем электронные весы
Почему датчику не обойтись без усилителя
Электронные весы — это пара: тензодатчик, превращающий деформацию металла в изменение сопротивления, и АЦП-усилитель, потому что сигнал датчика крошечный. Разберём ходовой комплект: балочный датчик YZC-133 и модуль HX711.
Посчитаем: у балки на 1 кг чувствительность 1 мВ/В, при питании 5 В весь диапазон укладывается в 5 мВ. А десятиразрядный АЦП Arduino различает шаг около 4,9 мВ — вся шкала датчика равна одному шагу. Поэтому между мостом и контроллером стоит HX711: усилитель с programmable gain 128 и собственным 24-битным сигма-дельта АЦП. Та же история, что с фоторезистором против BH1750: голый чувствительный элемент без обвязки бесполезен.
Как устроен тензодатчик
Внутри алюминиевой балки YZC-133 четыре тензорезистора в мост Уитстона. Один конец жёстко крепят к основанию за два отверстия, вес давит на противоположный. Алюминий упруго изгибается на микроны, резисторы растягиваются и сжимаются, мост разбалансируется — на сигнальной паре появляется напряжение, пропорциональное силе. Нелинейность — ±0,03% полной шкалы.
Провода: красный E+ и чёрный E− питают мост, белый A+ и зелёный A− — сигнальная пара. Мост питается прямо с модуля: у HX711 есть встроенный стабилизатор для датчика.
Что делает HX711
HX711 — АЦП, спроектированный под весы: усилитель с переключаемым усилением 32/64/128, 24-битный сигма-дельта АЦП, стабилизатор для моста, встроенный генератор и фильтр сетевых помех. С контроллером он общается по двум проводам, без адресов и регистров: число импульсов на PD_SCK задаёт канал и усиление следующего замера — 25 импульсов: канал A с усилением 128, 26 — канал B с усилением 32, 27 — канал A с усилением 64. Частота измерений 10 или 80 Гц — уровнем на ножке RATE.
Характеристики
Тензодатчик YZC-133, паспорт поставщика:
| Параметр | Значение |
|---|---|
| Пределы взвешивания | 1 / 5 / 10 / 20 кг |
| Чувствительность | 1,0 ± 0,15 мВ/В |
| Нелинейность, гистерезис, повторяемость | по 0,03% полной шкалы |
| Ползучесть (5 минут под грузом) | 0,05% полной шкалы |
| Входное / выходное сопротивление | 1066 ± 20% / 1000 ± 10% Ом |
| Напряжение возбуждения моста | 5 В (максимум 10 В) |
| Рабочая температура | −20…+65 °C |
| Материал и размеры | алюминий, 75×12,7×12,7 мм, 25 г |
Модуль HX711, datasheet Avia Semiconductor:
| Параметр | Значение |
|---|---|
| Разрядность | 24 бита |
| Канал A (тензомост) | ±20 мВ при усилении 128, ±40 мВ при 64 (AVDD 5 В) |
| Канал B | ±80 мВ, усиление 32 |
| Частота измерений | 10 или 80 Гц (ножка RATE) |
| Подавление сетевых помех | 50 и 60 Гц одновременно |
| Шум на входе | 50 нВ RMS (усиление 128, 10 Гц) |
| Питание и ток | 2,6–5,5 В, до 1,5 мА; в power-down меньше 1 мкА |
| Выход, корпус | дополнительный код 800000–7FFFFF; SOP-16, −40…+85 °C |
Подключение к Arduino и ESP32
Датчик к HX711: красный E+ → клемма E+, чёрный E− → E−, белый A+ → A+, зелёный A− → A−. HX711 к Arduino Uno: VCC → 5V, GND → GND, DT → D4, SCK → D5. Библиотека — bogde/HX711 из Менеджера библиотек.
На ESP32 схема та же (DT → GPIO16, SCK → GPIO17), но модуль питайте от 3V3: при питании 5 В на DOUT будут те же 5 В, а входы ESP32 пятёрку не держат. При 3,3 В модуль работает штатно — измерение относительное, калибровка компенсирует уменьшение сигнала моста сама.
Механика здесь важнее электрики: балка работает на изгиб. Крепите её за крайние отверстия к жёсткому основанию, вес — на противоположный конец; крепёж посередине или груз прямо на балку ломает линейность.
Скетч с калибровкой по эталонному грузу
#include "HX711.h" // bogde/HX711 (Менеджер библиотек)
const byte DT_PIN = 4; // DOUT модуля -> D4 (ESP32: GPIO16)
const byte SCK_PIN = 5; // PD_SCK модуля -> D5 (ESP32: GPIO17)
HX711 scale;
void setup() {
Serial.begin(9600); // ESP32: Serial.begin(115200)
scale.begin(DT_PIN, SCK_PIN);
Serial.println(F("Снимите груз, запоминаю ноль"));
scale.set_scale(); // множитель 1: читаем сырые тики
scale.tare(); // обнуление пустых весов
Serial.println(F("Положите эталонный груз (100 г) и введите c"));
while (!Serial.available()) {} // ждём символ в мониторе порта
Serial.read();
long raw = scale.get_units(10); // среднее 10 замеров минус ноль
Serial.print(F("Сырые тики: "));
Serial.println(raw);
float k = (float)raw / 100.0; // тиков на грамм (груз 100 г)
scale.set_scale(k); // теперь get_units() вернёт граммы
Serial.println(F("Готово, взвешиваю"));
}
void loop() {
if (scale.is_ready()) {
Serial.print(F("Вес, г: "));
Serial.println(scale.get_units(5), 1); // среднее по 5 замерам
}
delay(500);
}
Число k после калибровки зашейте прямо в скетч. Если же весы должны сами управлять нагрузкой — наливать, досыпать, отключать — схема с реле разобрана в проекте умной розетки на ESP32.
Частые ошибки
Показания прыгают на десятки грамм. Наводки сети 50 Гц. Ножку RATE посадите на GND: в режиме 10 Гц HX711 давит 50 и 60 Гц одновременно. Держите датчик рядом с модулем — длинным пусть будет хвост до контроллера. Усредняйте по 5–10 замерам.
Вес с минусом или зашкаливает. Перепутаны сигнальные провода — белый и зелёный (A+ и A−). Поменяйте их местами: для схемы это безопасно, знак просто развернётся.
DOUT молчит. Питание не дошло до модуля либо HX711 ушёл в power-down: если SCK удерживается высоким дольше 60 мкс, микросхема выключается. Лечится перезагрузкой питания; в библиотеке PD_SCK всегда возвращается в ноль.
Ноль плывёт. Ползучесть балки — 0,05% шкалы за 5 минут под грузом, плюс температурный дрейф. Не оставляйте груз на весах часами и не ставьте их к батарее; перед точным взвешиванием делайте tare.
Кладу 500 г — показывает 350. Балка закреплена не за крайние отверстия, усилие приложено не там, где рассчитывал конструктор, либо калибровка снята при другом питании модуля.
Взял балку на 1 кг, взвешиваю по три. За пределом упругости алюминий деформируется насовсем, ноль смещается и не возвращается. Берите датчик с запасом примерно вдвое от максимального груза.
Ограничение этой связки — не электроника, а механика: аккуратный монтаж балки даёт честные доли грамма, кривой — вечные танцы с нулём.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.