HX711 и Arduino: подключение тензодатчика, калибровка и электронные весы
Подключение HX711 к Arduino, цвета проводов тензодатчика, четыре датчика по 50 кг, тара и калибровочный коэффициент, борьба с нестабильными показаниями, код для LCD, OLED, ESP32 и Pico.
Связка HX711 и Arduino — самый популярный и дешёвый способ прочитать сигнал тензодатчика уровня микровольт и превратить его в вес в граммах. Кухонные весы, напольные весы, весы для улья, контроль миски с кормом для питомца и стенды для измерения тяги мотора построены на одной идее: под весом тензодатчик изгибается на незаметную глазу величину, HX711 превращает это крошечное изменение в 24-битное число, а Arduino с помощью калибровочного коэффициента переводит это число в граммы.
В этом руководстве ты узнаешь, как работает мост Уитстона внутри тензодатчика, что означают цвета проводов (E+, E-, A+, A-), как подключить четыре полумостовых датчика по 50 кг из напольных весов и как пошагово выставить тару и найти калибровочный коэффициент с библиотекой HX711. Затем соберёшь электронные весы с LCD и кнопкой тары, разберёшься, почему показания дрожат и как их успокоить, а в конце сделаешь то же самое на ESP32 с OLED-дисплеем и на Raspberry Pi Pico (MicroPython).

Что такое тензодатчик и как он работает?
Тензодатчик — это брусок из алюминия или стали с наклеенными на него тензорезисторами. Тензорезистор — это резистор, вытравленный зигзагом на тонкой фольге: когда металл растягивается, дорожка становится длиннее и тоньше, и её сопротивление растёт; при сжатии сопротивление падает. Изменение невероятно мало. Тензорезистор с коэффициентом тензочувствительности около 2 при деформации в одну тысячную меняет сопротивление всего на 0,2 процента; для тензорезистора на 1000 Ω это 2 Ω, которые обычный analogRead() никогда не заметит.
Чтобы сделать это крошечное изменение измеримым, четыре тензорезистора соединяют в мост Уитстона. Мост — это просто два делителя напряжения рядом: питание подаётся между E+ и E-, а A+ и A- — средние точки двух делителей. Без нагрузки все четыре резистора равны, поэтому обе средние точки находятся под одним напряжением, и выход равен нулю. Под нагрузкой два тензорезистора растягиваются, а два сжимаются; одна средняя точка поднимается, а другая опускается. Если R1 и R2 — верхний и нижний резисторы левого делителя, а R3 и R4 — правого, то выход равен Vout = Vexc × (R4/(R3+R4) − R2/(R1+R2)) и растёт пропорционально весу. Идею делителя можно опробовать в калькуляторе делителя напряжения.
Число вроде 1 mV/V на этикетке тензодатчика — его чувствительность: при полной нагрузке датчик выдаёт 1 mV на каждый вольт напряжения возбуждения. Модуль HX711 питает мост напряжением около 4,3 V, поэтому датчик на 5 кг при 5 кг выдаёт всего 4,3 mV, а на один грамм — лишь 0,86 µV. Вот почему нужен специальный 24-битный АЦП с усилением 128.
| Нагрузка (датчик 5 кг, 1 mV/V) | Выход моста | Сырое значение HX711 (усиление 128) |
|---|---|---|
| 0 г | 0 mV | 0 (после тары) |
| 100 г | 0,086 mV | ≈ 43 000 |
| 1 кг | 0,86 mV | ≈ 429 500 |
| 5 кг (полная нагрузка) | 4,3 mV | ≈ 2 147 000 |
В таблице стоит заметить одну деталь: сырое значение не зависит от напряжения питания. HX711 использует напряжение, питающее мост (AVDD), ещё и как опорное для измерения, поэтому если питание немного просядет, выход моста упадёт в той же пропорции, и результат не изменится. Это называется ратиометрическим измерением. Грубое правило: полная нагрузка датчика 1 mV/V соответствует примерно 2 147 000 отсчётов. Раздели это число на ёмкость датчика в граммах и получишь приблизительный калибровочный коэффициент: ≈ 2150 для 1 кг, ≈ 430 для 5 кг и ≈ 107 для 20 кг.
Что такое модуль HX711? Характеристики
HX711 — это 24-битный сигма-дельта АЦП от Avia Semiconductor для весовых применений. Внутри есть программируемый усилитель (PGA), стабилизатор, питающий мост, и внутренний генератор, а с внешним миром он общается всего по двум проводам по собственному простому последовательному протоколу. Этот протокол — не I2C: когда линия DT (DOUT) уходит в LOW, данные готовы, и Arduino считывает 24 бита по одному, подавая 25–27 импульсов на линию SCK. Число импульсов выбирает канал и усиление для следующего измерения: 25 импульсов — канал A с усилением 128, 26 импульсов — канал B с усилением 32, 27 импульсов — канал A с усилением 64.
| Параметр | Значение |
|---|---|
| Разрешение | 24 бита, дополнительный код (0x800000 – 0x7FFFFF) |
| Канал A | Усиление 128 (±20 mV) или 64 (±40 mV) при AVDD 5 V |
| Канал B | Фиксированное усиление 32 (±80 mV) |
| Частота выборки | 10 SPS (RATE = GND) или 80 SPS (RATE = VCC) |
| Питание | 2,6–5,5 V |
| Ток | Меньше 1,5 mA; в режиме power-down меньше 1 µA |
| Возбуждение моста (E+) | Около 4,3 V у распространённого зелёного модуля при входе 5 V |
| Время установления | 400 мс после включения, пробуждения или смены усиления (10 SPS) |
| Интерфейс | 2 провода: DT (данные) и SCK (тактирование + управление power-down) |
На большинстве дешёвых зелёных модулей пин RATE на плате соединён с GND, поэтому модуль делает 10 измерений в секунду. Режим 10 SPS меньше шумит и к тому же подавляет сетевые наводки 50/60 Hz, поэтому в большинстве случаев он лучший выбор для взвешивания. Если линия SCK остаётся в HIGH дольше 60 µs, HX711 переходит в режим power-down и отключает питание моста. В проектах на батарейках это удобно делать функциями power_down() и power_up().
Виды тензодатчиков: какую ёмкость выбрать?

| Тип | Ёмкость | Проводов | Типичное применение | Прибл. коэффициент (отсчётов/г) |
|---|---|---|---|---|
| Балочный, полный мост | 1 кг | 4 | Ювелирные изделия, письма, точные кухонные весы | ≈ 2150 |
| Балочный, полный мост | 5 кг | 4 | Кухонные весы, миска для корма | ≈ 430 |
| Балочный, полный мост | 20 кг | 4 | Посылки, багаж, весы для цветочного горшка | ≈ 107 |
| Полумост (датчик напольных весов) | 50 кг (200 кг с 4 датчиками) | 3 | Напольные весы, улей | Определяется измерением |
| S-образный | 50 кг – 1 т | 4 | Подвесные весы, сила тяги | Зависит от mV/V на этикетке |
Выбирай ёмкость примерно в 1,5 раза больше самого тяжёлого груза, который будешь взвешивать. Слишком мощный датчик снижает разрешение: письмо в 50 г можно взвесить и на датчике 20 кг, но показание будет вчетверо грубее, чем на датчике 5 кг. Перегрузка маленького датчика хуже: балочные датчики обычно безопасно выдерживают около 120 процентов ёмкости, но выше 150 процентов металл может изогнуться навсегда, и датчик больше не вернётся к нулю. Общая ёмкость зависит и от того, сколько датчиков делят вес: четыре датчика по 50 кг в углах вместе держат 200 кг.
Цвета проводов и подключение HX711
| Провод тензодатчика | Клемма HX711 | Назначение |
|---|---|---|
| Красный | E+ | Возбуждение моста (+) |
| Чёрный | E- | Возбуждение моста (−) |
| Белый | A- | Сигнал (−) |
| Зелёный | A+ | Сигнал (+) |
| Пин HX711 | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT), вывод 36 |
| GND | GND | GND | GND, вывод 38 |
| DT (DOUT) | D2 | GPIO 25 | GP15, вывод 20 |
| SCK (PD_SCK) | D3 | GPIO 26 | GP14, вывод 19 |
Цвета у разных производителей могут отличаться: у некоторых датчиков вместо чёрного жёлтый, вместо зелёного синий, или белый и зелёный поменяны ролями. Для уверенности переключи мультиметр в режим измерения сопротивления: пара возбуждения (E+, E-) и сигнальная пара (A+, A-) обычно показывают около 1000 Ω, а перекрёстные пары — примерно три четверти от этого. Перепутанные сигнальные провода ничего не повредят; просто значение будет уменьшаться при добавлении веса. Это исправляется перестановкой проводов или отрицательным калибровочным коэффициентом. B+ и B- относятся ко второму каналу и в проектах с одним датчиком не используются.
Подключение четырёх полумостовых датчиков по 50 кг (напольные весы)
Датчики на 50 кг из напольных весов, с E-образной серединой, содержат только два тензорезистора и 3 провода, то есть каждый из них — половина моста. Провода обычно красный, белый и чёрный, но средний отвод всегда находи измерением: между двумя крайними проводами около 2 kΩ, а от среднего провода до каждого крайнего — около 1 kΩ. У большинства датчиков средний отвод красный. Если соединить четыре датчика в кольцо, получится полный мост Уитстона.
- Расставь датчики по четырём углам платформы и пронумеруй углы: 1 (спереди слева), 2 (спереди справа), 3 (сзади справа) и 4 (сзади слева).
- Соедини одноцветные крайние провода соседних датчиков: белые 1 и 2, чёрные 2 и 3, белые 3 и 4, чёрные 4 и 1.
- Красные провода диагональных датчиков 1 и 3 подключи к E+ и E-.
- Красные провода другой диагонали, датчиков 2 и 4, подключи к A+ и A-.
- Перед пайкой измерь: между E+ и E- и между A+ и A- должно быть около 2 kΩ. Если значение сильно отличается, одно из соединений неверное.
- Если при добавлении веса значение уменьшается, поменяй местами провода A+ и A- или используй отрицательный коэффициент.
| Датчик (угол) | Белый провод | Чёрный провод | Красный провод |
|---|---|---|---|
| 1 – спереди слева | к белому 2 | к чёрному 4 | E+ |
| 2 – спереди справа | к белому 1 | к чёрному 3 | A+ |
| 3 – сзади справа | к белому 4 | к чёрному 2 | E- |
| 4 – сзади слева | к белому 3 | к чёрному 1 | A- |
Установка библиотеки HX711
- В Arduino IDE открой Инструменты › Управлять библиотеками (Tools › Manage Libraries) и введи в поиске HX711.
- Установи HX711 Arduino Library от Bogdan Necula. Если библиотека устанавливается впервые, загляни в руководство по установке библиотек Arduino.
- После установки в Файл › Примеры › HX711 Arduino Library (File › Examples) появятся скетчи HX711_basic_example и HX711_full_example; в коде ниже используются те же функции.
| Функция | Что делает |
|---|---|
| begin(dt, sck, усиление) | Настраивает пины; по умолчанию усиление 128 (канал A) |
| is_ready() / wait_ready_timeout(ms) | Готово ли новое измерение? Версия с таймаутом не подвесит программу, если модуля нет |
| read() / read_average(n) | Возвращает сырое 24-битное значение или среднее из n измерений |
| tare(n) | Сохраняет среднее из n измерений как точку нуля (смещение) |
| get_value(n) | Среднее минус смещение: сырое значение с учётом тары |
| set_scale(factor) / get_units(n) | Задаёт коэффициент; get_units возвращает вес (get_value / factor) |
| set_offset() / get_offset() | Записывает или читает значение тары вручную (чтобы его сохранить) |
| power_down() / power_up() | Усыпляет HX711 и мост и будит их |
| set_gain(128, 64 или 32) | Выбирает канал и усиление (32 = канал B) |
Как выставить тару и найти калибровочный коэффициент?
HX711 выдаёт не граммы, а сырое число. Чтобы превратить его в вес, нужны два значения: смещение (тара), которое показывают пустые весы, и число отсчётов на грамм — калибровочный коэффициент. Формула простая: вес = (сырое значение − смещение) / коэффициент. Смещение находит функция tare(), а коэффициент определяется один раз по предмету известного веса. Например, если пустые весы показывают 84 120, а с гирей 500 г значение становится 298 870, разница равна 214 750, а коэффициент — 214 750 / 500 = 429.5.
- Надёжно закрепи датчик на платформе: калибровать нужно весы в окончательном виде.
- Загрузи код ниже, открой монитор порта на скорости 9600 бод и дождись тары, пока весы пустые.
- Положи в центр предмет известного веса. Подойдёт бутылка воды, взвешенная на других весах; лучший результат даёт груз около половины ёмкости.
- Введи в монитор порта вес предмета в граммах (например, 500) и нажми Enter. Код вычислит и выведет коэффициент и сразу сделает контрольное измерение.
- Запиши коэффициент и вставь его в код весов. Повтори несколько раз с разными грузами и усредни — так точность будет выше.
1#include "HX711.h"
2
3const int DT_PIN = 2; // HX711 DT (DOUT)
4const int SCK_PIN = 3; // HX711 SCK (PD_SCK)
5
6HX711 scale;
7
8void setup() {
9 Serial.begin(9600);
10 scale.begin(DT_PIN, SCK_PIN); // kanal A, kazanç 128 / channel A, gain 128
11 if (!scale.wait_ready_timeout(1000)) { // modül cevap vermiyor / module not answering
12 Serial.println("HX711 bulunamadi / HX711 not found");
13 while (true) {}
14 }
15 scale.set_scale(); // faktör 1: ham sayı / factor 1: raw counts
16 Serial.println("Tarti bos olsun, dara aliniyor... / Keep it empty, taring...");
17 delay(2000);
18 scale.tare(20); // 20 ölçümün ortalaması sıfır / average of 20 readings = zero
19 Serial.println("Bilinen agirligi koy, gramini yaz (or. 500) / Place a known weight, type its grams (e.g. 500)");
20}
21
22void loop() {
23 if (Serial.available()) {
24 float bilinen = Serial.parseFloat(); // Seri Monitör'den gram / grams from Serial Monitor
25 if (bilinen > 0) {
26 double fark = scale.get_value(20); // dara düşülmüş ham fark / tared raw difference
27 float faktor = fark / bilinen;
28 Serial.print("Ham fark / raw difference: ");
29 Serial.println(fark, 0);
30 Serial.print("Kalibrasyon faktoru / calibration factor: ");
31 Serial.println(faktor, 2);
32 scale.set_scale(faktor); // hemen kontrol et / check right away
33 Serial.print("Kontrol / check: ");
34 Serial.print(scale.get_units(10), 1);
35 Serial.println(" g");
36 }
37 }
38}Код с помощью tare(20) принимает за ноль среднее из 20 измерений; при 10 SPS это около 2 секунд. Когда кладёшь груз, get_value(20) возвращает сырую разницу с учётом тары, а её деление на известные граммы даёт коэффициент. Не волнуйся, если коэффициент получился отрицательным: это просто значит, что сигнальные провода перепутаны, и с отрицательным коэффициентом весы тоже работают правильно. Чтобы не вводить коэффициент при каждом запуске, его можно записать в энергонезависимую память Arduino через EEPROM.put() и прочитать обратно через EEPROM.get(); подробности в статье EEPROM в Arduino.
Электронные весы на Arduino: граммы на LCD и кнопка тары
Теперь соберём настоящие весы с твоим коэффициентом. Вес выводится на I2C LCD 16x2, а кнопка на D4 в любой момент выставляет тару: можно сначала поставить ёмкость, обнулить, а потом взвешивать только содержимое. LCD подключается к A4 (SDA) и A5 (SCL); подробности в статье о дисплее I2C LCD, а о встроенной подтяжке — в статье о подключении кнопки.
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3#include "HX711.h"
4
5const int DT_PIN = 2; // HX711 DT
6const int SCK_PIN = 3; // HX711 SCK
7const int DARA_BUTON = 4; // dara butonu, diğer ucu GND / tare button, other leg to GND
8const float FAKTOR = 429.5; // kendi faktörünü yaz / use your own factor
9
10HX711 scale;
11LiquidCrystal_I2C lcd(0x27, 16, 2); // adres, sütun, satır / address, columns, rows
12float filtreli = 0; // filtrelenmiş ağırlık / filtered weight
13
14void setup() {
15 pinMode(DARA_BUTON, INPUT_PULLUP);
16 lcd.init();
17 lcd.backlight();
18 lcd.print("Dara aliniyor...");
19 scale.begin(DT_PIN, SCK_PIN);
20 scale.set_scale(FAKTOR);
21 scale.tare(20); // açılışta terazi boş olmalı / scale must be empty at start
22 lcd.clear();
23 lcd.print("Agirlik:");
24}
25
26void loop() {
27 if (digitalRead(DARA_BUTON) == LOW) { // butona basıldı / button pressed
28 lcd.setCursor(0, 1);
29 lcd.print("Dara... ");
30 scale.tare(20);
31 filtreli = 0;
32 while (digitalRead(DARA_BUTON) == LOW) {} // bırakılmasını bekle / wait for release
33 delay(50); // kontak sıçramasını atla / skip contact bounce
34 }
35
36 if (scale.is_ready()) {
37 float w = scale.get_units(4); // 4 ölçümün ortalaması / average of 4 readings
38 if (fabs(w - filtreli) > 5.0) {
39 filtreli = w; // büyük değişim: filtreyi atla / big change: skip the filter
40 } else {
41 filtreli = 0.7 * filtreli + 0.3 * w; // üstel ortalama (EMA) / exponential moving average
42 }
43 float goster = filtreli;
44 if (fabs(goster) < 0.5) goster = 0; // sıfırdaki titremeyi gizle / hide jitter around zero
45
46 char yazi[12];
47 dtostrf(goster, 8, 1, yazi); // 8 karakter, 1 ondalık / 8 chars, 1 decimal
48 lcd.setCursor(0, 1);
49 lcd.print(yazi);
50 lcd.print(" g");
51 }
52}В коде три небольших приёма. Первый — экспоненциальное скользящее среднее (EMA): каждое новое измерение вносит в результат только 30 процентов, что сглаживает дрожание. Второй: если вес резко меняется больше чем на 5 г, фильтр пропускается, и дисплей сразу прыгает к новому значению; фильтр работает только при стабильной нагрузке. Третий — мёртвая зона: значения меньше ±0,5 г показываются как 0, поэтому пляшущие цифры вроде 0,3, -0,2, 0,1 на пустых весах исчезают. Поскольку get_units(4) при каждом вызове ждёт четыре измерения, при 10 SPS дисплей обновляется примерно 2,5 раза в секунду.
Нестабильные показания: дрожание, дрейф и как их исправить
Большинство проблем в проектах с HX711 связаны с механикой, а не с кодом. Балочный тензодатчик работает как консольная балка: один конец привинчен к основанию, другой — к верхней пластине, а на каждом конце стоит проставка в несколько миллиметров (шайбы или напечатанный на 3D-принтере блок). Так датчик стоит Z-образно, и его середина может свободно изгибаться. Если середина датчика касается основания или пластины, если винты перетянуты или пластина прогибается, показания будут постоянно уплывать. Убедись, что стрелка на датчике смотрит по направлению силы (вниз), и следи, чтобы ничто не касалось средней части с тензорезисторами.
- Жёсткое основание: основание и пластина не должны прогибаться; используй толстую фанеру, МДФ или алюминиевый лист. Вибрации стола тоже попадают в показания.
- Короткие закреплённые провода: провода датчика должны быть короткими, скрученными и закреплёнными. Болтающийся кабель давит на датчик и меняет значение.
- Чистое питание: USB-порт ноутбука может шуметь. Помогают конденсаторы 100 nF и 10 µF между VCC и GND модуля и расстояние от моторов, реле и антенны Wi-Fi.
- Прогрев: в первые минуты после включения, пока датчик и модуль прогреваются, точка нуля может уплыть на несколько граммов; перед точными измерениями подожди, а потом выстави тару.
- Усреднение: get_units(10) снижает шум примерно в три раза, но при 10 SPS занимает 1 секунду. Найди баланс между скоростью и стабильностью; о других методах фильтрации читай в статье о фильтрации данных датчиков.
- Ползучесть: под долго лежащим грузом значение может за несколько минут измениться на пару граммов. Это свойство самого датчика, на дешёвых датчиках оно заметнее.
- Реалистичные ожидания: стабильность 0,5–1 г у хорошо закреплённого датчика на 5 кг и 50–100 г у напольных весов из четырёх датчиков по 50 кг — хорошие результаты.
Весы на ESP32: OLED-дисплей и постоянная калибровка
Та же библиотека без изменений работает на ESP32. Пример ниже показывает вес крупными цифрами на OLED SSD1306 0,96 дюйма, выставляет тару кнопкой на GPIO 27 и сохраняет калибровочный коэффициент во флеш-память с помощью библиотеки Preferences. Достаточно ввести в мониторе порта известный вес в граммах, и новый коэффициент будет вычислен и сохранён навсегда. О подключении OLED (SDA GPIO 21, SCL GPIO 22) и библиотеках читай в статье об OLED-дисплее.
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4#include <Preferences.h>
5#include "HX711.h"
6
7const int DT_PIN = 25; // HX711 DT
8const int SCK_PIN = 26; // HX711 SCK
9const int DARA_BUTON = 27; // dara butonu, diğer ucu GND / tare button, other leg to GND
10
11HX711 scale;
12Adafruit_SSD1306 display(128, 64, &Wire, -1);
13Preferences ayar;
14float faktor;
15
16void agirlikGoster(float g) {
17 display.clearDisplay();
18 display.setTextSize(1);
19 display.setCursor(0, 0);
20 display.print(F("BlueGrays Terazi"));
21 display.setTextSize(2); // büyük rakamlar / big digits
22 display.setCursor(0, 28);
23 if (fabs(g) < 1000) {
24 display.print(g, 1);
25 display.print(F(" g"));
26 } else {
27 display.print(g / 1000.0, 3); // 1 kg üstü kilogram / kilograms above 1 kg
28 display.print(F(" kg"));
29 }
30 display.display();
31}
32
33void setup() {
34 Serial.begin(115200);
35 pinMode(DARA_BUTON, INPUT_PULLUP);
36 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // SDA 21, SCL 22
37 display.setTextColor(SSD1306_WHITE);
38
39 ayar.begin("terazi", false); // flash'ta ayar alanı / settings namespace in flash
40 faktor = ayar.getFloat("faktor", 429.5); // kayıt yoksa varsayılan / default if nothing saved
41
42 scale.begin(DT_PIN, SCK_PIN);
43 scale.set_scale(faktor);
44 scale.tare(20);
45 Serial.println("Kalibrasyon: agirligi koy, gramini yaz / Calibrate: place a weight, type its grams");
46}
47
48void loop() {
49 if (digitalRead(DARA_BUTON) == LOW) {
50 scale.tare(20);
51 while (digitalRead(DARA_BUTON) == LOW) delay(10); // bırakılmasını bekle / wait for release
52 delay(50); // kontak sıçramasını atla / skip contact bounce
53 }
54
55 if (Serial.available()) {
56 float bilinen = Serial.parseFloat();
57 if (bilinen > 0) {
58 faktor = scale.get_value(20) / bilinen; // yeni faktör / new factor
59 scale.set_scale(faktor);
60 ayar.putFloat("faktor", faktor); // elektrik kesilse de kalır / survives power loss
61 Serial.printf("Yeni faktor / new factor: %.2f\n", faktor);
62 }
63 }
64
65 if (scale.wait_ready_timeout(200)) {
66 agirlikGoster(scale.get_units(5));
67 }
68}При питании HX711 от пина 3V3 ESP32 стабилизатор модуля не может выдать 4,3 V, и мост работает от напряжения чуть ниже 3,3 V. Поскольку измерение ратиометрическое, коэффициент почти не меняется; лишь немного растёт шум. Кроме того, ESP32 сразу готова к Wi-Fi: показать вес на веб-странице или отправить уведомление на телефон, когда миска с кормом опустела, можно всего несколькими дополнительными строками. Для начала прочитай Что такое ESP32? На весах для улья с питанием от батареи HX711 между измерениями усыпляют через scale.power_down(), а ESP32 — через глубокий сон. Чтобы SCK оставался в HIGH, пока ESP32 спит, зафиксируй пин через gpio_hold_en(); иначе он повиснет в воздухе, и HX711 может проснуться сам. И не забудь отбросить измерения первых 400 мс после пробуждения.
HX711 с Raspberry Pi Pico (MicroPython)
В MicroPython нет готового модуля для HX711, но протокол настолько прост, что драйвер можно написать своими руками в несколько строк. Класс ниже ждёт, пока линия DT уйдёт в LOW, считывает данные, подавая 24 импульса на SCK, отправляет 1–3 дополнительных импульса для выбора усиления и переводит результат из дополнительного кода в число со знаком. На время чтения прерывания ненадолго отключаются, поэтому линия SCK никогда не остаётся в HIGH дольше 60 µs, и HX711 случайно не засыпает. Об установке MicroPython читай в статье Что такое Raspberry Pi Pico?
1from machine import Pin
2import machine
3import time
4
5class HX711:
6 def __init__(self, dt, sck, gain=128):
7 self.dt = Pin(dt, Pin.IN)
8 self.sck = Pin(sck, Pin.OUT, value=0)
9 self.extra = {128: 1, 64: 3, 32: 2}[gain] # toplam 25, 27, 26 darbe / 25, 27, 26 pulses in total
10 self.offset = 0
11 self.scale = 1.0
12 self.read() # kazancı ayarla / set the gain
13
14 def read(self, timeout_ms=1000):
15 start = time.ticks_ms()
16 while self.dt.value() == 1: # DT LOW ise veri hazır / data ready when DT is LOW
17 if time.ticks_diff(time.ticks_ms(), start) > timeout_ms:
18 raise OSError("HX711 yanit vermiyor / not responding")
19 irq = machine.disable_irq() # SCK 60 µs'den uzun HIGH kalmasın / keep SCK HIGH under 60 µs
20 value = 0
21 for _ in range(24):
22 self.sck.value(1)
23 value = (value << 1) | self.dt.value()
24 self.sck.value(0)
25 for _ in range(self.extra): # sonraki ölçümün kanalı ve kazancı / next channel and gain
26 self.sck.value(1)
27 self.sck.value(0)
28 machine.enable_irq(irq)
29 if value & 0x800000: # ikiye tümleyen / two's complement
30 value -= 0x1000000
31 return value
32
33 def read_average(self, times=10):
34 return sum(self.read() for _ in range(times)) / times
35
36 def tare(self, times=15):
37 self.offset = self.read_average(times)
38
39 def get_units(self, times=5):
40 return (self.read_average(times) - self.offset) / self.scale
41
42
43hx = HX711(dt=15, sck=14) # DT -> GP15, SCK -> GP14
44print("Tarti bos, dara aliniyor... / Scale empty, taring...")
45hx.tare()
46hx.scale = 429.5 # kendi faktörün / your own factor
47
48while True:
49 print("{:.1f} g".format(hx.get_units()))
50 time.sleep_ms(200)Логика калибровки та же, что на Arduino: при hx.scale = 1.0 положи груз известного веса и раздели результат get_units() на его вес в граммах — получится коэффициент. На Pico HX711 тоже питай от пина 3V3(OUT). Чтобы показать вес на экране, добавь OLED с драйвером ssd1306.py и выводи значение через oled.text().
Идеи проектов с HX711 и тензодатчиком
- Кухонные весы: датчик на 5 кг, кнопка тары и OLED-дисплей — весы с разрешением 1 г.
- Напольные весы: четыре датчика из старых напольных весов, HX711 и I2C LCD, показывающий килограммы.
- Умная кормушка для питомца: когда вес миски опускается ниже заданного, ESP32 отправляет уведомление, а сервопривод открывает заслонку и подсыпает корм.
- Весы для цветочного горшка: определяй, сколько воды нужно растению, по тому, насколько полегчал горшок, и сравнивай результат с датчиком влажности почвы.
- Мониторинг улья: поставь 4 датчика под улей, следи за медосбором по ежедневному приросту веса и записывай данные по Wi-Fi.
- Счётчик деталей: научи весы весу одного винта и определяй по общему весу, сколько винтов в коробке.
- Запись данных: отправляй показания на компьютер по последовательному порту и строй графики методом передачи данных в Excel.
Частые ошибки и как их исправить
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Программа зависает на строке read() | DT или SCK не подключены, либо в коде неверный номер пина | Проверь провода и используй wait_ready_timeout() |
| Значение всегда 8388607 или -8388608 | Вход в насыщении: обрыв A+/A- или перепутаны провода E и A | Проверь цвета проводов мультиметром |
| Значение всегда 0 | Линия DT застряла в LOW, модуль без питания | Измерь подключения VCC, GND и DT |
| Значение уменьшается при добавлении веса | Перепутаны A+ и A- | Поменяй провода или используй отрицательный коэффициент |
| Показание всё время медленно уплывает | Прогрев, ползучесть, нет связи E- с GND, напряжённое крепление | Дождись прогрева, измерь E- – GND, исправь крепление |
| Значения скачут на несколько граммов | Длинные провода, шумное питание, прогибающаяся пластина | Укороти провода, добавь конденсаторы, усредняй |
| Вес зависит от положения груза | Пластина прогибается, или один из 4 датчиков не нагружен | Сделай пластину жёсткой и выставь датчики на одну высоту |
| Малые грузы верно, большие — нет | Коэффициент найден по слишком маленькому грузу | Перекалибруй грузом около половины ёмкости |
Когда тензодатчик с HX711 правильно закреплён и откалиброван, у тебя в руках устройство, которое из дешёвых деталей измеряет с точностью до грамма. Сохрани калибровочный коэффициент, сделай прочную механику и настрой фильтр под скорость своего проекта; остальное зависит от твоей фантазии. Чтобы шире взглянуть на измерения, загляни в руководство по датчикам Arduino. В приложении BlueGrays есть проекты с чтением датчиков, выводом значений на LCD- и OLED-дисплеи и записью данных на ESP32, с пошаговыми схемами и кодом, так что их можно объединить с твоими весами.
Частые вопросы
Какой вес может измерить HX711?
У самого HX711 нет предела в килограммах; максимальный вес определяется ёмкостью тензодатчика. С датчиком на 1 кг можно измерять 1 кг, а с четырьмя датчиками по 50 кг — 200 кг. HX711 лишь превращает выход моста уровня микровольт в 24-битное число.
Как рассчитать калибровочный коэффициент HX711?
Сначала выставь тару пустых весов через tare(), затем положи предмет известного веса и прочитай сырое значение с учётом тары через get_value(). Раздели это значение на вес предмета в граммах и получишь коэффициент; например, если 500 г дают 214 750, коэффициент равен 429.5. Когда коэффициент передан в set_scale(), get_units() сразу возвращает граммы.
Почему показания HX711 постоянно скачут?
Самые частые причины — прогибающаяся или плохо закреплённая пластина, длинные и болтающиеся провода, шумное питание от USB и прогрев. Закрепи датчик на проставках, чтобы его середина была свободна, укороти провода, дай ему прогреться несколько минут и используй усреднение или программный фильтр. На некоторых дешёвых платах постоянный дрейф вызывает ещё и клемма E-, не соединённая с GND.
Что означают цвета проводов тензодатчика?
У распространённых балочных тензодатчиков красный идёт на E+, чёрный на E-, белый на A-, зелёный на A+. Поскольку цвета у разных производителей могут отличаться, надёжнее всего измерить мультиметром: пара возбуждения и сигнальная пара показывают около 1000 Ω каждая. Если при добавлении веса значение уменьшается, просто поменяй местами провода A+ и A-.
Работает ли HX711 от 3,3 V?
Да, HX711 работает от 2,6 до 5,5 V, а на ESP32 и Pico модуль нужно питать от 3,3 V, иначе линия DT работает на 5 V. При 3,3 V мост получает меньшее напряжение возбуждения, но поскольку измерение ратиометрическое, калибровочный коэффициент почти не меняется; лишь немного растёт шум.
Можно ли использовать один тензодатчик на 50 кг с HX711?
Да, но чтобы дополнить 3-проводной полумостовой датчик до полного моста, нужны два резистора по 1 kΩ с очень близкими номиналами. Крайние провода идут на E+ и E-, средний — на A+, а средняя точка двух резисторов — на A-. Для более стабильного результата лучше использовать вместе два или четыре датчика.
Что собрать после прочтения
Все проекты
Измерение расстояния HC-SR04 (вывод в порт)
Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

Температура и влажность с DHT11
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

Цифровой вольтметр с LCD-дисплеем
Узнай, какое напряжение даёт батарейка или блок питания, с помощью измерителя, собранного своими руками. Делитель из двух резисторов понижает высокое напряжение до уровня, который может прочитать плат

LCD-экран с I2C
Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо

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

Измерение температуры с NTC и LCD-дисплеем 2x16
Измерь температуру вокруг с помощью датчика, похожего на крошечную бусинку. Эта деталь, NTC, при нагреве легче пропускает электричество; Arduino читает это изменение, по формуле переводит его в градус

I2C LCD-дисплей (16x2) на ESP32
В этом проекте символьный LCD-экран 16x2 подключается к ESP32 по протоколу I2C и выводит текст. Благодаря I2C экраном можно управлять всего двумя пинами данных (SDA и SCL), не тратя 6+ пинов, как при классическом параллельном подключении. Код печатает постоянное сообщение в первой строке и счётчик, растущий каждую секунду, во второй. Кроме того, при запуске работает сканер I2C, который выводит адрес дисплея в монитор порта.

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
Собери на ESP32 регистратор температуры с отметками времени! Каждую минуту читай температуру и влажность с DHT22, бери реальное время из DS1307 RTC и записывай всё на карту microSD в формате CSV. OLED показывает текущую температуру (крупным шрифтом), влажность в процентах, время и счётчик записей. Файл /temp_log.csv на SD-карте открывается в Excel, Google Sheets или Python pandas — идеально для теплиц, комнат, лабораторий и хранения продуктов.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

