Взвешенное решение для Вашего Бизнеса
г. Москва, Дмитровское шоссе, 71Б
Пн-Чт: 10:00-18:00
Пт: 10:00-17:00
Сб-Вс: Выходной
г. Москва, Москва, Дмитровское шоссе , 71 Б
Пн-чт 10:00-18:00
Пт 10:00-17:00
Заказать звонок
Войти

Тензодатчик с Arduino и HX711: подключение, калибровка, примеры кода

21 июн 2025
#Тензодатчики
Как подключить тензодатчик к Arduino и ESP32 через модуль HX711: схема и цвета проводов Sierra, питание, каналы и усиление, калибровка и тара, фильтрация шума, генератор готового скетча, проекты и ограничения для торговли.
Полное руководство: Тензодатчик с Arduino и HX711
Схема: тензодатчик Sierra подключён к модулю HX711 (красный E+, чёрный E−, зелёный A+, белый A−), модуль — к Arduino (VCC, GND, DT, SCK); формула калибровки и график фильтрации
Цвета жил — по паспортам тензодатчиков Sierra; характеристики HX711 — по даташиту Avia Semiconductor.

База знаний Sierra · Обновлено · Подготовили инженеры Sierra · Источники: даташит HX711 (Avia Semiconductor), паспорта датчиков Sierra, библиотека HX711 для Arduino

Содержание
  1. Коротко: как подключить
  2. Что такое HX711
  3. Как получается вес
  4. Какой датчик Sierra выбрать
  5. Схема подключения HX711
  6. Питание и логические уровни
  7. Каналы и усиление 128/64/32
  8. Частота 10 или 80 Гц
  9. Разрешение: отсчёты на кг
  10. Arduino, ESP32 и выводы
  11. Arduino IDE и библиотеки
  12. Первый скетч: сырые данные
  13. Калибровка
  14. Тара и ноль
  15. Фильтрация шума
  16. Генератор скетча
  17. Несколько датчиков
  18. Практические проекты
  19. Ограничения: торговля и промышленность
  20. Симптом → причина
  21. Проверьте себя
  22. Частые вопросы
  23. Словарь
  24. Источники
  25. Читайте также

Тензодатчик с Arduino и HX711 — коротко

HX711 — 24-битный АЦП для мостовых тензодатчиков: он питает мост, усиливает милливольтовый сигнал (в 128, 64 или 32 раза) и отдаёт цифровой код по двум проводам. Жилы датчика Sierra подключают так: красный → E+, чёрный → E−, зелёный → A+, белый → A−; модуль — к плате: VCC → 5V (у ESP32 — 3V3), GND → GND, DT → D2, SCK → D3. Затем в скетче делают тару (ноль) и калибровку грузом известной массы.

КрасныйE+ (питание +)
ЧёрныйE− (питание −)
ЗелёныйA+ (сигнал +)
БелыйA− (сигнал −)
Прозрачныйэкран → GND
24 битадополнительный код, от 800000h до 7FFFFFh
×128 / 64 / 32усиление: канал A — 128 или 64, канал B — 32
10 / 80 Гцчастота данных, выбирается выводом RATE
2,6–5,5 Впитание, ток < 1,5 мА (даташит)

Ниже — интерактивная схема, выбор датчика Sierra, разбор каналов и частоты, калькулятор разрешения, калибровка и тара, фильтры, генератор готового скетча, несколько датчиков, проекты и ограничения HX711 для торговли и промышленности.

Что такое HX711

HX711 — микросхема компании Avia Semiconductor, специально сделанная для весов: 24-битный сигма-дельта АЦП, малошумящий усилитель с программируемым коэффициентом (PGA), мультиплексор на два дифференциальных входа, стабилизатор питания для датчика и встроенный генератор. Регистров нет: всё управление — через выводы и число тактовых импульсов. Поэтому HX711 легко читать с любой платы — Arduino, ESP32, STM32, Raspberry Pi.

Чаще всего используют готовый модуль — маленькую плату с HX711, стабилизатором и клеммами E+, E−, A−, A+, B−, B+ со стороны датчика и GND, DT, SCK, VCC со стороны платы.

Характеристики HX711 по даташиту Avia Semiconductor (типовые значения)
ПараметрЗначение
Разрядность, формат24 бита, дополнительный код; при выходе за диапазон — 800000h (минимум) или 7FFFFFh (максимум)
Канал Aусиление 128 или 64 — диапазон ±20 или ±40 мВ при AVDD = 5 В (точно: ±0,5·AVDD/усиление)
Канал Bусиление 32 (фиксированное) — диапазон ±80 мВ при AVDD = 5 В
Частота данных10 Гц (RATE = 0) или 80 Гц (RATE = 1) от внутреннего генератора
Время установления400 мс при 10 Гц, 50 мс при 80 Гц — после включения, сброса, смены канала или усиления
Шум входа (усиление 128)50 нВ СКЗ при 10 Гц, 90 нВ СКЗ при 80 Гц
Температурный дрейф (усиление 128)нуль ±6 нВ/°C, усиление ±5 ppm/°C
Подавление синфазной помехи и помех питания100 дБ (усиление 128, 10 Гц); заявлено одновременное подавление 50 и 60 Гц
Синфазное напряжение входаот AGND + 1,2 В до AVDD − 1,3 В
ПитаниеDVDD, AVDD — 2,6–5,5 В; VSUP (стабилизатор) — 2,7–5,5 В
Потребление< 1,5 мА в работе (со стабилизатором), < 1 мкА в режиме сна
Рабочая температура−40…+85 °C
КорпусSOP-16
В старых статьях в интернете пишут про «20–22 эффективных бита» и «±80 мВ на входе» без оговорок. В даташите эффективная разрядность не указана, а ±80 мВ — только у канала B с усилением 32. Реальную разрешающую способность оценивайте по шуму — калькулятор ниже.

Как из деформации получается число

Тензодатчик — упругий элемент с наклеенными тензорезисторами. Под нагрузкой металл деформируется (закон Гука), сопротивление резисторов меняется: ΔR/R = K·ε, где K — коэффициент тензочувствительности (около 2 для металлической фольги), ε — относительная деформация. При ε = 0,1 % и K = 2 сопротивление меняется всего на 0,2 %. Такие изменения меряют мостом Уитстона — подробно в статье «Что такое тензодатчик».

1. Грузмасса давит на датчик
2. Мостмилливольты: S × U
3. PGAусиление ×128
4. АЦП24-битный код
5. Плата(код − ноль) / k
6. Весграммы на экране
Нажмите на этап.
N = N0 + k · m
N — код АЦП, N0 — код пустых весов (тара), k — отсчётов на единицу массы, m — масса. Скетч решает обратную задачу: m = (N − N0) / k

Почему только полный мост

СхемаАктивных резисторовСигналТемпературная компенсация
Четверть моста1≈ в 4 раза меньше полногонет — нагрев одного плеча виден как ложный груз
Полумост2≈ в 2 раза меньшечастичная
Полный мост4максимальныйда — плечи уходят одинаково

Все датчики Sierra — полный мост с четырьмя выводами, их подключают к HX711 напрямую. Трёхпроводные «половинки» из напольных весов собирают в мост парами или с дополнительными резисторами — это отдельная тема («Мостовая схема подключения»).

Какой тензодатчик Sierra подойдёт для Arduino

Для проектов на HX711 удобнее всего одноточечные датчики: один датчик держит всю платформу, крепится двумя болтами снизу и двумя сверху. Для подвешенного груза — S-образный, для бункеров и дозаторов — сильфонный.

МодельТипНоминалы в каталогемВ/ВR вх, ОмПитание, ВПлатформаIP
SL6J1одноточечный0,6; 1; 2; 3 кг1,0 ± 0,1402 ± 65–15 (макс. 18)200 × 200 ммIP65
SL6H5одноточечный4; 8; 10; 20 кг2,0 ± 0,15402 ± 109–12 (макс. 18)200 × 200 ммIP65
SL6Nодноточечный5–100 кг2,0 ± 0,15402 ± 65–15 (макс. 18)350 × 350 ммIP65
SL6Eодноточечный50–300 кг2,0 ± 0,15402 ± 65–15 (макс. 18)400 × 500 ммIP65
SBM11сильфонный5–500 кг2,0365 ± 105–12 (макс. 18)—IP68
SH3S-образный5 кг – 30 т2,0365 ± 55–12 (макс. 18)—IP67

Цифры — из паспортов Sierra, номиналы — по каталогу Sierra на сентябрь 2026. У всех моделей 4 жилы + экран: красный — питание +, чёрный — питание −, зелёный — сигнал +, белый — сигнал −, прозрачный — экран. Изоляция ≥ 5000 МОм при 50 В.

Подбор

Какой номинал взять

Для 5 кг нужен номинал не меньше 6,25 кг: например, SL6H5 8 кг или SL6N 10 кг.
  • Номинал с запасом 20–30 %: удары, неравномерная нагрузка и тара съедают запас. Предельная нагрузка у SL6J1 и SL6H5 — 120 % НПИ, у SL6N и SL6E — 150 %.
  • Не берите номинал «с огромным запасом»: датчик 100 кг под грузом 1 кг выдаёт 1 % своего сигнала — шум HX711 станет заметен.
  • Питание: модуль HX711 питает мост напряжением около 4–5 В (у разных модулей по-разному — измерьте между E+ и E−). Это ниже рекомендуемого для SL6H5 (9–12 В): датчик работает, сигнал просто пропорционально меньше.

Схема подключения тензодатчика к HX711 и Arduino

Нажмите на название провода или на сам провод — он подсветится на схеме, а ниже появится пояснение. Переключатель вверху меняет плату.

Схема
Схема подключения тензодатчика Sierra к модулю HX711 и плате: красный E+, чёрный E−, зелёный A+, белый A−; VCC, GND, DT, SCK тензодатчик Sierraполный мост, 4 жилы + экраннагрузка экран → GND модуля (одна точка) HX711 модуль HX711 E+E−A−A+B−B+ GNDDTSCKVCC Arduino Uno GNDD2D35V USB → ПК Цвета жил — по паспортам Sierra. Порядок клемм на модулях бывает разным — читайте надписи на плате.
Нажмите на провод или его название.
ОткудаКлемма модуля HX711КудаНазначение
красная жила датчикаE+—питание моста +
чёрная жила датчикаE−—питание моста −
зелёная жила датчикаA+—сигнал +
белая жила датчикаA−—сигнал −
экран (прозрачная)GND модуля—в одной точке
модульVCC5Vпитание модуля и логики
модульGNDGNDобщий провод
модульDT (DOUT)D2данные
модульSCK (PD_SCK)D3тактовые импульсы

Если у датчика шесть проводов

У HX711 нет входов обратной связи SEN±. Жилы SEN+ и SEN− шестипроводного датчика соединяют с E+ и E− соответственно (перемычкой на клеммах). Цвета SEN у разных производителей разные — сверяйтесь с паспортом. Датчики Sierra из таблицы выше четырёхпроводные, для них этот шаг не нужен.

Кабель датчика не укорачивайте. Его длина учтена при заводской настройке: у SL6J1 — от 0,35 до 3 м, у SL6N и SL6E — 2 м, у SBM11 — 3–3,5 м. Лишнее сматывают в бухту. Длинными делают только провода питания и данных между модулем и платой — и то лучше до 30–50 см.
Чек-лист
Отмечено 0 из 7.

Питание модуля и логические уровни

У HX711 три вывода питания: DVDD — цифровая часть, AVDD — аналоговая часть и питание моста, VSUP — вход встроенного стабилизатора. На модулях всё это уже разведено, и снаружи остаётся один вывод VCC.

  • DVDD должно совпадать с питанием микроконтроллера — так требует даташит. Arduino Uno/Nano — 5 В, ESP32 и ESP8266 — 3,3 В. Тогда уровни DT/SCK совместимы без преобразователей.
  • AVDD задаёт встроенный стабилизатор через внешний транзистор и делитель R1/R2: AVDD = 1,25 В × (R1 + R2) / R1. Оно должно быть минимум на 100 мВ ниже VSUP. Поэтому на мост приходит немного меньше, чем на VCC; точное значение зависит от модуля — измерьте мультиметром между E+ и E−.
  • Ратиометрия. Мост и опорное напряжение АЦП питаются от одного AVDD, поэтому колебания питания почти не меняют код: и сигнал, и шкала меняются пропорционально. Число отсчётов на килограмм от AVDD не зависит, но при 3,3 В сигнал в милливольтах меньше, и шум заметнее.
  • Синфазное напряжение. Средняя точка моста — около AVDD/2, а вход должен быть в пределах от 1,2 В до AVDD − 1,3 В. При AVDD 2,6 В запаса почти нет, при 3,3–5 В всё в порядке.
Ток моста. Датчик 402 Ом при 4,3 В потребляет около 11 мА, четыре таких датчика параллельно — около 43 мА. Этот ток идёт через транзистор стабилизатора модуля. Какой ток выдержит конкретный модуль, в даташите HX711 не сказано — не проверено. Для 1–2 датчиков проблем обычно нет.

Меры безопасности

  1. Переподключайте провода только при отключённом питании.
  2. Не подавайте на VCC модуля больше 5,5 В.
  3. Паяйте паяльником 25–40 Вт при 300–350 °C, не перегревайте контактные площадки модуля.
  4. Работайте на антистатическом коврике или хотя бы коснитесь заземлённого предмета перед работой.
  5. Не проверяйте изоляцию датчика мегаомметром выше 50 В — в паспортах Sierra изоляция нормирована при 50 В.

Каналы A и B, усиление 128, 64 и 32

Во входном мультиплексоре два дифференциальных канала. Канал выбирают не командой, а числом импульсов SCK после чтения 24 бит — выбор действует на следующее измерение.

Импульсов SCKКаналУсилениеДиапазон при AVDD = 5 ВКогда использовать
25A128±20 мВосновной режим: датчики 1–3 мВ/В
27A64±40 мВбольшой сигнал, датчик 3 мВ/В с перегрузкой
26B32±80 мВвторой датчик или контроль напряжения батареи
Интерактив
24 импульса выдвигают 24 бита результата, ещё 1 импульс выбирает канал A с усилением 128.
  • После включения и после выхода из сна HX711 всегда начинает с канала A, усиление 128.
  • После смены канала или усиления первое значение ненадёжно: время установления — 400 мс при 10 Гц. Библиотека делает «холостое» чтение при set_gain(), но в своём коде переключение каналов учитывайте.
  • Канал B с усилением 32 для датчика 2 мВ/В даёт вчетверо меньше отсчётов на килограмм, чем канал A. Для двух одинаково точных датчиков лучше два модуля HX711.

Частота опроса: 10 или 80 Гц

Частоту задаёт вывод RATE микросхемы: 0 — 10 Гц, 1 — 80 Гц. На большинстве модулей RATE соединён с GND (10 Гц); для 80 Гц его отпаивают и подключают к питанию — где именно, зависит от модуля. Скетч частоту не меняет.

Сравнение
10 отсч.
10 новых значений в секунду, установление 400 мс, шум 50 нВ.
10 Гц80 Гц
Время установления400 мс50 мс
Шум входа (×128)50 нВ СКЗ90 нВ СКЗ
Подавление 100 дБ (синфазное, питание)указано в даташитев даташите не указано
Для чегостатическое взвешивание: кухня, склад, посылкидозирование, быстрые процессы, измерение силы

При внешнем кварце частота пропорциональна его частоте: 11,0592 МГц дают ровно 10 или 80 Гц. Модули обычно работают от внутреннего генератора, поэтому реальная частота может немного отличаться от номинальной.

Разрешение: сколько отсчётов на килограмм

Код АЦП пропорционален отношению сигнала к диапазону. Для полного моста и питания моста от AVDD формула упрощается: отсчётов на номинал = S [мВ/В] / 1000 × усиление × 224. Для датчика 2 мВ/В при усилении 128 это около 4,3 млн отсчётов.

Калькулятор
SL6H5 10 кг, 2 мВ/В, усиление 128: около 430 000 отсчётов на 1 кг.

Шум — типовое значение из даташита для усиления 128; размах ≈ 6,6 СКЗ. Реальный модуль с проводами и питанием от USB шумит больше.

Вывод из расчёта: разрядность у HX711 огромная, но ограничивает точность не она, а шум, дрейф и механика. Весы, которые стабильно показывают 1 г на датчике 10 кг (1/10 000 номинала), — хороший результат для любительской конструкции.

Arduino, ESP32 и выбор выводов

ПлатаПроцессорПамятьЛогикаДля чего
Arduino UnoATmega328P, 16 МГц32 КБ флеш, 2 КБ ОЗУ, 1 КБ EEPROM5 Впервые опыты, учебные весы
Arduino NanoATmega328P, 16 МГцкак у Uno5 Вкомпактные устройства
Arduino Mega 2560ATmega2560, 16 МГц256 КБ флеш, 8 КБ ОЗУ5 Вмного датчиков, дисплей, клавиатура
ESP32 DevKitXtensa LX6, 2 ядра, до 240 МГц520 КБ SRAM, флеш обычно 4 МБ3,3 ВWi-Fi и Bluetooth: весы с отправкой данных
Подсказка
Arduino Uno: VCC → 5V, GND → GND, DT → D2, SCK → D3.

DT и SCK — обычные цифровые выводы: аппаратный интерфейс не нужен, библиотека формирует импульсы программно. Совет из практики: начинайте с Arduino Uno — она «прощает» ошибки подключения и работает на 5 В, как большинство модулей. Для весов с Wi-Fi переходите на ESP32.

ESP32 и прерывания. Если импульс SCK растянется больше чем на 60 мкс (например, из-за прерывания Wi-Fi), HX711 уйдёт в спящий режим, и чтение испортится. Библиотеки на время чтения запрещают прерывания; не вызывайте чтение HX711 из обработчиков прерываний и таймеров.

Arduino IDE и библиотеки HX711

Установка

  1. Скачайте Arduino IDE с официального сайта arduino.cc и установите.
  2. Подключите плату по USB. У плат-клонов с чипом CH340 может понадобиться драйвер CH340.
  3. Выберите плату: Инструменты → Плата (Arduino Uno, Nano). Для ESP32 сначала установите пакет плат «esp32 by Espressif Systems» через Менеджер плат; если его нет в списке — добавьте ссылку на индекс Espressif из их документации в Настройки → Дополнительные ссылки для менеджера плат.
  4. Выберите порт: Инструменты → Порт (COMx в Windows, /dev/ttyUSBx или /dev/ttyACMx в Linux).
  5. Библиотека: Скетч → Подключить библиотеку → Управлять библиотеками, поиск «HX711», установите HX711 Arduino Library (автор Bogdan Necula).
БиблиотекаОсобенностиКому
HX711 (bogde)простая: begin, tare, set_scale, get_units; блокирующее чтение с таймаутомдля начала и большинства проектов; на ней все примеры статьи
HX711_ADC (olkal)неблокирующее чтение, встроенное сглаживание, пример калибровки с сохранениемкогда в loop() много других задач

Главные функции библиотеки HX711 (bogde)

ФункцияЧто делает
begin(dout, sck, gain = 128)назначает выводы и усиление (128 или 64 — канал A, 32 — канал B)
is_ready(), wait_ready_timeout(ms)готово ли новое значение (DT = 0); ожидание с таймаутом
read(), read_average(n)сырой код АЦП; среднее по n значениям
tare(n), set_offset(), get_offset()ноль: запомнить текущее среднее как смещение
set_scale(k), get_scale()коэффициент: отсчётов на единицу массы
get_value(n), get_units(n)(среднее − ноль); то же, делённое на коэффициент
power_down(), power_up()сон (SCK = 1 дольше 60 мкс) и пробуждение

Первый скетч: читаем сырые значения

Начните с проверки связи: скетч печатает код АЦП пять раз в секунду. Откройте монитор порта на скорости 115200.

hx711_raw.ino
// Первый скетч: сырые значения HX711
#include <HX711.h>

const uint8_t PIN_DOUT = 2;  // DT модуля
const uint8_t PIN_SCK  = 3;  // SCK модуля

HX711 scale;

void setup() {
  Serial.begin(115200);
  scale.begin(PIN_DOUT, PIN_SCK);  // канал A, усиление 128
  Serial.println(F("HX711: чтение сырых значений"));
}

void loop() {
  if (scale.wait_ready_timeout(1000)) {
    long raw = scale.read();
    Serial.print(F("Код АЦП: "));
    Serial.println(raw);
  } else {
    Serial.println(F("HX711 не отвечает: проверьте VCC, GND, DT и SCK"));
  }
  delay(200);
}
  • Без нагрузки код — какое-то число (у каждого датчика своё, может быть отрицательным). Это нормально — его уберёт тара.
  • Надавите на датчик в рабочем направлении — код должен расти. Уменьшается — поменяйте местами зелёную и белую жилы.
  • Постоянно 8388607 или −8388608 — вход насыщен: оборвана сигнальная жила или перепутаны E и A.
  • «HX711 не отвечает» — нет питания модуля, нет общего GND или DT/SCK не на тех выводах.

Калибровка весов на HX711

Калибровка находит два числа: ноль (offset — код пустых весов) и коэффициент k (сколько отсчётов на грамм или килограмм). Всё остальное — арифметика: вес = (код − ноль) / k.

  1. Установите датчик на рабочее место, включите и дайте прогреться 10–15 минут.
  2. Уберите всё с весов, выполните тару: scale.tare(20) — запомнит ноль по 20 значениям.
  3. Положите груз известной массы — лучше 30–100 % от рабочего диапазона. Подойдут гири или предмет, взвешенный на поверенных весах.
  4. Посчитайте k = (код с грузом − ноль) / масса и вызовите scale.set_scale(k).
  5. Проверьте другим грузом. Сохраните ноль и k в EEPROM, чтобы не калибровать после каждого включения.
Калькулятор

Коэффициент по двум замерам

Коэффициент: 429,50 отсчёта на 1 г.

Скетч калибровки через монитор порта: отправьте любой символ на пустых весах, затем положите эталон и введите его массу.

hx711_calibrate.ino
// Калибровка через монитор порта (115200 бод, «Нет конца строки» не важно)
#include <HX711.h>

HX711 scale;

void waitKey() {
  while (Serial.available()) Serial.read();  // очистить буфер
  while (!Serial.available()) delay(10);
  delay(50);
  while (Serial.available()) Serial.read();
}

void setup() {
  Serial.begin(115200);
  scale.begin(2, 3);

  Serial.println(F("1. Уберите всё с весов и отправьте любой символ"));
  waitKey();
  scale.tare(20);
  Serial.print(F("Ноль (offset): "));
  Serial.println(scale.get_offset());

  Serial.println(F("2. Положите эталон и введите его массу в граммах"));
  while (!Serial.available()) delay(10);
  float ref = Serial.parseFloat();

  float k = scale.get_value(20) / ref;  // отсчётов на 1 г
  scale.set_scale(k);
  Serial.print(F("Коэффициент k = "));
  Serial.println(k, 4);
  Serial.println(F("Запишите offset и k — они понадобятся в рабочем скетче"));
}

void loop() {
  Serial.print(scale.get_units(10), 1);
  Serial.println(F(" г"));
  delay(500);
}
Коэффициент может получиться отрицательным — значит, датчик нагружен «в обратную сторону» или A+ и A− перепутаны. Работать будет, но аккуратнее поменять жилы. Не копируйте чужие коэффициенты вроде «−7050»: k зависит от датчика, номинала, усиления и единиц.

Тара и ноль: в чём разница

В библиотеке ноль и тара — одна операция: tare() запоминает текущий код как смещение. Разница — в смысле: ноль ставят на пустых весах, тару — когда на весах уже стоит ёмкость, чтобы видеть только содержимое.

Интерактив
0 г
0 г
0 г
На датчике: 0 г; сохранённый ноль: 0 г; на табло: 0 г.
  • Ноль «уплывает» от температуры и ползучести. Кнопка тары на корпусе решает это для бытовых весов.
  • Если ноль и коэффициент сохранены в EEPROM, при включении с грузом весы покажут правильный вес. Если при включении вызывается tare(), включать весы нужно пустыми.
  • Автоматическое слежение за нулём: если несколько секунд вес меньше половины деления и не меняется — тихо обновляйте ноль. Так делают промышленные терминалы.

Фильтрация: как убрать дрожание веса

Показания HX711 всегда немного «дышат»: шум микросхемы, наводки, вибрация стола. Фильтр — компромисс между спокойными цифрами и скоростью реакции. Сравните фильтры на одних и тех же данных: весы пустые, затем кладут 500 г, затем меняют на 200 г; красные всплески — одиночные помехи.

Интерактив
Сырые показания HX711 (серые) и отфильтрованные (зелёные)
ФильтрПлюсыМинусыКогда
Среднее (get_units(n))просто, есть в библиотекевыброс портит всё окно; задержка n / частотакухонные и посылочные весы
Медианаигнорирует одиночные всплескинужна сортировка, немного памятирядом реле, моторы, Wi-Fi
Экспоненциальныйодна переменная, плавномедленно догоняет большой скачокиндикация, тренды, ESP32
Медиана + среднеелучшее из двухбольше задержкадозаторы на 80 Гц

Прежде чем усложнять фильтр, уберите источник шума: короткие провода DT/SCK, отдельный стабилизатор для модуля, конденсатор 10–100 мкФ по питанию, датчик и модуль подальше от блока питания и реле, экран на GND в одной точке.

Генератор готового скетча

Выберите плату, выводы и фильтр — получите полный скетч весов: тара по кнопке и из монитора порта (t), калибровка командой c 500, вывод коэффициента (p), сохранение калибровки в EEPROM (Arduino) или Preferences (ESP32).

Генератор
Выводы корректны.
hx711_scale.ino
// Весы на HX711 и тензодатчике Sierra
// Сгенерировано: sierra.market/company/articles/16214/
// Плата: Arduino Uno; DT → D2, SCK → D3, кнопка нуля → D4
// Библиотека: «HX711 Arduino Library» (автор Bogdan Necula), менеджер библиотек Arduino IDE
// Частота 10 или 80 Гц задаётся выводом RATE на модуле, а не скетчем.
#include <HX711.h>
#include <EEPROM.h>

const uint8_t PIN_DOUT = 2;
const uint8_t PIN_SCK  = 3;
const uint8_t PIN_TARE = 4;   // кнопка между выводом и GND
const uint8_t GAIN     = 128;  // канал A: 128 или 64
const uint8_t SAMPLES  = 7;  // отсчётов на одно показание
const unsigned long PERIOD_MS = 250;

float calFactor = 420.00;  // отсчётов АЦП на 1 г (уточните калибровкой)
HX711 scale;
unsigned long lastPrint = 0;

struct Cal { long offset; float factor; uint16_t magic; };
const uint16_t CAL_MAGIC = 0xCA11;

void loadCal() {
  Cal c;
  EEPROM.get(0, c);
  if (c.magic == CAL_MAGIC && c.factor != 0 && !isnan(c.factor)) {
    scale.set_offset(c.offset);
    calFactor = c.factor;
  } else {
    scale.tare(20);  // калибровки ещё нет: ноль по пустым весам
  }
}

void saveCal() {
  Cal c = { scale.get_offset(), calFactor, CAL_MAGIC };
  EEPROM.put(0, c);  // пишет только изменившиеся байты
}

float readMedian() {
  long v[SAMPLES];
  for (uint8_t i = 0; i < SAMPLES; i++) v[i] = scale.read();
  for (uint8_t i = 1; i < SAMPLES; i++) {  // сортировка вставками
    long x = v[i];
    int8_t j = i - 1;
    while (j >= 0 && v[j] > x) { v[j + 1] = v[j]; j--; }
    v[j + 1] = x;
  }
  return (v[SAMPLES / 2] - scale.get_offset()) / scale.get_scale();
}

float readWeight() {
  return readMedian();  // медиана убирает одиночные выбросы
}

void handleSerial() {
  if (!Serial.available()) return;
  char cmd = Serial.read();
  if (cmd == 't') {  // ноль (тара)
    scale.tare(20);
    saveCal();
    Serial.println(F("Ноль установлен"));
  } else if (cmd == 'c') {  // c 500 — калибровка эталоном 500 г
    float ref = Serial.parseFloat();
    if (ref > 0) {
      calFactor = scale.get_value(20) / ref;
      scale.set_scale(calFactor);
      saveCal();
      Serial.print(F("Коэффициент: "));
      Serial.println(calFactor, 4);
    }
  } else if (cmd == 'p') {  // показать калибровку
    Serial.print(F("offset = "));
    Serial.print(scale.get_offset());
    Serial.print(F(", k = "));
    Serial.println(calFactor, 4);
  }
}

void setup() {
  Serial.begin(115200);
  scale.begin(PIN_DOUT, PIN_SCK, GAIN);
  pinMode(PIN_TARE, INPUT_PULLUP);
  if (!scale.wait_ready_timeout(1000)) {
    Serial.println(F("HX711 не отвечает: проверьте VCC, GND, DT и SCK"));
  }
  loadCal();
  scale.set_scale(calFactor);
  Serial.println(F("t — ноль, c 500 — калибровка грузом 500 г, p — коэффициент"));
}

void loop() {
  handleSerial();
  if (digitalRead(PIN_TARE) == LOW) {
    scale.tare(20);
    saveCal();
    Serial.println(F("Ноль"));
    while (digitalRead(PIN_TARE) == LOW) delay(10);  // ждём отпускания
  }
  if (millis() - lastPrint >= PERIOD_MS && scale.wait_ready_timeout(200)) {
    lastPrint = millis();
    Serial.print(readWeight(), 1);
    Serial.println(F(" г"));
  }
}

Скетч по умолчанию проверен компилятором для Arduino Uno. Коэффициент 420 — пример; свой получите калибровкой.

Несколько датчиков: сумматор или несколько HX711

Платформа на четырёх опорах, бочка на трёх ногах, самодельные напольные весы — датчиков больше одного. Вариантов три.

  1. Параллельно через сумматор (соединительную коробку) на один HX711. Все красные — на E+, все чёрные — на E−, все зелёные — на A+, все белые — на A−. На выходе — один «датчик» с суммарным номиналом и той же чувствительностью в мВ/В. Датчики — только одной модели и номинала. В сумматорах JB01 и SJB-S есть подстройка углов.
  2. Каждый датчик на свой HX711. DT у каждого модуля свой, SCK можно общий. Вес каждого угла виден отдельно — удобно для контроля центра тяжести и выравнивания углов в программе.
  3. Второй датчик на канал B. Только усиление 32 и только поочерёдное чтение с установлением после переключения. Компромиссный вариант.
Калькулятор
Без сумматора с подстройкой углы разойдутся: у датчиков разброс чувствительности, и груз в разных углах платформы покажет разный вес. Подстройка углов подробно — в статье «Как выбрать и настроить сумматор».

Практические проекты

Кухонные весы с дисплеем

Arduino Nano, датчик SL6H5 на 4 или 8 кг, дисплей LCD 1602 с переходником I2C, кнопка тары. Подключение: дисплей SDA → A4, SCL → A5; HX711 DT → D2, SCK → D3; питание 5 В и GND — общие.

kitchen_scale_lcd.ino
// Кухонные весы: Arduino Nano + HX711 + LCD 1602 I2C + кнопка тары
#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // библиотека «LiquidCrystal I2C»

const uint8_t PIN_DOUT = 2, PIN_SCK = 3, PIN_TARE = 4;
const float CAL_FACTOR = 420.0;  // ваш коэффициент из калибровки

HX711 scale;
LiquidCrystal_I2C lcd(0x27, 16, 2);  // адрес бывает 0x27 или 0x3F

void setup() {
  pinMode(PIN_TARE, INPUT_PULLUP);
  lcd.init();
  lcd.backlight();
  lcd.print("Scale: zeroing");
  scale.begin(PIN_DOUT, PIN_SCK);
  scale.set_scale(CAL_FACTOR);
  scale.tare(20);
  lcd.clear();
}

void loop() {
  if (digitalRead(PIN_TARE) == LOW) {
    lcd.setCursor(0, 1);
    lcd.print("Tare...         ");
    scale.tare(20);
    while (digitalRead(PIN_TARE) == LOW) delay(10);
  }
  float g = scale.get_units(5);
  if (g > -0.5 && g < 0.5) g = 0;  // не показывать «-0.0»

  lcd.setCursor(0, 0);
  lcd.print("Weight:         ");
  lcd.setCursor(8, 0);
  lcd.print(g, 1);
  lcd.print(" g");

  lcd.setCursor(0, 1);
  lcd.print(g * 0.035274, 2);  // унции
  lcd.print(" oz          ");
  delay(200);
}

Стандартный знакогенератор дисплеев 1602 на контроллере HD44780 кириллицу обычно не содержит — поэтому надписи латиницей.

Автокормушка по весу

Миска стоит на датчике, шнек или заслонка включается реле и работает, пока в миске не прибавится нужная порция. Обязательно ограничение по времени: если корм кончился, мотор не должен крутиться бесконечно.

feeder.ino
// Автокормушка: дозирование по весу с защитой по времени
#include <HX711.h>

const uint8_t PIN_DOUT = 2, PIN_SCK = 3, PIN_RELAY = 7;
const float CAL_FACTOR = 420.0;           // ваш коэффициент
const float PORTION_G = 50.0;             // порция, г
const unsigned long MAX_RUN_MS = 15000;   // мотор не дольше 15 с

HX711 scale;

bool feed(float portion) {
  float start = scale.get_units(10);
  unsigned long t0 = millis();
  digitalWrite(PIN_RELAY, HIGH);
  while (scale.get_units(3) - start < portion) {
    if (millis() - t0 > MAX_RUN_MS) {  // корм кончился или заклинило
      digitalWrite(PIN_RELAY, LOW);
      return false;
    }
  }
  digitalWrite(PIN_RELAY, LOW);
  return true;
}

void setup() {
  Serial.begin(115200);
  pinMode(PIN_RELAY, OUTPUT);
  digitalWrite(PIN_RELAY, LOW);
  scale.begin(PIN_DOUT, PIN_SCK);
  scale.set_scale(CAL_FACTOR);
  scale.tare(20);
}

void loop() {
  if (Serial.read() == 'f') {  // команда «покормить»; в проекте — по часам RTC
    Serial.println(feed(PORTION_G) ? F("Порция выдана") : F("Ошибка: нет корма?"));
  }
}

Контроль запасов

Банки с крупой, канистры, баллоны: по весу видно, сколько осталось. Каждой ёмкости — свой датчик и свой HX711 (общий SCK), в программе — масса пустой и полной ёмкости.

stock_control.ino
// Контроль запасов: две ёмкости, два HX711 с общим SCK
#include <HX711.h>

struct Item {
  const char* name;
  uint8_t dout;
  float factor;   // коэффициент своего датчика
  long offset;    // ноль пустой платформы
  float empty_g;  // масса пустой ёмкости
  float full_g;   // масса полной ёмкости
  HX711 hx;
};

const uint8_t PIN_SCK = 3;
Item items[] = {
  {"Мука",  2, 420.0, 0, 350, 5350},
  {"Сахар", 4, 415.0, 0, 300, 3300},
};
const uint8_t N = sizeof(items) / sizeof(items[0]);

void setup() {
  Serial.begin(115200);
  for (uint8_t i = 0; i < N; i++) {
    items[i].hx.begin(items[i].dout, PIN_SCK);
    items[i].hx.set_scale(items[i].factor);
    items[i].hx.tare(20);  // или set_offset() из сохранённой калибровки
  }
}

void loop() {
  for (uint8_t i = 0; i < N; i++) {
    float g = items[i].hx.get_units(5) - items[i].empty_g;
    float pct = 100.0 * g / (items[i].full_g - items[i].empty_g);
    Serial.print(items[i].name);
    Serial.print(F(": "));
    Serial.print(pct, 0);
    Serial.println(pct < 20 ? F(" % — пора докупить") : F(" %"));
  }
  delay(5000);
}

ESP32: отправка веса по Wi-Fi

ESP32 отправляет вес на свой сервер, в систему «умного дома» или по MQTT. Адрес сервера, имя и пароль сети задайте свои; пароль не публикуйте вместе со скетчем.

esp32_wifi_scale.ino
// ESP32: вес по Wi-Fi (HTTP POST в JSON)
#include <WiFi.h>
#include <HTTPClient.h>
#include <HX711.h>

const char* WIFI_SSID = "ваша_сеть";
const char* WIFI_PASS = "пароль_сети";
const char* URL = "http://192.168.1.10:8080/weight";  // ваш сервер

const uint8_t PIN_DOUT = 16, PIN_SCK = 17;
HX711 scale;

void setup() {
  Serial.begin(115200);
  scale.begin(PIN_DOUT, PIN_SCK);
  scale.set_scale(420.0);  // ваш коэффициент
  scale.tare(20);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println(WiFi.localIP());
}

void loop() {
  float g = scale.get_units(10);
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(URL);
    http.addHeader("Content-Type", "application/json");
    int code = http.POST("{\"weight_g\":" + String(g, 1) + "}");
    Serial.printf("%.1f г, HTTP %d\n", g, code);
    http.end();
  }
  delay(10000);
}

Связь с ПЛК

Arduino можно научить отвечать по Modbus RTU через преобразователь RS-485, но для промышленного контроллера надёжнее готовый весовой АЦП: у него есть питание 12–24 В, защищённые входы и заводская настройка. У Sierra это SMB101 (Modbus RTU/TCP) и FD-3 (4–20 мА, 0–10 В).

Ограничения HX711: торговля и промышленность

HX711 — отличный АЦП для учебных, бытовых и опытных устройств. Но весы — это ещё корпус, защита входов, помехоустойчивость, метрология и документы. Где проходит граница:

HX711 + ArduinoАЦП SMB101Весовой терминал
Назначениеобучение, быт, прототипыПЛК, SCADA, учётные системыготовые весы с табло
Питание2,6–5,5 В от платы12–24 В постоянного токасеть или аккумулятор (по модели)
ВыходDT/SCK на микроконтроллерModbus RTU (RS-485/RS-232), в версиях — Ethernet, Wi-Fiтабло, RS-232/RS-485 (по модели)
Частота10 / 80 Гц10 / 40 Гцпо модели
Калибровкав своём скетчев модулес клавиатуры, с пломбированием
Торговля и расчётынельзя—только весы утверждённого типа с поверкой
Коммерческий учёт. Весы для торговли, расчётов между организациями, фасовки и других измерений, относящихся к сфере государственного регулирования, должны быть утверждённого типа и поверены (Федеральный закон № 102-ФЗ «Об обеспечении единства измерений»; требования к весам — ГОСТ OIML R 76-1-2011). Самодельная схема на HX711 такого статуса не имеет, какой бы точной она ни была.
Подсказка

Что взять для вашей задачи

Промышленные решения Sierra: тензодатчики, соединительные коробки, весовые терминалы (например, XK3190-A12E), преобразователи сигнала и кабель для тензодатчиков. Подключение к терминалу — в статье «Как подключить тензодатчик».

Симптом → причина

Диагностика

Проверить сам датчик мультиметром (сопротивления красный–чёрный, зелёный–белый, изоляция) — по методике из статьи «Как проверить тензодатчик».

Проверьте себя

Частые вопросы

Как подключить тензодатчик к HX711?

Жилы датчика Sierra: красная — E+, чёрная — E−, зелёная — A+, белая — A−, экран — на GND модуля. Модуль к Arduino: VCC — 5V, GND — GND, DT — D2, SCK — D3 (выводы DT и SCK можно выбрать другие). У ESP32 VCC подключают к 3V3.

Какое напряжение питания у модуля HX711?

По даташиту Avia Semiconductor — от 2,6 до 5,5 В, ток меньше 1,5 мА (без учёта датчика). Питание модуля берут от той же платы, что читает DT и SCK: 5 В у Arduino Uno и Nano, 3,3 В у ESP32.

Какое усиление выбрать: 128, 64 или 32?

Для датчиков 1–2 мВ/В — 128 (канал A, диапазон около ±20 мВ при 5 В). Для 3 мВ/В с риском перегрузки — 64 (±40 мВ). Усиление 32 есть только у канала B (±80 мВ).

Чем отличаются 10 и 80 Гц?

10 Гц — меньше шум (50 нВ против 90 нВ по даташиту) и заявленное подавление помех 50/60 Гц, но установление 400 мс. 80 Гц — быстрее (установление 50 мс), подходит для дозаторов, но шумнее. Частоту задаёт вывод RATE на модуле, а не скетч.

Как откалибровать весы на HX711?

На пустых весах выполните scale.tare(20). Положите груз известной массы, посчитайте коэффициент k = scale.get_value(20) / масса и вызовите scale.set_scale(k). Проверьте вторым грузом и сохраните ноль и k в EEPROM.

Почему вес на HX711 показывает минус?

Перепутаны сигнальные жилы A+ и A− или датчик нагружен в обратную сторону. Поменяйте местами зелёную и белую жилы либо используйте отрицательный коэффициент калибровки.

Как подключить четыре тензодатчика к одному HX711?

Через соединительную коробку (сумматор) параллельно: все красные — на E+, все чёрные — на E−, все зелёные — на A+, все белые — на A−. Датчики должны быть одной модели и номинала; углы выравнивают подстройкой в сумматоре. Другой вариант — свой HX711 на каждый датчик.

Можно ли использовать весы на Arduino и HX711 в торговле?

Нет. Для торговли и расчётов нужны весы утверждённого типа с поверкой. Для промышленных систем используйте весовой терминал или весовой АЦП, например SMB101 с Modbus.

Словарь

АЦП
Аналого-цифровой преобразователь: превращает напряжение в число.
PGA
Усилитель с программируемым коэффициентом: 128, 64 или 32 у HX711.
E+ / E−
Питание моста датчика (excitation) с модуля HX711.
A+ / A−, B+ / B−
Дифференциальные входы каналов A и B.
DT (DOUT)
Выход данных HX711; низкий уровень — значение готово.
SCK (PD_SCK)
Тактовый вход; высокий уровень дольше 60 мкс — сон.
AVDD
Аналоговое питание HX711, оно же питание моста и опорное напряжение.
Отсчёт
Единица младшего разряда кода АЦП.
Тара (offset)
Смещение нуля: код, который вычитается из показаний.
Коэффициент k (scale)
Отсчётов на единицу массы.
РКП (чувствительность)
Сигнал датчика на полной нагрузке, мВ на 1 В питания.
НПИ
Наибольший предел измерения — номинал датчика.

Источники

  • Avia Semiconductor. HX711 — 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales. Даташит: PDF (копия SparkFun) — каналы, усиление, частота, шум, питание, интерфейс.
  • Паспорта тензодатчиков Sierra SL6J1, SL6H5, SL6N, SL6E, SBM11, SH3 — чувствительность, сопротивления, питание, кабель, цвета жил; номиналы — каталог sierra.market.
  • Библиотека HX711 для Arduino (Bogdan Necula, лицензия MIT) — функции и их поведение.
  • Карточки каталога: SMB101, FD-3, соединительные коробки.
  • Федеральный закон от 26.06.2008 № 102-ФЗ «Об обеспечении единства измерений»; ГОСТ OIML R 76-1-2011 «Весы неавтоматического действия».

Читайте также

Читайте также