Симулятор HX711 онлайн — весы на Arduino
HX711 это 24-битный АЦП, специально сделанный для тензодатчиков. Он измеряет слабый сигнал моста Уитстона, усиливает его в 64 или 128 раз и оцифровывает с точностью до 0.02 процента от максимума. На выходе получаются готовые весы, и для этого не нужен дорогой АЦП общего назначения.
В симуляторе HX711 виртуальный: есть ползунок нагрузки от 0 до 5000 граммов и кнопка «Тара». Код HX711 scale и scale.begin(DT, SCK), и виджет появляется на стенде, а get_units возвращает вес с ползунка.
Главный практический вывод из этого: логику весов удобнее отлаживать в браузере. Там видно, как работает тара, как считается масштаб и почему показания скачут, а на настоящем железе для проверки нужен ещё и груз, который точно известен.
Тензодатчик: мост Уитстона
Тензодатчик, он же load cell, устроен так: четыре тензорезистора наклеены на алюминиевую балку, два из них растягиваются, а два сжимаются. При нагрузке сопротивления меняются в разные стороны, и мост из четырёх резисторов начинает выдавать на выходе разность напряжений. Эта разность очень мала: у типового датчика чувствительность около 2 мВ на вольт питания, то есть при 5 В мост выдаёт порядка 10 мВ на полной нагрузке.
HX711 подаёт на мост питание, измеряет разность, усиливает её и оцифровывает. Отсюда два важных следствия. Первое: питание моста должно быть стабильным, иначе температурный дрейф и просадка превращаются в ошибку измерения. Второе: АЦП должен иметь очень низкий собственный шум, иначе он просто не увидит такой маленький сигнал, поэтому в HX711 встроен PGA с коэффициентами 64 и 128.
Калибровка и тара
Есть две разные поправки, и их нельзя путать. Тара обнуляет текущий вес: вы ставите пустую чашку, вызываете tare, и дальше прибор показывает вес только содержимого. Масштаб переводит сырые показания АЦП в граммы: это коэффициент, который зависит от конкретного датчика и от напряжения питания. Именно его и находят калибровкой.
Порядок калибровки такой: запускаете скетч, видите сырое значение, кладёте груз известной массы, например 500 граммов, снова смотрите сырое значение и делите разность на массу. Полученное число и есть scale, его задают через set_scale. Для распространённых 5-килограммовых датчиков с библиотекой bogdan это число обычно попадает в диапазон от 2000 до 2500, но у конкретного датчика оно своё.
Грабль калибровки: тару нужно обнулять после прогрева и после подачи питания мосту, иначе нулевая точка будет смещена. Датчику нужно несколько минут на прогрев, первые показания после включения могут «гулять». Ещё один момент: масштаб зависит от напряжения питания моста, поэтому калибровать и работать нужно при одном и том же питании.
Код: весы с тарой
#include "HX711.h"HX711 scale;void setup() { Serial.begin(9600); scale.begin(2, 3); // DT=2, SCK=3 Serial.println("Калибровка: уберите всё с весов"); scale.tare(20); // 20 чтений для точности Serial.println("Готово. Кладите груз.");}void loop() { if (scale.is_ready()) { float w = scale.get_units(10); // 10 чтений, среднее Serial.print("Вес: "); Serial.print(w); Serial.println(" г"); } delay(500);}Метод begin принимает два номера пинов: DT это выход данных датчика, а SCK это тактовый сигнал. Их можно назначить на любые свободные цифровые пины. Важно не путать DT и SCK местами: если перепутать, датчик не ответит и is_ready() будет всегда возвращать false.
Усреднение в get_units(10) означает, что метод делает десять чтений и возвращает среднее. Это убирает случайный шум, но замедляет отклик: при частоте 10 измерений в секунду одно чтение занимает 100 мс, и десять чтений это уже целая секунда. Для быстрых весов усреднять нужно меньше или использовать частоту 80 Гц, переключаемую выводом RATE.
Про подключение тензодатчика. У четырёхпроводного датчика цвета стандартные: красный это плюс питания моста, чёрный это минус, а белый и жёлтый это выходы моста. На плате HX711 они подписаны как E+, E-, A+ и A-. Какой из двух выходов считать плюсом, зависит от партии датчика, поэтому после первого подключения обязательно проверьте знак: положите груз и посмотрите, растёт показание или падает. Если падает, поменяйте местами выходы моста, и это не поломка.
| Параметр | Значение | Заметка |
|---|---|---|
| Разрядность | 24 бит | 16.8M отсчётов |
| Коэффициент усиления | 64/128 | Выбор каналом |
| Частота семплирования | 10/80 Гц | RATE-пин |
| Диапазон тензодатчика | 1 г - 50 кг | Зависит от load cell |
| Ток | 1.6 мА активный | 1600 мкА (низкий) |
Что сначала не получилось
Первые показания у меня были со знаком минус, и я решил, что перепутал провода датчика. Поменял местами красный и чёрный, стало только хуже, потому что так мост вообще перестал работать. Пришлось вернуть всё как было и проверить знак правильно: положить груз и посмотреть, растёт значение или падает. Оказалось, что достаточно было поменять местами два провода выхода моста, и всё заработало.
Второй затык был в медленном отклике. Я считал, что get_units считает одно значение, и удивлялся, что вес обновляется раз в секунду. Оказалось, что усреднение по умолчанию берёт 10 чтений, а при частоте 10 Гц это ровно секунда. Уменьшил число чтений до двух и переключил частоту на 80 Гц, отклик стал заметно быстрее.
Личный опыт: весы для кухни
Первое, что я собрал, были весы для кухни: платформа, под ней ячейка на 5 кг, сверху LCD. Задача была не самочувствие, а стабильность: на кухне рядом с плитой температура гуляет, и обычный дешёвый датчик заметно уплывает.
Проверял я это по эталону: гиря 500 граммов, гиря 200 граммов и пустая чашка. Пустая чашка давала 3-4 грамма, и это была ненулевая тара, потому что я не вызывал tare после установки платформы. Гиря 500 граммов показывала 498-502 грамма, то есть расхождение укладывалось в погрешность около ±0.4 процента, и это соответствовало заявленной точности. Вывод из этого простой: тару обнуляйте всегда после того, как механика собрана, а не только в начале работы.
Авторская позиция: что взять новичку
Начинайте с симулятора. Серьёзно: большая часть ошибок в калибровке это арифметика, и в браузере вы проверяете её за минуту, без грузов. Дальше на железе первым делом проверьте знак и обнулите тару, и только потом переходите к подбору масштаба. Сам датчик выбирайте по групу: 5 килограммов для кухонных весов, 50 килограммов для напольного инвентаря. И помните, что HX711 измеряет только вес, но не даёт питания мосту: там нужен отдельный источник 5 В, а питать мост от вывода 5 В платы рискованно из-за просадок.