Микроконтроллерная платформа Arduino позволяет сделать множество несложных, но в то же время полезных в быту вещей. Одной из таких вещей можно назвать весы.

В данном примере будет показано, как самостоятельно собрать весы на основе Arduino, модуля с микросхемой HX711 и четырех весоизмерительных ячеек.
Микросхема HX711 специально предназначенf для усиления сигналов от весоизмерительных ячеек и передачи их в другой микроконтроллер. Весоизмерительные ячейки подключаются к плате с HX711, и эта плата сообщает Arduino, что именно измеряют весоизмерительные ячейки. Весоизмерительные ячейки (на 50 кг в данном случае) представляют собой металлические элементы специальной формы, к которым прикреплены тензодатчики (тензорезисторы). Тензорезисторы – это резисторы, которые меняют свое сопротивление при изгибе. Когда металлическая часть изгибается, сопротивление тензодатчика изменяется (HX711 точно измеряет это небольшое изменение сопротивления).

Установите четыре весоизмерительных ячейки по краям основания весов в четырех углах. Для их фиксации можно задействовать эпоксидную смолу.


Убедитесь, что два терминала на весоизмерительных ячейках имеют наивысшее сопротивление между ними (например, черным и белым), соедините их в петлю в соответствии со цветами, например, черный-черный белый-белый черный-черный белый-белый. Затем можно подавать напряжение возбуждения на два противоположных центральных ответвления и снимать показания с другой пары центральных ответвлений. Таким образом, получим некоторое подобие моста Уитстона. Схема подключения весоизмерительных ячеек к модулю HX711 и затем к Arduino показана ниже.

Далее приведен код (скетч) для Arduino, позволяющий реализовать измерение веса. В нем используется библиотека HX711, которую можно взять на https://github.com/bogde/HX711. Перед началом полноценного использования весов, их необходимо откалибровать. Код калибровки выглядит следующим образом.
include "HX711.h"
#define DOUT 3
#define CLK 2
HX711 scale(DOUT, CLK);
float calibration_factor = -7050; // коэффициент калибровки, можно варьировать
void setup() {
Serial.begin(9600);
Serial.println("HX711 calibration sketch");
Serial.println("Remove all weight from scale"); // уберите посторонние предметы с весов
Serial.println("After readings begin, place known weight on scale"); // после начала считывания поместите на весы предмет известной массы
Serial.println("Press + or a to increase calibration factor"); // нажмите плюс для увеличения коэффициента калибровки
Serial.println("Press - or z to decrease calibration factor"); // нажмите минус для уменьшения коэффициента калибровки
scale.set_scale();
scale.tare(); // сброс весов в 0
long zero_factor = scale.read_average(); // Получить базовое считывание
Serial.print("Zero factor: "); // Это можно использовать, чтобы устранить необходимость тарирования шкалы. Полезно в проектах постоянного масштаба.
Serial.println(zero_factor);
}
void loop() {
scale.set_scale(calibration_factor); // Регулирование калибровочного коэффициента
Serial.print("Reading: ");
Serial.print(scale.get_units(), 1);
Serial.print(" kg");
Serial.print(" calibration_factor: ");
Serial.print(calibration_factor);
Serial.println();
if(Serial.available())
{
char temp = Serial.read();
if(temp == '+' || temp == 'a')
calibration_factor += 10;
else if(temp == '-' || temp == 'z')
calibration_factor -= 10;
}
}
Код работы весов на основе Arduino и HX711.
#include "HX711.h"
#define calibration_factor -7050.0 // коэффициент калибровки, определяется во время процесса калибровки
#define DOUT 3
#define CLK 2
HX711 scale(DOUT, CLK);
void setup() {
Serial.begin(9600);
Serial.println("HX711 scale demo");
scale.set_scale(calibration_factor);
scale.tare(); // Предполагается, что при запуске весов на шкале нет предметов с массой, сброс весов в 0
Serial.println("Readings:");
}
void loop() {
Serial.print("Reading: ");
Serial.print(scale.get_units(), 1); //scale.get_units() возвращает float
Serial.print(" kg");
Serial.println();
}
© digitrode.ru