Содержание
- Коротко: как подключить
- Что такое HX711
- Как получается вес
- Какой датчик Sierra выбрать
- Схема подключения HX711
- Питание и логические уровни
- Каналы и усиление 128/64/32
- Частота 10 или 80 Гц
- Разрешение: отсчёты на кг
- Arduino, ESP32 и выводы
- Arduino IDE и библиотеки
- Первый скетч: сырые данные
- Калибровка
- Тара и ноль
- Фильтрация шума
- Генератор скетча
- Несколько датчиков
- Практические проекты
- Ограничения: торговля и промышленность
- Симптом → причина
- Проверьте себя
- Частые вопросы
- Словарь
- Источники
- Читайте также
Тензодатчик с Arduino и HX711 — коротко
HX711 — 24-битный АЦП для мостовых тензодатчиков: он питает мост, усиливает милливольтовый сигнал (в 128, 64 или 32 раза) и отдаёт цифровой код по двум проводам. Жилы датчика Sierra подключают так: красный → E+, чёрный → E−, зелёный → A+, белый → A−; модуль — к плате: VCC → 5V (у ESP32 — 3V3), GND → GND, DT → D2, SCK → D3. Затем в скетче делают тару (ноль) и калибровку грузом известной массы.
Ниже — интерактивная схема, выбор датчика 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 со стороны платы.
| Параметр | Значение |
|---|---|
| Разрядность, формат | 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 |
Как из деформации получается число
Тензодатчик — упругий элемент с наклеенными тензорезисторами. Под нагрузкой металл деформируется (закон Гука), сопротивление резисторов меняется: ΔR/R = K·ε, где K — коэффициент тензочувствительности (около 2 для металлической фольги), ε — относительная деформация. При ε = 0,1 % и K = 2 сопротивление меняется всего на 0,2 %. Такие изменения меряют мостом Уитстона — подробно в статье «Что такое тензодатчик».
Почему только полный мост
| Схема | Активных резисторов | Сигнал | Температурная компенсация |
|---|---|---|---|
| Четверть моста | 1 | ≈ в 4 раза меньше полного | нет — нагрев одного плеча виден как ложный груз |
| Полумост | 2 | ≈ в 2 раза меньше | частичная |
| Полный мост | 4 | максимальный | да — плечи уходят одинаково |
Все датчики Sierra — полный мост с четырьмя выводами, их подключают к HX711 напрямую. Трёхпроводные «половинки» из напольных весов собирают в мост парами или с дополнительными резисторами — это отдельная тема («Мостовая схема подключения»).
Какой тензодатчик Sierra подойдёт для Arduino
Для проектов на HX711 удобнее всего одноточечные датчики: один датчик держит всю платформу, крепится двумя болтами снизу и двумя сверху. Для подвешенного груза — S-образный, для бункеров и дозаторов — сильфонный.
| Модель | Тип | Номиналы в каталоге | мВ/В | R вх, Ом | Питание, В | Платформа | IP |
|---|---|---|---|---|---|---|---|
| SL6J1 | одноточечный | 0,6; 1; 2; 3 кг | 1,0 ± 0,1 | 402 ± 6 | 5–15 (макс. 18) | 200 × 200 мм | IP65 |
| SL6H5 | одноточечный | 4; 8; 10; 20 кг | 2,0 ± 0,15 | 402 ± 10 | 9–12 (макс. 18) | 200 × 200 мм | IP65 |
| SL6N | одноточечный | 5–100 кг | 2,0 ± 0,15 | 402 ± 6 | 5–15 (макс. 18) | 350 × 350 мм | IP65 |
| SL6E | одноточечный | 50–300 кг | 2,0 ± 0,15 | 402 ± 6 | 5–15 (макс. 18) | 400 × 500 мм | IP65 |
| SBM11 | сильфонный | 5–500 кг | 2,0 | 365 ± 10 | 5–12 (макс. 18) | — | IP68 |
| SH3 | S-образный | 5 кг – 30 т | 2,0 | 365 ± 5 | 5–12 (макс. 18) | — | IP67 |
Цифры — из паспортов Sierra, номиналы — по каталогу Sierra на сентябрь 2026. У всех моделей 4 жилы + экран: красный — питание +, чёрный — питание −, зелёный — сигнал +, белый — сигнал −, прозрачный — экран. Изоляция ≥ 5000 МОм при 50 В.
Какой номинал взять
- Номинал с запасом 20–30 %: удары, неравномерная нагрузка и тара съедают запас. Предельная нагрузка у SL6J1 и SL6H5 — 120 % НПИ, у SL6N и SL6E — 150 %.
- Не берите номинал «с огромным запасом»: датчик 100 кг под грузом 1 кг выдаёт 1 % своего сигнала — шум HX711 станет заметен.
- Питание: модуль HX711 питает мост напряжением около 4–5 В (у разных модулей по-разному — измерьте между E+ и E−). Это ниже рекомендуемого для SL6H5 (9–12 В): датчик работает, сигнал просто пропорционально меньше.
Схема подключения тензодатчика к HX711 и Arduino
Нажмите на название провода или на сам провод — он подсветится на схеме, а ниже появится пояснение. Переключатель вверху меняет плату.
| Откуда | Клемма модуля HX711 | Куда | Назначение |
|---|---|---|---|
| красная жила датчика | E+ | — | питание моста + |
| чёрная жила датчика | E− | — | питание моста − |
| зелёная жила датчика | A+ | — | сигнал + |
| белая жила датчика | A− | — | сигнал − |
| экран (прозрачная) | GND модуля | — | в одной точке |
| модуль | VCC | 5V | питание модуля и логики |
| модуль | GND | GND | общий провод |
| модуль | DT (DOUT) | D2 | данные |
| модуль | SCK (PD_SCK) | D3 | тактовые импульсы |
Если у датчика шесть проводов
У HX711 нет входов обратной связи SEN±. Жилы SEN+ и SEN− шестипроводного датчика соединяют с E+ и E− соответственно (перемычкой на клеммах). Цвета SEN у разных производителей разные — сверяйтесь с паспортом. Датчики Sierra из таблицы выше четырёхпроводные, для них этот шаг не нужен.
Питание модуля и логические уровни
У 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 В всё в порядке.
Меры безопасности
- Переподключайте провода только при отключённом питании.
- Не подавайте на VCC модуля больше 5,5 В.
- Паяйте паяльником 25–40 Вт при 300–350 °C, не перегревайте контактные площадки модуля.
- Работайте на антистатическом коврике или хотя бы коснитесь заземлённого предмета перед работой.
- Не проверяйте изоляцию датчика мегаомметром выше 50 В — в паспортах Sierra изоляция нормирована при 50 В.
Каналы A и B, усиление 128, 64 и 32
Во входном мультиплексоре два дифференциальных канала. Канал выбирают не командой, а числом импульсов SCK после чтения 24 бит — выбор действует на следующее измерение.
| Импульсов SCK | Канал | Усиление | Диапазон при AVDD = 5 В | Когда использовать |
|---|---|---|---|---|
| 25 | A | 128 | ±20 мВ | основной режим: датчики 1–3 мВ/В |
| 27 | A | 64 | ±40 мВ | большой сигнал, датчик 3 мВ/В с перегрузкой |
| 26 | B | 32 | ±80 мВ | второй датчик или контроль напряжения батареи |
- После включения и после выхода из сна HX711 всегда начинает с канала A, усиление 128.
- После смены канала или усиления первое значение ненадёжно: время установления — 400 мс при 10 Гц. Библиотека делает «холостое» чтение при set_gain(), но в своём коде переключение каналов учитывайте.
- Канал B с усилением 32 для датчика 2 мВ/В даёт вчетверо меньше отсчётов на килограмм, чем канал A. Для двух одинаково точных датчиков лучше два модуля HX711.
Частота опроса: 10 или 80 Гц
Частоту задаёт вывод RATE микросхемы: 0 — 10 Гц, 1 — 80 Гц. На большинстве модулей RATE соединён с GND (10 Гц); для 80 Гц его отпаивают и подключают к питанию — где именно, зависит от модуля. Скетч частоту не меняет.
| 10 Гц | 80 Гц | |
|---|---|---|
| Время установления | 400 мс | 50 мс |
| Шум входа (×128) | 50 нВ СКЗ | 90 нВ СКЗ |
| Подавление 100 дБ (синфазное, питание) | указано в даташите | в даташите не указано |
| Для чего | статическое взвешивание: кухня, склад, посылки | дозирование, быстрые процессы, измерение силы |
При внешнем кварце частота пропорциональна его частоте: 11,0592 МГц дают ровно 10 или 80 Гц. Модули обычно работают от внутреннего генератора, поэтому реальная частота может немного отличаться от номинальной.
Разрешение: сколько отсчётов на килограмм
Код АЦП пропорционален отношению сигнала к диапазону. Для полного моста и питания моста от AVDD формула упрощается: отсчётов на номинал = S [мВ/В] / 1000 × усиление × 224. Для датчика 2 мВ/В при усилении 128 это около 4,3 млн отсчётов.
Шум — типовое значение из даташита для усиления 128; размах ≈ 6,6 СКЗ. Реальный модуль с проводами и питанием от USB шумит больше.
Вывод из расчёта: разрядность у HX711 огромная, но ограничивает точность не она, а шум, дрейф и механика. Весы, которые стабильно показывают 1 г на датчике 10 кг (1/10 000 номинала), — хороший результат для любительской конструкции.
Arduino, ESP32 и выбор выводов
| Плата | Процессор | Память | Логика | Для чего |
|---|---|---|---|---|
| Arduino Uno | ATmega328P, 16 МГц | 32 КБ флеш, 2 КБ ОЗУ, 1 КБ EEPROM | 5 В | первые опыты, учебные весы |
| Arduino Nano | ATmega328P, 16 МГц | как у Uno | 5 В | компактные устройства |
| Arduino Mega 2560 | ATmega2560, 16 МГц | 256 КБ флеш, 8 КБ ОЗУ | 5 В | много датчиков, дисплей, клавиатура |
| ESP32 DevKit | Xtensa LX6, 2 ядра, до 240 МГц | 520 КБ SRAM, флеш обычно 4 МБ | 3,3 В | Wi-Fi и Bluetooth: весы с отправкой данных |
DT и SCK — обычные цифровые выводы: аппаратный интерфейс не нужен, библиотека формирует импульсы программно. Совет из практики: начинайте с Arduino Uno — она «прощает» ошибки подключения и работает на 5 В, как большинство модулей. Для весов с Wi-Fi переходите на ESP32.
Arduino IDE и библиотеки HX711
Установка
- Скачайте Arduino IDE с официального сайта arduino.cc и установите.
- Подключите плату по USB. У плат-клонов с чипом CH340 может понадобиться драйвер CH340.
- Выберите плату: Инструменты → Плата (Arduino Uno, Nano). Для ESP32 сначала установите пакет плат «esp32 by Espressif Systems» через Менеджер плат; если его нет в списке — добавьте ссылку на индекс Espressif из их документации в Настройки → Дополнительные ссылки для менеджера плат.
- Выберите порт: Инструменты → Порт (COMx в Windows, /dev/ttyUSBx или /dev/ttyACMx в Linux).
- Библиотека: Скетч → Подключить библиотеку → Управлять библиотеками, поиск «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
#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.
- Установите датчик на рабочее место, включите и дайте прогреться 10–15 минут.
- Уберите всё с весов, выполните тару: scale.tare(20) — запомнит ноль по 20 значениям.
- Положите груз известной массы — лучше 30–100 % от рабочего диапазона. Подойдут гири или предмет, взвешенный на поверенных весах.
- Посчитайте k = (код с грузом − ноль) / масса и вызовите scale.set_scale(k).
- Проверьте другим грузом. Сохраните ноль и k в EEPROM, чтобы не калибровать после каждого включения.
Коэффициент по двум замерам
Скетч калибровки через монитор порта: отправьте любой символ на пустых весах, затем положите эталон и введите его массу.
// Калибровка через монитор порта (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);
}Тара и ноль: в чём разница
В библиотеке ноль и тара — одна операция: tare() запоминает текущий код как смещение. Разница — в смысле: ноль ставят на пустых весах, тару — когда на весах уже стоит ёмкость, чтобы видеть только содержимое.
- Ноль «уплывает» от температуры и ползучести. Кнопка тары на корпусе решает это для бытовых весов.
- Если ноль и коэффициент сохранены в EEPROM, при включении с грузом весы покажут правильный вес. Если при включении вызывается tare(), включать весы нужно пустыми.
- Автоматическое слежение за нулём: если несколько секунд вес меньше половины деления и не меняется — тихо обновляйте ноль. Так делают промышленные терминалы.
Фильтрация: как убрать дрожание веса
Показания HX711 всегда немного «дышат»: шум микросхемы, наводки, вибрация стола. Фильтр — компромисс между спокойными цифрами и скоростью реакции. Сравните фильтры на одних и тех же данных: весы пустые, затем кладут 500 г, затем меняют на 200 г; красные всплески — одиночные помехи.
| Фильтр | Плюсы | Минусы | Когда |
|---|---|---|---|
| Среднее (get_units(n)) | просто, есть в библиотеке | выброс портит всё окно; задержка n / частота | кухонные и посылочные весы |
| Медиана | игнорирует одиночные всплески | нужна сортировка, немного памяти | рядом реле, моторы, Wi-Fi |
| Экспоненциальный | одна переменная, плавно | медленно догоняет большой скачок | индикация, тренды, ESP32 |
| Медиана + среднее | лучшее из двух | больше задержка | дозаторы на 80 Гц |
Прежде чем усложнять фильтр, уберите источник шума: короткие провода DT/SCK, отдельный стабилизатор для модуля, конденсатор 10–100 мкФ по питанию, датчик и модуль подальше от блока питания и реле, экран на GND в одной точке.
Генератор готового скетча
Выберите плату, выводы и фильтр — получите полный скетч весов: тара по кнопке и из монитора порта (t), калибровка командой c 500, вывод коэффициента (p), сохранение калибровки в EEPROM (Arduino) или Preferences (ESP32).
// Весы на 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
Платформа на четырёх опорах, бочка на трёх ногах, самодельные напольные весы — датчиков больше одного. Вариантов три.
- Параллельно через сумматор (соединительную коробку) на один HX711. Все красные — на E+, все чёрные — на E−, все зелёные — на A+, все белые — на A−. На выходе — один «датчик» с суммарным номиналом и той же чувствительностью в мВ/В. Датчики — только одной модели и номинала. В сумматорах JB01 и SJB-S есть подстройка углов.
- Каждый датчик на свой HX711. DT у каждого модуля свой, SCK можно общий. Вес каждого угла виден отдельно — удобно для контроля центра тяжести и выравнивания углов в программе.
- Второй датчик на канал B. Только усиление 32 и только поочерёдное чтение с установлением после переключения. Компромиссный вариант.
Практические проекты
Кухонные весы с дисплеем
Arduino Nano, датчик SL6H5 на 4 или 8 кг, дисплей LCD 1602 с переходником I2C, кнопка тары. Подключение: дисплей SDA → A4, SCL → A5; HX711 DT → D2, SCK → D3; питание 5 В и GND — общие.
// Кухонные весы: 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 кириллицу обычно не содержит — поэтому надписи латиницей.
Автокормушка по весу
Миска стоит на датчике, шнек или заслонка включается реле и работает, пока в миске не прибавится нужная порция. Обязательно ограничение по времени: если корм кончился, мотор не должен крутиться бесконечно.
// Автокормушка: дозирование по весу с защитой по времени
#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), в программе — масса пустой и полной ёмкости.
// Контроль запасов: две ёмкости, два 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: вес по 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 Гц | по модели |
| Калибровка | в своём скетче | в модуле | с клавиатуры, с пломбированием |
| Торговля и расчёты | нельзя | — | только весы утверждённого типа с поверкой |
Что взять для вашей задачи
Промышленные решения 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 «Весы неавтоматического действия».


