HX711: подключение к ESP32 и Arduino

АЦП для тензодатчика (весы)

24-битный АЦП для тензодатчиков — из него и балки получаются весы. Два провода к контроллеру, калибровка грузом известной массы.

Как работает

Тензодатчик — мост из резисторов, которые чуть меняют сопротивление при изгибе балки. Сигнал — милливольты, поэтому нужен HX711: усилитель с коэффициентом 128 и АЦП на 24 бита. Данные читаются по двум проводам — DT (данные) и SCK (такт).

Библиотека HX711: scale.begin(DT, SCK), scale.tare() — обнулить пустые весы, scale.set_scale(k) — коэффициент, scale.get_units(10) — среднее из десяти измерений в граммах.

Выводы

ВыводНазначение
DTданные (DOUT)
SCKтактовый сигнал (PD_SCK)
VCCпитание
GNDобщий провод

Подключение к ESP32

HX711ESP32
DTGPIO16
SCKGPIO4
VCC3V3
GNDGND

Схема из примера «HX711: сырые отсчёты».

HX711: сырые отсчёты

Открыть пример целиком
Код скетча
#include <HX711.h>

HX711 scale;

void setup() {
  Serial.begin(115200);
  delay(200);
  scale.begin(16, 4);          // данные, такт
  Serial.println("сырые отсчёты, меняйте вес в свойствах датчика");
}

void loop() {
  // Ждать готовности обязательно. Вызов read() до неё блокирует
  // скетч до следующего измерения, а тактирование напролом даёт
  // сдвинутые разряды: вес прыгает без всякой видимой причины.
  if (!scale.is_ready()) {
    delay(10);
    return;
  }

  long raw = scale.read();
  Serial.printf("отсчёт %ld\n", raw);
  delay(300);
}

Подключение к Arduino Uno

HX711Arduino Uno
DTD4
SCKD5
VCC5V
GNDGND

Схема из примера «Arduino Uno: весы на тензодатчике».

Arduino Uno: весы на тензодатчике

Открыть пример целиком
Код скетча
#include <HX711.h>

// Весы: тензодатчик и усилитель HX711 на выводах 4 и 5.
//
// Микросхема отдаёт двадцать четыре разряда, вытактованные вручную по
// двум проводам. Это не шина и не аналоговый вход: собственного
// аналогового входа у Uno на такой сигнал не хватило бы — мост даёт
// милливольты, а разрешение нужно в тысячные доли.
//
// Сырые отсчёты сами по себе не значат ничего. Их превращают в граммы
// две настройки, и обе делаются один раз руками.
//
// **Тарирование** — сколько показывает пустая платформа. Это ноль, и
// он уезжает от температуры, поэтому tare() зовут при каждом запуске.
//
// **Масштаб** — сколько отсчётов приходится на грамм. Кладут известный
// груз, делят разницу на его вес и записывают число в скетч. Другого
// способа нет: коэффициент зависит от конкретного датчика и от того,
// как он закреплён.

HX711 scale;

const int DT = 4;
const int SCK_PIN = 5;

void setup() {
  Serial.begin(9600);
  scale.begin(DT, SCK_PIN);

  // Число из калибровки. У вашего датчика оно будет другим.
  scale.set_scale(420.0);

  Serial.println(F("уберите груз — тарирую"));
  delay(500);
  scale.tare();
  Serial.println(F("готово"));
}

void loop() {
  // Среднее по пяти измерениям: одиночный отсчёт дрожит на единицы
  // граммов, и по нему ничего не решают.
  float grams = scale.get_units(5);

  Serial.print("g:");
  Serial.println(grams, 1);

  delay(500);
}

В железе

Балка подключается к HX711 четырьмя проводами: обычно красный — E+, чёрный — E−, белый — A−, зелёный — A+. Если вес растёт в минус — поменяйте местами A+ и A−.

Частые ошибки

Другие детали