Здравствуйте. Занялся проектом умной пасеки. Проект как и код взяты со странички https://habr.com/ru/post/444326/ что говорит о том что прошивка рабочая.
Но. Пытаюсь скомпилировать код, и выдает ошибку no matching function for call to ‘HX711::HX711(int, int)’
Arduino: 1.8.19 (Windows 10), Плата:»Arduino Pro or Pro Mini, ATmega328P (3.3V, 8 MHz)»
bee:6:20: error: no matching function for call to ‘HX711::HX711(int, int)’
HX711 scale0(10, 14);
^
In file included from C:UsersAlekseyDocumentsArduinoprojectsbeebe e.ino:4:0:
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:30:3: note: candidate: HX711::HX711()
HX711();
^~~~~
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:30:3: note: candidate expects 0 arguments, 2 provided
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:19:7: note: candidate: constexpr HX711::HX711(const HX711&)
class HX711
^~~~~
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:19:7: note: candidate expects 1 argument, 2 provided
bee:7:20: error: no matching function for call to ‘HX711::HX711(int, int)’
HX711 scale1(11, 14);
^
In file included from C:UsersAlekseyDocumentsArduinoprojectsbeebe e.ino:4:0:
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:30:3: note: candidate: HX711::HX711()
HX711();
^~~~~
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:30:3: note: candidate expects 0 arguments, 2 provided
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:19:7: note: candidate: constexpr HX711::HX711(const HX711&)
class HX711
^~~~~
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:19:7: note: candidate expects 1 argument, 2 provided
bee:8:20: error: no matching function for call to ‘HX711::HX711(int, int)’
HX711 scale2(12, 14);
^
In file included from C:UsersAlekseyDocumentsArduinoprojectsbeebe e.ino:4:0:
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:30:3: note: candidate: HX711::HX711()
HX711();
^~~~~
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:30:3: note: candidate expects 0 arguments, 2 provided
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:19:7: note: candidate: constexpr HX711::HX711(const HX711&)
class HX711
^~~~~
C:Program Files (x86)ArduinolibrariesHX711-mastersrc/HX711.h:19:7: note: candidate expects 1 argument, 2 provided
exit status 1
no matching function for call to ‘HX711::HX711(int, int)’
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
Помогите разобраться, как исправить ошибку.
If it is displaying weird characters.
You may need to change the baud rate displayed on your serial monitor.
Alternatively, you can try to use this code.
`#include «HX711.h»
// HX711.DOUT — pin #A1
// HX711.PD_SCK — pin #A0
HX711 scale(A1, A0); // parameter «gain» is ommited; the default value 128 is used by the library
void setup() {
Serial.begin(9600);
Serial.println(«HX711 Demo»);
Serial.println(«Before setting up the scale:»);
Serial.print(«read: tt»);
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print(«read average: tt»);
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(«get value: tt»);
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)
Serial.print(«get units: tt»);
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
// by the SCALE parameter (not set yet)
scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0
Serial.println(«After setting up the scale:»);
Serial.print(«read: tt»);
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print(«read average: tt»);
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print(«get value: tt»);
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()
Serial.print(«get units: tt»);
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided
// by the SCALE parameter set with set_scale
Serial.println(«Readings:»);
}
void loop() {
Serial.print(«one reading:t»);
Serial.print(scale.get_units(), 1);
Serial.print(«t| average:t»);
Serial.println(scale.get_units(10), 1);
scale.power_down(); // put the ADC in sleep mode
delay(5000);
scale.power_up();
}`
Общие сведения:
Тензодатчики (типа «мост» и типа «полу-мост») и микросхема HX711 — связка, которая позволит создавать устройства для измерения веса или давления, оказываемого на поверхность датчика, а затем передавать эти показания (с высокой точностью) на плату Arduino.
Видео:
Спецификация:
Спецификация HX711
- Разрядность АЦП: 24 бит;
- Коэффициент усиления:
- Вход А: 64 или 128;
- Вход В: 32;
- Частота измерений: 10/80 Гц;
- Напряжение питания: 5В;
- Потребляемый ток: до 10 мА;
- Размеры: 34мм х 21мм;
Спецификация тензодатчиков мостовых
- Максимальный вес: 1/5/10/20 кг;
- Отверстия под винты: M4/M5 (подходит под винт с потайной головкой);
- Размеры: 14мм х 14мм х 80.5мм;

Спецификация тензодатчика полумостового
- Максимальный вес: 50 кг;
- Размеры: 34мм х 34мм х 9мм;
Подробнее о плате HX711:
Микросхема HX711 позволяет с высокой точностью получать показания веса или давления, оказываемого на тензодатчик (он же — тензорезистор).
Микросхема имеет 2 канала считывания показания счётчика: А и В:
- Канал А имеет возможность выбора коэффициента усиления: 64 или 128.
- Канал В имеет фиксированный коэффициент усиления, равный 32.
Это позволяет подключать к микросхеме HX711 до 2 независимых тензодатчиков! Однако, следует помнить, что чем выше коэффициент усиления, тем выше точность измерения показаний.
Подробнее о датчиках:
Тензорезистивные датчики предназначены для создания на их основе весов, датчиков давления или концевых датчиков.
В основе своей конструкции имеют тонкоплёночные резисторы, которые изменяют своё сопротивление при деформации.
Существует 2 версии данных датчиков:
- 1 — те, в которых резисторы объединены в мост, подключённый непосредственно к АЦП, который фиксирует изменения значений резисторов. Датчики выполнены из алюминия, имеют форму бруска с 4 отверстиями на одной плоскости и особым сдвоенным отверстием на другой. При установке датчике в рабочее положение необходимо жёстко закрепить одну его сторону, а на вторую установить (при необходимости) платформу для завешивания грузов. Имеют на выходе из датчика 4 провода.
Схема устройства и подключения мостового датчика к микросхеме HX711:

- 2 — те, в которых резисторы объединены в полумост, подключаются между собой, чтобы образовать полный мост и, затем, подключаются к АЦП, который фиксирует изменения значений резисторов. Имеют на выходе из датчика 3 провода. Схема их устройства и подключения следующая:
Схема устройства и подключения полу-мостового датчика к микросхеме HX711:
Для 1 тензодатчика:

Для 4 тензодатчиков:

Обратите внимание на то, что если полученные значения имеют отрицательный знак, то вам следует поменять местами датчики, подключенные к выводам А+ и А —
Следует также отметить, что показания тензодатчиков зависят от температуры окружающей среды — при разных температурах показания могут отличаться. Помните это и используйте «тарирование» (обнуление значений датчика) каждый раз при резких перепадах температуры. Если же работа датчика предполагается в условиях перепада температур в известном диапазоне, то вы можете воспользоваться одним из датчиков температуры и создать таблицу зависимости калибровочного коэффициента (calibration_factor) от температуры.
Подключение:
Микросхема HX711
На плате есть два разъёма – P1 и P2, на которых имеются следующие обозначения:
Разъём P1
- GND — земля;
- VCC — питание 5В;
- DT, SCK – информационные выводы;
Разъём P2
- E– , E+ — питание тензорного моста;
- A– , A+ — подключение канала А;
- В– , В+ — подключение канала В;
Тензодатчик (мостовой)
У данного тензодатчика 4 выходных провода:
| Провода тензодатчика | Выводы микросхемы HX711 |
| Красный провод | E+ |
| Чёрный провод | E- |
| Зелёный провод | A- |
| Белый провод | A+ |
Тензодатчик (полумостовой)
У данного тензодатчика 3 выходных провода:
| Провода тензодатчика | Выводы микросхемы HX711 |
| Красный провод | E+ |
| Чёрный провод | E- |
| Белый провод | A+ |
В схему необходимо добавить делитель напряжения и выход подключить к плате HX711 (см. рисунок выше!):
| Провода тензодатчика | Выводы микросхемы HX711 |
|---|---|
| Зелёный провод | A- |
HX711
Данная плата подключается к Arduino по 4 проводам:
| Выводы микросхемы HX711 | Выводы Arduino |
| GND | GND |
| VCC | 5V |
| DT | любой цифровой вывод (указывается в скетче) |
| SCK | любой цифровой вывод (указывается в скетче) |
Подключение HX711 к Arduino можно осуществить одним из 2 способов:
- Напрямую к плате Arduino/Piranha UNO:

- К одному из шилдов для подключения:

Питание:
Входное напряжение 5В, подаётся на выводы Vcc (V) и GND (G).
Примеры:
Калибровочный скетч для мостового датчика
#include "HX711.h" // подключаем библиотеку для работы с АЦП и тензодатчиками
HX711 scale; // создаём объект scale для работы с тензодатчиком
uint8_t DOUT_PIN = 7; // указываем вывод DOUT, к которому подключен HX711
uint8_t SCK_PIN = 6; // указываем вывод SCK , к которому подключен HX711
float weight_of_standard = 167.8; // указываем эталонный вес
float conversion_rate = 0.035274; // указываем коэффициент для перевода из унций в граммы
const int z = 10; // указываем количество измерений, по которым будет найдено среднее значение
float calibration_value[z]; // создаём массив для хранения считанных значений
float calibration_factor = 0; // создаём переменную для значения калибровочного коэффициента
void setup() {
Serial.begin(57600); // инициируем работу с последовательным портом на скорости 57600 бод
scale.begin(DOUT_PIN, SCK_PIN); // инициируем работу с платой HX711, указав номера выводов Arduino, к которым подключена плата
scale.set_scale(); // не калибруем полученные значения
scale.tare(); // обнуляем вес на весах (тарируем)
Serial.println("You have 10 seconds to set your known load"); // выводим в монитор порта текст о том, что у вас есть 10 секунд для установки эталонного веса на весы
delay(10000); // ждём 10 секунд
Serial.print("calibration factor: "); // выводим текст в монитор поседовательного порта
for (int i = 0; i < z; i++) { // запускаем цикл, в котором
calibration_value[i] = scale.get_units(1) / (weight_of_standard / conversion_rate); // считываем значение с тензодатчика и переводим его в граммы
calibration_factor += calibration_value[i]; // суммируем все значения
}
calibration_factor = calibration_factor / z; // делим сумму на количество измерений
Serial.println(calibration_factor); // выводим в монитор порта значение корректирующего коэффициента
}
void loop() {}
Вывод значений веса с 1 мостового тензодатчика
в монитор последовательного порта (после калибровки)
#include "HX711.h" // подключаем библиотеку для работы с тензодатчиком
#define DT A0 // Указываем номер вывода, к которому подключен вывод DT датчика
#define SCK A1 // Указываем номер вывода, к которому подключен вывод SCK датчика
HX711 scale; // создаём объект scale
float calibration_factor = -14.15; // вводим калибровочный коэффициент
float units; // задаём переменную для измерений в граммах
float ounces; // задаём переменную для измерений в унциях
void setup() {
Serial.begin(9600); // инициируем работу последовательного порта на скорости 9600 бод
scale.begin(DT, SCK); // инициируем работу с датчиком
scale.set_scale(); // выполняем измерение значения без калибровочного коэффициента
scale.tare(); // сбрасываем значения веса на датчике в 0
scale.set_scale(calibration_factor); // устанавливаем калибровочный коэффициент
}
void loop() {
Serial.print("Reading: "); // выводим текст в монитор последовательного порта
for (int i = 0; i < 10; i ++) { // усредняем показания, считав значения датчика 10 раз
units = + scale.get_units(), 10; // суммируем показания 10 замеров
}
units = units / 10; // усредняем показания, разделив сумму значений на 10
ounces = units * 0.035274; // переводим вес из унций в граммы
Serial.print(ounces); // выводим в монитор последовательного порта вес в граммах
Serial.println(" grams"); // выводим текст в монитор последовательного порта
}
Вывод значений веса с 4 мостовых тензодатчиков в монитор последовательного порта (после калибровки)
#include "HX711.h" // подключаем библиотеку для работы с платой HX711
HX711 load_cells[4]; // создаём 4 объекта для работы с тензодатчиками
const uint8_t CLK[4] = { 2, 4, 6, 8}; // создаём массив с номерами выводов Arduino, к которым подключен вывод SCK
const uint8_t DOUT[4] = { 3, 5, 7, 9}; // создаём массив с номерами выводов Arduino, к которым подключен вывод DOUT
const float GAIN[4] = { -14.16, -14.14, -8.58, -13.45}; // создаём массив с корректирующими коэффициентами для каждого датчика
float loads[4] = { 0.0, 0.0, 0.0, 0.0}; // создаём массив для хранения значений с каждого датчика
float total_load = 0.0; // создаём переменную для хранения конечного значения веса
uint8_t BUTTON_PIN = A0; // указываем вывод, к которому подключена кнопка тары
float conversion_rate = 0.035274; // указываем коэффициент для перевода из унций в граммы
void setup() {
Serial.begin(57600); // инициируем работу с последовательным портом на скорости 57600 бод
pinMode(BUTTON_PIN, INPUT_PULLUP); // настраиваем вывод для работы с кнопкой в режим ВХОДА
for (int i = 0; i < 4; i++) { // выполняем цикл, в котором
load_cells[i].begin(DOUT[i], CLK[i]); // выполняем инициализацию 4 тензодатчиков
load_cells[i].set_scale(GAIN[i]); // устанавливаем корректирующие коэффициенты для каждого тензодатчика
load_cells[i].tare(); // обнуляем значение на каждом датчике (тарируем)
}
}
void loop() {
if (digitalRead(BUTTON_PIN)) { // если кнопка была нажата, то
Serial.println("Button push!"); // выводим текст в монитор последовательного порта о том, что кнопка была нажата
for (int i = 0; i < 4; i++) { // выполняем цикл, в котором
load_cells[i].tare(); // обнуляем значения веса на каждом тензодатчике
}
}
total_load = 0.0; // обнуляем значение измеренного веса
for (int i = 0; i < 4; i++) { // выполняем цикл, в котором
loads[i] = load_cells[i].get_units(1) * conversion_rate; // считываем значение веса на каждом тензодатчике и преобразуем их из унций в граммы
total_load += loads[i]; // суммируем все значения
}
Serial.println(total_load); // выводим в монитор последовательного порта значение веса
delay(700); // ждём 700 мс
}
Калибровочный скетч для полумостового датчика
#include "HX711.h" // подключаем библиотеку для работы с АЦП и тензодатчиками
HX711 scale; // создаём объект scale для работы с тензодатчиком
uint8_t DOUT_PIN = 3; // указываем вывод DOUT, к которому подключен HX711
uint8_t SCK_PIN = 2; // указываем вывод SCK , к которому подключен HX711
float weight_of_standard = 637; // указываем эталонный вес
float conversion_rate = 0.035274; // указываем коэффициент для перевода из унций в граммы
float calibration_factor = 0; // создаём переменную для значения калибровочного коэффициента
void setup() {
Serial.begin(57600); // инициируем работу с последовательным портом на скорости 57600 бод
scale.begin(DOUT_PIN, SCK_PIN); // инициируем работу с платой HX711, указав номера выводов Arduino, к которым подключена плата
scale.set_scale(); // не калибруем полученные значения
scale.tare(); // обнуляем вес на весах (тарируем)
Serial.println("You have 10 seconds to set your known load"); // выводим в монитор порта текст о том, что у вас есть 10 секунд для установки эталонного веса на весы
delay(10000); // ждём 10 секунд
Serial.print("calibration factor: "); // выводим текст в монитор поседовательного порта
calibration_factor = scale.get_units(10) / (weight_of_standard / conversion_rate); // считываем значение с тензодатчика
Serial.println(calibration_factor); // выводим в монитор порта значение корректирующего коэффициента
}
void loop() {}
Вывод значений веса с 1 полумостового тензодатчика в монитор последовательного порта (после калибровки)
#include "HX711.h" // подключаем библиотеку для работы с тензодатчиком
uint8_t DOUT_PIN = 3; // указываем вывод DOUT, к которому подключен HX711
uint8_t SCK_PIN = 2; // указываем вывод SCK , к которому подключен HX711
HX711 scale; // создаём объект scale
float calibration_factor = -0.64; // вводим калибровочный коэффициент
float units; // задаём переменную для измерений в граммах
float ounces; // задаём переменную для измерений в унциях
void setup() {
Serial.begin(57600); // инициируем работу последовательного порта на скорости 9600 бод
scale.begin(DOUT_PIN, SCK_PIN); // инициируем работу с датчиком
scale.set_scale(); // выполняем измерение значения без калибровочного коэффициента
scale.tare(); // сбрасываем значения веса на датчике в 0
scale.set_scale(calibration_factor); // устанавливаем калибровочный коэффициент
}
void loop() {
Serial.print("Reading: "); // выводим текст в монитор последовательного порта
ounces = scale.get_units(10); // получаем значение с датчика, усреднённое по 10 измерениям
units = ounces * 0.035274; // переводим вес из унций в граммы
Serial.print(ounces); // выводим в монитор последовательного порта вес в граммах
Serial.println(" grams"); // выводим текст в монитор последовательного порта
}
Вывод значений веса с 4 полумостовых тензодатчиков, объединённых в мост в монитор последовательного порта (после калибровки)
#include "HX711.h" // подключаем библиотеку для работы с тензодатчиком
uint8_t DOUT_PIN = 3; // указываем вывод DOUT, к которому подключен HX711
uint8_t SCK_PIN = 2; // указываем вывод SCK , к которому подключен HX711
HX711 scale; // создаём объект scale
float calibration_factor = -0.77; // вводим калибровочный коэффициент
float units; // задаём переменную для измерений в граммах
float ounces; // задаём переменную для измерений в унциях
void setup() {
Serial.begin(57600); // инициируем работу последовательного порта на скорости 9600 бод
scale.begin(DOUT_PIN, SCK_PIN); // инициируем работу с датчиком
scale.set_scale(); // выполняем измерение значения без калибровочного коэффициента
scale.tare(); // сбрасываем значения веса на датчике в 0
scale.set_scale(calibration_factor); // устанавливаем калибровочный коэффициент
}
void loop() {
Serial.print("Reading: "); // выводим текст в монитор последовательного порта
ounces = scale.get_units(10); // получаем значение с датчика, усреднённое по 10 измерениям
units = ounces * 0.035274; // переводим вес из унций в граммы
Serial.print(ounces); // выводим в монитор последовательного порта вес в граммах
Serial.println(" grams"); // выводим текст в монитор последовательного порта
}
Описание функций библиотеки:
Подключение библиотеки:
#include "HX711.h" // подключаем библиотеку для работы с платой HX711 #define DT A0 // Указываем номер вывода, к которому подключен вывод DT #define SCK A1 // Указываем номер вывода, к которому подключен вывод SCK HX711 scale; // создаём объект для работы с тензодатчиком
Функция begin();
- Назначение: инициирование работы микросхемы;
- Синтаксис: begin(ПАРАМЕТР_1, ПАРАМЕТР_2, ПАРАМЕТР_3);
- Параметры:
- Обязательные:
- ПАРАМЕТР_1 — указание вывода Arduino, к которому подключен вывод DOUT микросхемы HX711;
- ПАРАМЕТР_2 — указание вывода Arduino, к которому подключен вывод SCK микросхемы HX711;
- Необязательный:
- ПАРАМЕТР_3 — указание коэффициента усиления по входу: 32 (канал В), 64/128 (канал А). Если параметр не указан, будет установлено значение 128.
- Обязательные:
- Возвращаемые значения: Нет;
- Примечание:
- Функцию необходимо вызвать до обращения к любым другим функциям библиотеки;
- Функцию достаточно вызвать один раз в коде
setup;
- Пример:
scale.begin(DT, SCK); // инициируем работу с датчиком
Функция is_ready();
- Назначение: проверка готовности АЦП к работе;
- Синтаксис: is_ready();
- Параметры: нет
- Возвращаемые значения:
- true — готов к работе / false — не готов;
- Примечание: нет;
- Пример:
scale.is_ready(); // проверка готовности АЦП к работе
Функция set_gain();
- Назначение: установка коэффициента усиления;
- Синтаксис: set_gain(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — значение коэффициента усиления: 32, 64, 128;
- Возвращаемые значения: нет;
- Примечание:
- Для канала А это значения 64 или 128;
- Для канала В это значение 32;
- Пример:
scale.set_gain(64); // Устанавливаем значение коэффициента усиления равным 64 (канал А)
Функция read();
- Назначение: считывание «сырых» значений из АЦП;
- Синтаксис: read();
- Параметры: нет;
- Возвращаемые значения: «сырое» значение из АЦП;
- Примечание:
- Можно указать как до функции
set_scale(), так и после неё. Это влияет на конечный результат, так как в первом случае калибровочный коэффициент не учитывается;
- Можно указать как до функции
- Пример:
scale.read(); // Считывание "сырых" значений из АЦП
Функция read_average();
- Назначение: запрос среднего значения веса из АЦП (в унциях);
- Синтаксис: read_average(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — количество измерений, взятых из АЦП, по которым вычисляется среднее значение;
- Возвращаемые значения: среднее значение измерений из АЦП;
- Примечание:
- Можно указать как до функции
set_scale(), так и после неё. Это влияет на конечный результат, так как в первом случае калибровочный коэффициент не учитывается; - Для перевода веса из унций в граммы, необходимо полученное значение умножить на
0.035274; - Пример:
scale.read_average(10); // считывание среднего значения по 10 измерениям
Функция get_value();
- Назначение: запрос значения, скорректированного с учётом веса тары (в унциях);
- Синтаксис: get_value(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — количество измерений, взятых из АЦП, по которым вычисляется среднее значение;
- Возвращаемые значения: значение веса с учётом тары;
- Примечание:
- Можно указать как до функции
set_scale(), так и после неё. Это влияет на конечный результат, так как в первом случае калибровочный коэффициент не учитывается; - Для перевода веса из унций в граммы, необходимо полученное значение умножить на
0.035274;
- Можно указать как до функции
- Пример:
scale.get_value(10); // Запрос среднего значения веса (по 10 замерам), из которого уже вычтена масса тары
Функция get_units();
- Назначение: запрос значения, скорректированного с учётом веса тары и калибровочного коэффициента (в унциях);
- Синтаксис: get_units(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — количество измерений, взятых из АЦП, по которым вычисляется среднее значение;
- Возвращаемые значения: значение веса с учётом тары и калибровочного коэффициента;
- Примечание:
- Можно указать как до функции
set_scale(), так и после неё. Это влияет на конечный результат, так как в первом случае калибровочный коэффициент не учитывается; - Для перевода веса из унций в граммы, необходимо полученное значение умножить на
0.035274; - Пример:
scale.get_units(5); // Запрос среднего значения веса (по 5 замерам), из которого уже вычтена масса тары и внесён калибровочный коэффициент
Функция tare();
- Назначение: запрос значения тары, который будет вычтен из конечного значения веса (в унциях);
- Синтаксис: tare(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — количество измерений, взятых из АЦП, по которым вычисляется среднее значение;
- Возвращаемые значения: значение веса тары;
- Примечание:
- Для перевода веса из унций в граммы, необходимо полученное значение умножить на
0.035274; - Пример:
scale.tare(3); // Запрос среднего значения веса тары (по 3 замерам)
Функция set_scale();
- Назначение: задание калибровочного коэффициента для перевода «сырых» значений АЦП в «удобочитаемые»;
- Синтаксис: set_scale(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — значение калибровочного коэффициента;
- Возвращаемые значения: нет;
- Примечание:
- Пример:
scale.set_scale(-4.5); // Установка калибровочного коэффициента
Функция get_scale();
- Назначение: запрос значения установленного калибровочного коэффициента;
- Синтаксис: get_scale();
- Параметры: нет
- Возвращаемые значения: значение калибровочного коэффициента;
- Примечание: нет;
- Пример:
scale.get_scale(); // Запрос калибровочного коэффициента
Функция set_offset();
- Назначение: задание веса тары «вручную» (в унциях);
- Синтаксис: set_offset(ПАРАМЕТР);
- Параметры:
- ПАРАМЕТР — значение веса тары (в унциях);
- Возвращаемые значения: нет;
- Примечание:
- Для перевода веса из унций в граммы, необходимо полученное значение умножить на
0.035274; - Пример:
scale.set_offset(14175); // Установка веса тары, равной 14175 унций или 500 грамм
Функция get_offset();
- Назначение: запрос значения установленного веса тары (в унциях);
- Синтаксис: get_offset();
- Параметры: нет
- Возвращаемые значения: значение веса тары;
- Примечание:
- Для перевода веса из унций в граммы, необходимо полученное значение умножить на
0.035274; - Пример:
scale.get_offset(); // Запрос веса тары
Функция power_down();
- Назначение: перевод модуля в спящий режим;
- Синтаксис: power_down();
- Параметры: нет
- Возвращаемые значения: нет;
- Примечание: нет;
- Пример:
scale.power_down(); // Перевод модуля в спящий режим
Функция power_up();
- Назначение: вывод модуля из спящего режима;
- Синтаксис: power_up();
- Параметры: нет
- Возвращаемые значения: нет;
- Примечание: нет;
- Пример:
scale.power_up(); // Вывод модуля из спящего режима
Применение:
- системы контроля и измерения веса;
- концевые датчики, системы;
Ссылки:
- Библиотека HX711;
- Тензодатчик мостовой 1кг;
- Тензодатчик мостовой 5кг;
- Тензодатчик мостовой 10кг;
- Тензодатчик мостовой 20кг;
- Тензодатчик полумостовой 50кг;
- Микросхема HX711;
- DataSheet;
Конечно, сейчас электронными весами никого не удивишь, их много, причем дешевых и сравнительно точных. Но иногда требуется узнать вес в своей поделке, или передать его куда-то для последующей обработки. Такие весы будут отличаться своей логикой. Либо, можно сделать весы с уникальным дизайном, например, ретро и т.п. Под катом описание одного из самых распространенных современных инструментов электронного измерения веса, пригодного для использования в поделках.
Тензометрический датчик (тензодатчик; от лат. tensus — напряжённый) — датчик, преобразующий величину деформации в удобный для измерения сигнал (обычно электрический, чаще напряжение). Существует множество способов измерения деформаций: тензорезистивный, пьезоэлектрический, оптико-поляризационный, пьезорезистивный, волоконно-оптический, или простым считыванием показаний с линейки механического тензодатчика. Среди электронных тензодатчиков наибольшее распространение получили тензорезистивные датчики (именно такой используется в обозреваемом приборе).
Тензорезистивный датчик обычно представляет собой специальную упругую конструкцию с закреплённым на ней тензорезистором и другими вспомогательными деталями. После калибровки, по изменению сопротивления тензорезистора можно вычислить степень деформации, которая будет пропорциональна силе, приложенной к конструкции.
Сам датчик добрался без последствий в пупырчатом пакете. внутри в зип-локе датчик и плата считывания данных с него:

Вынимаем содержимое:

Данный датчик рассчитан на вес до 2х килограмм:

В центре датчика имеется характерное отверстие:

Соединение проводов с датчиком залито компаундом:

Обращаться с ним следует аккуратно, у меня один из проводков отвалился в ходе сооружения конструкции, пришлось расковыривать компаунд и припаиваться.
Проводки имеют длину порядка 22 см:

Сам датчик длиной порядка 8 см:

Для крепления датчика и измеряющего механизма имеются отверстия с резьбой:

Резьба разная на части крепления датчика и измерительного механизма (М5 и М4):

Больший диаметр отверстий предусмотрен со стороны крепления датчика (неподвижной части):


Вес датчика веса 🙂 29 грамм:

Платка подключения была в отдельном пакетике вместе со штырьками:

Основным элементом платы является микросхема HX711, это 24 битный аналого-цифровой преобразователь специализированный для весов, к которому подключается тензодатчик.
Для проверки работоспособности датчика требуется собрать некую конструкцию. Дизайнерские вещи в этот раз мы делать не будем, а используем набор для детского творчества:

Данный набор содержит все необходимое, для создания минималистичных весов:


Получились не самые симпатичные дизайнерские весы, но нам на этом этапе будет вполне достаточно.
Как я и писал ранее, красный проводок в ходе построения просто отвалился, пришлось произвести оперативный ремонт паяльником и малярным скотчем:

К плате я припаял гребенку и проводки от датчика:

Подключение датчика производится так:

DT и SCK можно подключить к любым цифровым пинам Arduino, я использовал для тестов Arduino Nano (SCK к выводу 2, DT к выводу 3), получилось как-то так:

Для работы с датчиком существует простая библиотека HX711.
Загрузим пример, идущий с библиотекой, поправив на свои пины
#include "HX711.h"
HX711 scale;
void setup() {
Serial.begin(38400);
Serial.println("HX711 Demo");
Serial.println("Initializing the scale");
// parameter "gain" is ommited; the default value 128 is used by the library
// HX711.DOUT - pin #A1
// HX711.PD_SCK - pin #A0
scale.begin(3, 2);
Serial.println("Before setting up the scale:");
Serial.print("read: tt");
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print("read average: tt");
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print("get value: tt");
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)
Serial.print("get units: tt");
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
// by the SCALE parameter (not set yet)
scale.set_scale(994.68); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0
Serial.println("After setting up the scale:");
Serial.print("read: tt");
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print("read average: tt");
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print("get value: tt");
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()
Serial.print("get units: tt");
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided
// by the SCALE parameter set with set_scale
Serial.println("Readings:");
}
void loop() {
Serial.print("one reading:t");
Serial.print(scale.get_units(), 1);
Serial.print("t| average:t");
Serial.println(scale.get_units(10), 1);
scale.power_down(); // put the ADC in sleep mode
delay(5000);
scale.power_up();
}
Данный пример при запуске устанавливает текущий вес нулевым и далее в цикле считывает все что прибавилось и выдает в консоль результат измерений. Конечно же, он выдал ерунду, так как датчик нуждается в калибровке. Для калибровки требуется предмет вес которого известен, я использовал это:

Далее согласно README к библиотеке пишем нехитрый код калибровки:
Код калибровки
#include "HX711.h"
HX711 scale(3, 2);
unsigned int weight_of_standard = 436;
void setup() {
Serial.begin(9600);
scale.set_scale();
scale.tare();
Serial.println("GO");
delay(10000);
Serial.print("scale factor: ");
Serial.println(scale.get_units(10)/weight_of_standard);
}
void loop() {}
weight_of_standard известный вес нашего предмета. Программа позволяет вычислить поправочный коэффициент, который будет использоваться при взвешивании, в нашем случае, он равен 989.
Пробуем измерять и сравнивать с «эталонными весами». Остаток свечки:



Малярный скотч:



Стружка для чистки паяльника с подставкой:



Таким образом, предмет обзора оказался рабочим, выдает то, что требуется. Если более тщательно подойти к калибровке и обеспечить большую жесткость конструкции «весов», то можно добиться неплохой точности, которой во многих случаях будет достаточно. Следует сказать, что взвешивающий элемент такого типа существует на разные диапазоны веса, и вполне можно подобрать подходящий для конкретной задачи.
На основе этого датчика можно сделать красивые весы с уникальным дизайном. Можно передавать данные взвешивания на сервер посредством WIFI или Ethernet. Можно автоматизировать какие-то процессы — например наливать напитки по весу (в том числе и из нескольких ингредиентов. Конкретно этот датчик покупался для автоматизации самогоноварения — отсечь головы от основного продукта в автоматическом режиме.
Спасибо всем, кто дочитал этот обзор до конца, надеюсь кому-то данная информация окажется полезной.
Это не пост о готовом решении, а, скорее, вопросы к коллективному разуму.
Имею дельта-принтер со встроенным механизмом автолевела. Радиатор экструдера прикреплён на подпружиненный кронштейн. Когда принтер опускает сопло в стол, кронштейн сдвигается и нажимает на кнопку концевика. Это позволяет принтеру выравниваться по любой точке печатной области в автоматическом режиме.
Конструкция очень умная, но небезупречная — у кронштейна есть допуски, у кнопки есть допуски, пружинка слабовата и не всегда возвращает экструдер в исходное положение. Отдельная беда — если принтер калибруется по точке совсем уж с краю и не в плоскости качания крошнтейна, его может подзаклинить от бокового усилия.
Захотелось совсем избавиться от механических деталей в пробнике — чтобы радиатор монтировался на эффекторе жёстко. На просторах Алиэкспресс наткнулся на дешёвые тензодатчики и понял, что это то, что надо.
Для тех, кто не в курсе — в основе принципа работы тензодатчика — плёночные резисторы. Если их тянуть, то они меняют сопротивление. Резисторы клеют на бока алюминиевого бруска и закрывают защитным слоем лака. Если один конец бруска держать, а на другой — давить, микроскопический изгиб будет зафиксирован резисторами. Датчики выпускаются на разные веса — на картинке датчик на 5кг, а я купил самый мелкий номинал — на 100 грамм, он в полтора раза мельче:
Едем дальше. Ардуиной такие микроскопические изменения тока на резисторах не поймаешь, нужен усилитель.
Китайская промышленность выпускает грошовые 24-битные усилители HX711, которые прекрасно справляются с этим делом.
Главная беда чипов HX711 с Али в том, что они работают со скоростью 0,5 Гц. Это неприемлемо — за две секунды принтер успеет вогнать сопло в стол. Но изучение даташита подсказало, что если соединить pin ‘rate’ чипа с плюсом питания, то скорость работы поднимается до 8 Гц:
Чтобы это сделать, надо загнать иглу под предпоследнюю ‘ногу’ чипа (острая игла от шприца справилась лучше всего) и отпаять ногу острым жалом паяльника. Затем аккуратно отогнуть её и либо просто присоединить к соседней шариком припоя или соорудить перемычку из провода к VCC.
После всех этих манипуляций я собрал ‘стенд’. С заделом на будущее я паял провода не к плате, а через ‘телефонный’ разъём RJ11, чтобы можно было разобрать-собрать. Провода тензодатчика цепляем так:
красный => E+
чёрный => E-
зелёный => A-
белый => A+
Я взял полутораметровый отрезок четырёхжильного ‘провода для домофона’, через него заработало на ура.
Для тестов пока взял Arduino Nano. Pin ‘DT’ цепляем к пину ‘А1’ Ардуино, пин ‘SCK’ — к пину ‘А0’. Для HX711 есть 2 библиотеки, навороченная github.com/bogde/HX711 и простая, как валенок, https://github.com/aguegu/Arduino — на ней и остановился.
Набросал простейший код:/*
* Library: https://github.com/aguegu/Arduino
*/
// Hx711.DOUT — pin #A1
// Hx711.SCK — pin #A0
#include ‘hx711.h’
Hx711 scale(A1, A0);
float curr = 0;
int normalizedValue = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
curr = scale.getGram();
normalizedValue = map(curr, -9999, 9999, -100, 100); // maps measurements to -100 to 100 range.
Serial.print(curr, 1);
Serial.print(‘ mg —> ‘;);
Serial.print(normalizedValue);
Serial.println(»;);
delay(0);
}
Загружаем скетч в Ардуину и убеждаемся, что всё ещё работает медленно. Чешем репу и лезем в библиотеку.
Там видим строку:
long averageValue(byte times = 32);
и понимем, что библиотека собирает 32 замера с датчика, округляет их и выдаёт наружу. Заменяем 32 на 1, пересобираем скетч и получаем показания с датчика со скоростью пулемёта.
Следующие шаги:
— прикрутить в цепь оптрон. Цель — полностью имитировать работу концевика, никак не трогая плату принтера.
— написать код, который будет распознавать быстрое увеличение показаний датчика (в момент касания соплом стола)
— взять 3d-модель эффектора и передизайнить под габариты тензодатчика. Габариты известны, единственая засада — насчёт диаметра крепёжных отверстий китайцы наврали, их придётся рассверливать под честный М3:
Load Cell Size — 47 x 12 x 6mm / 1.9′ x 0.47′ x 0.24′ (L*W*T)
Thead Hole Diameter — 3mm /0.12′
Hole Center Distance — 40 x 6 mm / 1.6′ x 0.24′ (L*Max.W)
Пожалуйста, коллективным разумом покритикуйте меня или ткните носом, если я что-то серьёзно упустил, пока я принтер ещё не раскурочил. Спасибо!
-
#102
это конечно избыточно для одного пина ставить.
даже сомневаюсь надо ли вообще согласовывать.
-
#104
это конечно избыточно для одного пина ставить.
Ну почему для одного? Я через него все пустил. 2 пина RTC, 2 пина весов, датчик DHT22, датчик DS18B20. У меня осталось 2 свободных пина.
-
#105
Ну почему для одного? Я через него все пустил. 2 пина RTC, 2 пина весов, датчик DHT22, датчик DS18B20. У меня осталось 2 свободных пина.
все указанные вами датчики прекрасно работают от 3.3
можно конечно усложнять конструкцию.
-
#106
все указанные вами датчики прекрасно работают от 3.3
можно конечно усложнять конструкцию.
Первая причина — датчики на длинных проводах. От 5 В себя комфортней чувствуют.
Вторая причина — развести печатную плату было легче так. Не нужно городить дорожки 5В от буста, 3.3В от ModeMCU, и еще накинуть 4,2 для SIM800.
Усложняя, упростил.
-
#107
Первая причина — датчики на длинных проводах. От 5 В себя комфортней чувствуют.
Вторая причина — развести печатную плату было легче так. Не нужно городить дорожки 5В от буста, 3.3В от ModeMCU, и еще накинуть 4,2 для SIM800.
Усложняя, упростил.
как я понял в дальнейшем вы все будете питать от батарейки
а они как правило 5 вольт не дают
-
#108
собрал схему с мостом из 1 ком и питанием 3.3 вольта
провод плоский кабель без экрана
провод до моста 20 см
провод до ESP 50 см
получил помеху на уровне 0.02%
-
#109
поднял 15 пин у HX711 и подключил его к +3.3
В результате время измерения сократилось с 90 ms до 11 ms.
попробуйте так сделать
в итоге вы получите 9 измерений вместо 1
в результате можете применить медианный фильтр что уменьшит ошибку 3-5 раз
при сохранении дискретности измерений
-
#110
поднял 15 пин у HX711 и подключил его к +3.3
В результате время измерения сократилось с 90 ms до 11 ms.
попробуйте так сделать
в итоге вы получите 9 измерений вместо 1
в результате можете применить медианный фильтр что уменьшит ошибку 3-5 раз
при сохранении дискретности измерений
Я переключал на 80Гц. У меня на плате есть перемычка. Еще хуже. Все же думаю это емкость проводов. Подумаю как максимально укоротить длину провода. Уже изучил все что можно по этому модулю. Буду дорабатывать конструкцию.
-
#111
Я переключал на 80Гц. У меня на плате есть перемычка. Еще хуже. Все же думаю это емкость проводов. Подумаю как максимально укоротить длину провода. Уже изучил все что можно по этому модулю. Буду дорабатывать конструкцию.
если разбираетесь в программировании то проверьте программу
у меня нет никаких экранов и ошибка существенно меньше чем у вас.
увеличение частоты опроса не может повышать уровень помех
-
#112
если разбираетесь в программировании то проверьте программу
Мой уровень в программировании на уровне «никакой». Я учусь помаленьку, но это новое для меня. )))
Я использую библиотеку bogde/HX711
-
#113
Мой уровень в программировании на уровне «никакой». Я учусь помаленьку, но это новое для меня. )))
Я использую библиотеку bogde/HX711
если есть у вас вольтметр хороший то посмотрите все напряжения на предмет их стабильности
например я смотрел напряжение на моста оно 2470 мв
еще лучше осциллограф
pvvx
Активный участник сообщества
-
#114
Все равно плюсует. При резете ESP8266 показания скидываются в начало и увеличивается по новой.
Что может быть? Не хочется верить в то, что сгорел модуль HX711.
1) Измерения у вас начинаются с подачи аналогового питания (?). Необходимо дождаться его стабилизации, а не сразу гнать замеры.
2) Чип HX711 не имеет ноги DGND. Любой ток вывода на шину данных будет отображаться на работе аналоговой части (ADC). В итого рекомендуется на цифровой выход ставить беземкостную нагрузку и использовать минимальный ток. Т.е. включать напрямую на ногу MCU минимальной дорожкой на плате с резистором в десятки Ом непосредственно у цифрового выхода HX711..
У входных цифровых сигналов должны быть ограничены скорости нарастания фронтов почти до полного «округления» и выбросы не должны превышать уровень питания. Т.е. соединение проводом не рекомендуется. Только короткой дорожкой с резистором в десятки Ом непосредственно у цифрового входа HX711..
-
#115
Мой уровень в программировании на уровне «никакой». Я учусь помаленьку, но это новое для меня. )))
Я использую библиотеку bogde/HX711
выкладываю прошивку для тестирования модуля
загрузите ее с нулевого адреса
———————————
модуль подключаете к
GPIO15 — CLK
GPIO04 -DT
————————————
в программе вычисляется среднее значение(S), максимум(Max) и минимум(Min) и D=(Max-Min)/S для 1000 отсчетов
на терминал выводится — S и значение 100000*D;
вот картинка терминала

-
1 KB
Просмотры: 13
-
#116
модуль подключаете к
GPIO15 — CLK
GPIO04 -DT
Посмотреть вложение 7752
У меня модули припаяны к печатке. Чтоб переключиться нужно все выпаивать.
DOUT_PIN = 12;
SCK_PIN = 14;
Если не трудно, можно в прошивке поменять пины?
-
#117
вот результат фильтрации медианным фильтром длиной в 7 отсчетов
разброс показаний уменьшился в 1.5 раза
обратите внимание ошибка на уровне 5-го знака
т е при 100 кг ошибка не более 10 гр даже без фильтра и без экранов

pvvx
Активный участник сообщества
-
#118
вот результат фильтрации медианным фильтром длиной в 7 отсчетов
разброс показаний уменьшился в 1.5 раза
обратите внимание ошибка на уровне 5-го знака
А с чего так у вас колбасит показания hx711 ?
Синфазная помеха не давится?
-
#119
А с чего так у вас колбасит показания hx711 ?
Синфазная помеха не давится?
Колбасит — это сколько?
-
#120
У меня модули припаяны к печатке. Чтоб переключиться нужно все выпаивать.
DOUT_PIN = 12;
SCK_PIN = 14;
Если не трудно, можно в прошивке поменять пины?
рекомендую провода к мосту от Hx711 разделить на два кабеля
сигнал по отдельной паре в экране