Тензодатчик - устройство позволяющее фиксировать изменения приложенной к нему силы. На него подается питающее напряжение, которое изменяется на выходе, пропорционально приложенной нагрузке. Благодаря взаимосвязи между силой и выходным напряжением тензодатчики получили широкое распространение во всех областях где требуется решать задачи измерения веса.
Из-за хорошей линейности характеристик, невысокой стоимости и простоты работы с ними, на текущий момент, тензодатчики практически вытеснили все механические весы. В этой статье мы рассмотрим вопросы подключения тензодатчика к плате Ардуино при помощи модуля HX711, и постараемся определить для каких целей можно применять подобное решение, а для каких лучше использовать промышленные весовые контроллеры и преобразователи тензосигнала.
В качестве АЦП для преобразования сигнала с тензодатчика мы будем использовать 24-разрядный аналого-цифровой преобразователь, называемый HX711. С его помощью Ардуино будет получать информацию о текущей нагрузке на тензодатчик и выводить это значение на индикатор.
Для работы с модулем HX711 мы возьмем стандартную библиотеку, дабы не усложнять себе жизнь и проверить насколько точную весоизмерительную систему можно собрать из готовых компонент. Чтобы установить библиотеку, перейдите в диспетчер библиотек в среде IDE Arduino и введите HX711. Мы будем использовать библиотеку от Богдана Некула (Bogdan Necula), самая верхняя на приведенном ниже скриншоте.

Помимо модуля АЦП и платы Ардуино нам понадобятся:
- 0.96 Oled дисплей, вариант I2C
- 4 тактовые кнопки
- 4 резистора 10кОм
После сборки платы необходимо загрузить в вашу ардуино исполняемый код, его можно создать из скетча приведенного в конце данной статьи. А результат его работы можно посмотреть на видео:
#include <Wire.h>
#include "HX711.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // ширина дисплея в пикселях
#define SCREEN_HEIGHT 64 // высота дисплея в пикселях
// Создаем объект дисплея
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int Button_1 = 22; //Кнопка увеличения коэффициента калибровки
int Button_2 = 23; //Кнопка уменьшения коэффициента калибровки
int Button_3 = 24; //Кнопка применения коэффициента калибровки
int Button_4 = 25; //Кнопка назначения нулевого веса
// Подключение модуля ацп
const int LOADCELL_DOUT_PIN = A0;
const int LOADCELL_SCK_PIN = A1;
// Создаем Объект модуля АЦП
HX711 scale;
float calibration_factor =3178.0 ; // коэффициент калибровки
float cal_y1 = 500.0; // calibrated mass to be added
long cal_x1 = 0L;
long cal_x0 = 0L;
float units; //Код АЦП
float gramm; // Вес в граммах
float gramm_max=0; // определение разброса
float gramm_min=1000; // определение разброса
void setup() {
// Запускаем дисплей
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) // по адрессу 0x3С
{
Serial.println(F("SSD1306 allocation failed")); //выводим сообщение если не получилось
for(;;);
}
// Очищаем дисплей
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
// Выводим информационый экран
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,32);
display.println("TMM-002");
display.setTextSize(1);
display.setCursor(0,48);
display.println("WWW.INTEREL.RU");
display.display();
//Запускаем АЦП
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale();
//scale.set_scale(calibration_factor); //Применяем калибровку
pinMode(Button_1, INPUT);
pinMode(Button_2, INPUT);
pinMode(Button_3, INPUT);
pinMode(Button_4, INPUT);
delay(5000);
}
void loop() {
Serial.print("Reading: ");
//for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10; // усредняем показания считав 10 раз
//units / 10; // делим на 10
units = scale.get_units(10);
gramm = units; // переводим унции в граммы
Serial.print(gramm); // отправляем в монитор порта
Serial.print(" grams");
Serial.println();
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
if (gramm_min>gramm)gramm_min=gramm;
if (gramm_max<gramm)gramm_max=gramm;
//Увеличиваем коэффициент калибровки
if(digitalRead(Button_1) == LOW) {
display.print("1: On");
gramm_max=0;
gramm_min=1000;
} else {
display.print("1: Off");
}
display.setCursor(0,8);
//Уменьшаем коэффициент калибровки
if(digitalRead(Button_2) == LOW) {
display.print("2: On");
calibration_factor=gramm/500.0f;
scale.set_scale(calibration_factor); //Применяем калибровку
} else {
display.print("2: Off");
}
display.setCursor(64,0);
//Применяем калибровочный коэффициент
if(digitalRead(Button_3) == LOW) {
display.print("3: On");
scale.set_scale(); // Сбрасываем калибровку
gramm_max=0;
gramm_min=1000; } else {
display.print("3: Off");
}
display.setCursor(64,8);
//Принимаем текущий вес за 0
if(digitalRead(Button_4) == LOW) {
display.print("4: On");
scale.tare(); //Сбрасываем на 0
// scale.set_scale(calibration_factor); //Применяем калибровку
gramm_max=0;
gramm_min=1000;
} else {
display.print("4: Off");
}
// Выводим на экран информацию о текущем весе
display.setTextSize(2);
display.setCursor(0,16);
display.print("BEC:");
display.println(gramm);
display.setTextSize(2);
display.setCursor(0,32);
display.print("DIF:");
display.println(gramm_max-gramm_min);
display.setTextSize(2);
display.setCursor(0,48);
display.print("K:");
display.println(calibration_factor);
display.display();
}