ESP8266 NodeMCU с тензодатчиком и усилителем HX711 (цифровые весы)

В этом руководстве вы узнаете, как создать весы с ESP8266 NodeMCU, используя тензодатчик и усилитель HX711. Сначала вы узнаете, как подключить тензодатчик и усилитель HX711 к ESP8266, чтобы построить весы. Затем мы покажем, как откалибровать весы и получить вес объектов на простом примере. Позже мы также добавим дисплей для отображения измерений и кнопку для тарирования весов.

ESP8266 NodeMCU с тензодатчиком и усилителем HX711 цифровые весы Arduino IDE

В этом руководстве мы рассмотрим следующие темы:

Знакомство с тензодатчиками (тензометрическими датчиками)

Тензодатчик преобразует силу в электрический сигнал, который можно измерить. Электрический сигнал изменяется пропорционально приложенной силе. Существуют различные типы тензодатчиков: тензометрические, пневматические и гидравлические. В этом руководстве мы рассмотрим тензометрические тензодатчики.

Тензодатчик мост Уитстона

Тензометрические тензодатчики состоят из металлической балки с прикрепленными тензорезисторами (под белым клеем на фотографии выше). Тензорезистор — это электрический датчик, измеряющий силу или деформацию объекта. Сопротивление тензорезисторов изменяется при приложении внешней силы к объекту, что приводит к деформации формы объекта (в данном случае металлической балки). Изменение сопротивления пропорционально приложенной нагрузке, что позволяет нам вычислить вес объектов.

Обычно тензодатчики имеют четыре тензорезистора, соединённые в мост Уитстона (как показано ниже), что позволяет получать точные измерения сопротивления. Для более подробного объяснения принципа работы тензорезисторов прочитайте эту статью.

Тензодатчик мост Уитстона схема

Провода, выходящие из тензодатчика, обычно имеют следующие цвета:

  • Красный: VCC (E+)

  • Чёрный: GND (E-)

  • Белый: Выход – (A-)

  • Зелёный: Выход + (A+)

Применение

Тензометрические тензодатчики могут использоваться в самых разных приложениях. Например:

  • проверка, изменяется ли вес объекта со временем;

  • измерение веса объекта;

  • обнаружение присутствия объекта;

  • оценка уровня жидкости в ёмкости;

  • и т.д.

Поскольку изменения деформации при взвешивании объектов очень малы, нам нужен усилитель. Тензодатчик, который мы используем, обычно продаётся вместе с усилителем HX711. Поэтому именно этот усилитель мы и будем использовать.

Усилитель HX711

Усилитель HX711 — это модуль, который позволяет легко считывать показания тензодатчиков для измерения веса. Вы подключаете провода тензодатчика с одной стороны, а микроконтроллер — с другой. HX711 обменивается данными с микроконтроллером по двухпроводному интерфейсу (Clock и Data).

Усилитель HX711

Вам нужно припаять штыревые разъёмы к выводам GND, DT, SCK и VCC для подключения к ESP8266. Я припаял провода тензодатчика непосредственно к выводам E+, E-, A- и A+. Провода тензодатчика были очень тонкими и хрупкими, будьте осторожны при пайке, чтобы не повредить провода.

Усилитель HX711 припаянный

Для получения дополнительной информации об усилителе HX711 вы можете обратиться к даташиту HX711.

Настройка тензодатчика

Наш комплект тензодатчика поставлялся с двумя акриловыми пластинами и несколькими винтами для настройки тензодатчика в качестве весов. Вы можете использовать деревянные пластины или напечатать свои собственные пластины на 3D-принтере.

Комплект тензодатчика с усилителем HX711

Вы должны прикрепить пластины к тензодатчику таким образом, чтобы создать деформацию между противоположными концами металлической балки. Нижняя пластина удерживает тензодатчик, а верхняя пластина — это место, куда вы кладёте объекты.

Настройка тензодатчика в качестве весов

На следующем рисунке показано, как выглядит мой тензодатчик с акриловыми пластинами.

Весы на тензодатчике

Где купить тензодатчик с HX711?

Вы можете найти тензодатчик с HX711 на Maker Advisor, чтобы найти лучшую цену (с акриловыми пластинами или без них). Существуют тензодатчики с различными диапазонами измерения. Наиболее распространённые максимальные веса — 1 кг, 5 кг, 10 кг и 20 кг.

Тензодатчик с усилителем HX711

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключение тензодатчика и усилителя HX711 к ESP8266

Усилитель HX711 обменивается данными по двухпроводному интерфейсу. Вы можете подключить его к любым GPIO выбранного микроконтроллера. Мы подключаем вывод данных (DT) к GPIO 12 (D6) и вывод тактового сигнала (CLK) к GPIO 13 (D7). Вы можете использовать любые другие подходящие выводы (ознакомьтесь с руководством по распиновке ESP8266).

Следуйте следующей таблице или схеме для подключения тензодатчика к плате ESP8266.

Тензодатчик

HX711

HX711

ESP8266

Красный (E+)

E+

GND

GND

Чёрный (E-)

E-

DT

GPIO 12 (D6)

Белый (A-)

A-

SCK

GPIO 13 (D7)

Зелёный (A+)

A+

VCC

3.3V

ESP8266 с тензодатчиком HX711 схема подключения

Установка библиотеки HX711

Существует несколько различных библиотек для получения измерений от тензодатчика с использованием усилителя HX711. Мы будем использовать библиотеку HX711 от bodge. Она совместима с ESP32, ESP8266 и Arduino.

Arduino IDE

Следуйте приведённым ниже инструкциям для установки библиотеки, если вы используете Arduino IDE.

  1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries.

  2. Найдите «HX711 Arduino Library» и установите библиотеку от Bogdan Necula.

Установка библиотеки HX711 Bogdan в Arduino IDE

VS Code с PlatformIO

Если вы используете VS Code с расширением PlatformIO для программирования ваших плат, следуйте приведённым ниже инструкциям.

  1. После создания нового проекта в PlatformIO для вашей платы, перейдите в PIO Home (нажмите на значок домика в нижней панели). Затем нажмите на Libraries. Найдите HX711 и выберите библиотеку от bodge.

  2. Затем нажмите Add to Project и выберите проект, над которым вы работаете.

Установка библиотеки HX711 для тензодатчика в VS Code

Теперь, если вы перейдёте в папку вашего проекта и откроете файл platformio.ini, там должна быть строка для подключения библиотеки:

lib_deps = bogde/HX711@^0.7.5

Также добавьте следующую строку для изменения скорости Serial Monitor на 115200:

monitor_speed = 115200

Калибровка весов (ESP8266 с тензодатчиком)

На данном этапе мы предполагаем, что вы подключили тензодатчик к усилителю HX711, а усилитель — к ESP8266. Ваши весы также должны быть настроены (две пластины, закреплённые на противоположных концах тензодатчика), и библиотека HX711 должна быть установлена.

Перед тем как получить вес объектов, вам нужно сначала откалибровать тензодатчик, получив коэффициент калибровки. Ваш коэффициент калибровки будет отличаться от моего, поэтому вам не следует пропускать этот раздел.

1) Подготовьте объект с известным весом. Я использовал свои кухонные весы и взвесил стакан с водой (300 г).

2) Загрузите следующий код на вашу ESP8266. Мы написали следующий код, учитывая инструкции по калибровке тензодатчика, предоставленные в документации библиотеки.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-load-cell-hx711/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

// Calibrating the load cell
#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 12;
const int LOADCELL_SCK_PIN = 13;

HX711 scale;

void setup() {
  Serial.begin(115200);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}

void loop() {

  if (scale.is_ready()) {
    scale.set_scale();
    Serial.println("Tare... remove any weights from the scale.");
    delay(5000);
    scale.tare();
    Serial.println("Tare done...");
    Serial.print("Place a known weight on the scale...");
    delay(5000);
    long reading = scale.get_units(10);
    Serial.print("Result: ");
    Serial.println(reading);
  }
  else {
    Serial.println("HX711 not found.");
  }
  delay(1000);
}

//calibration factor will be the (reading)/(known weight)

Просмотреть исходный код

3) После загрузки откройте Serial Monitor на скорости 115200 бод и перезагрузите плату ESP8266.

4) Следуйте инструкциям на Serial Monitor: уберите все грузы с весов (тарирование произойдёт автоматически). Затем поместите объект с известным весом на весы и подождите, пока не получите значение.

5) Вычислите коэффициент калибровки по формуле:

calibration factor = (reading)/(known weight)
Калибровка тензодатчика Arduino IDE Serial Monitor

В нашем случае показание составило -141449. Известный вес — 300 г, поэтому наш коэффициент калибровки будет: -141449/300 = -471.497.

calibration factor = -141449/300 = -471.497

Сохраните ваш коэффициент калибровки, потому что он понадобится вам позже. Ваш коэффициент будет отличаться от нашего.

Поскольку выходной сигнал датчика пропорционален силе, приложенной к тензодатчику, вы можете калибровать весы, используя любую единицу измерения, которая имеет для вас смысл. Я использовал граммы, но вы можете использовать фунты, килограммы или даже кусочки кошачьего корма (как в этом видео Andreas Spiess).


Взвешивание объектов (ESP8266 с тензодатчиком)

Теперь, когда вы знаете свой коэффициент калибровки, вы можете использовать тензодатчик для взвешивания объектов. Начните со взвешивания объектов с известным весом и повторите процесс калибровки, если значения неточные.

Скопируйте следующий код в вашу Arduino IDE. Перед загрузкой на плату не забудьте вставить ваш коэффициент калибровки в строку 43/44 кода. Следующий код — это пример, предоставленный библиотекой, который демонстрирует использование большинства её функций.

/**
 * Complete project details at https://RandomNerdTutorials.com/esp8266-load-cell-hx711/
 *
 * HX711 library for Arduino - example file
 * https://github.com/bogde/HX711
 *
 * MIT License
 * (c) 2018 Bogdan Necula
 *
 **/

#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 12;
const int LOADCELL_SCK_PIN = 13;

HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");
  Serial.println("Initializing the scale");

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  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: \t\t");
  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(-478.507);
  //scale.set_scale(-471.497);                      // 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: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  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: \t\t");
  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), 5);

  scale.power_down();             // put the ADC in sleep mode
  delay(5000);
  scale.power_up();
}

Просмотреть исходный код

Как работает код

Начните с подключения необходимых библиотек. Мы включили Arduino.h на случай, если вы используете PlatformIO вместо Arduino IDE.

#include <Arduino.h>
#include "HX711.h"

Следующие строки определяют GPIO, которые вы будете использовать для подключения к усилителю HX711. Мы выбрали GPIO 12 и 13. Вы можете использовать любые другие подходящие GPIO.

const int LOADCELL_DOUT_PIN = 12;
const int LOADCELL_SCK_PIN = 13;

Затем создайте экземпляр библиотеки HX711 под названием scale, который вы будете использовать позже для получения измерений.

HX711 scale;

setup()

В setup() инициализируйте Serial Monitor.

Serial.begin(115200);

Инициализируйте тензодатчик, вызвав метод begin() для объекта scale и передав GPIO в качестве аргументов.

scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

Затем код вызывает несколько методов, которые вы можете использовать для получения показаний с помощью библиотеки.

  • read(): получает необработанное показание с датчика

  • read_average(количество показаний): получает среднее из последних указанного количества показаний

  • get_value(количество показаний): получает среднее из последних указанного количества показаний минус вес тары

  • get_units(количество показаний): получает среднее из последних указанного количества показаний минус вес тары, делённое на коэффициент калибровки — это даст показание в выбранных вами единицах измерения.

Serial.println("Before setting up the scale:");
Serial.print("read: \t\t");
Serial.println(scale.read());      // print a raw reading from the ADC

Serial.print("read average: \t\t");
Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

Serial.print("get value: \t\t");
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: \t\t");
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)

В следующей строке не забудьте вставить ваш коэффициент калибровки. Используется метод set_scale().

scale.set_scale(INSERT YOUR CALIBRATION FACTOR)

Затем вызовите метод tare() для тарирования весов.

scale.tare();               // reset the scale to 0

После этой настройки весы должны быть готовы выдавать точные показания в выбранных вами единицах измерения. В примере вызываются те же предыдущие методы, чтобы вы могли увидеть разницу до и после настройки весов.

Serial.print("read: \t\t");
Serial.println(scale.read());                 // print a raw reading from the ADC

Serial.print("read average: \t\t");
Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

Serial.print("get value: \t\t");
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: \t\t");
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

loop()

В loop() пример вызывает метод get_units() двумя различными способами: для получения одного единственного показания (без каких-либо параметров) и для получения среднего из последних 10 показаний.

Serial.print("one reading:\t");
Serial.print(scale.get_units(), 1);
Serial.print("\t| average:\t");
Serial.println(scale.get_units(10), 5);

Код переводит АЦП, считывающий датчик, в спящий режим с помощью метода power_down(). Затем он ждёт 5 секунд, включает АЦП (power_up()), и loop() повторяется. Таким образом, вы будете получать новые показания в Serial Monitor каждые 5 секунд.

scale.power_down();             // put the ADC in sleep mode
delay(5000);
scale.power_up();

Демонстрация

Загрузите код на вашу плату ESP8266. После загрузки откройте Serial Monitor на скорости 115200 бод.

Дайте коду поработать несколько секунд, чтобы у него было время настроить весы (вы увидите сообщение в Serial Monitor). Затем поместите любой объект на весы для измерения, и вы получите результаты в Serial Monitor.

Демонстрация тензодатчика Arduino IDE Serial Monitor

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


Цифровые весы с ESP8266

В этом разделе мы создадим простые цифровые весы с ESP8266. Мы добавим OLED-дисплей для отображения результатов и кнопку для тарирования весов.

Цифровые весы ESP8266

Необходимые компоненты

Вот список компонентов, необходимых для этого проекта:

Схема подключения

Добавьте OLED-дисплей и кнопку к вашей предыдущей схеме на следующих выводах:

OLED-дисплей

ESP8266

VCC

3.3V или 5V*

GND

GND

SDA

GPIO 4 (D2)

SCL

GPIO 5 (D1)

*подключите к 3.3V или 5V в зависимости от модели.

Не знакомы с OLED-дисплеем? Прочитайте: ESP8266 OLED-дисплей с Arduino IDE.

Подключите кнопку через подтягивающий резистор 10 кОм к GPIO 14 (D5). Другой вывод кнопки должен быть подключён к 3.3V. Вы можете использовать любой другой подходящий GPIO (ознакомьтесь с руководством по распиновке ESP8266).

Вы можете следовать следующей схеме для подключения ваших компонентов.

Цифровые весы ESP8266 схема подключения

Код цифровых весов ESP8266

Для простоты мы будем обрабатывать кнопку с помощью простой библиотеки, которая обнаруживает нажатия кнопок с устранением дребезга (поэтому нам не нужно беспокоиться об этом в нашем коде). Для записи на OLED-дисплей мы будем использовать библиотеки Adafruit SSD1306 и Adafruit GFX.

Библиотека кнопки

Существует множество библиотек с множеством функций для работы с кнопками. Мы будем использовать библиотеку pushbutton от polulu. Это простая библиотека, но она содержит всё необходимое для этого проекта. В вашей Arduino IDE перейдите в Sketch > Include Library > Manage Libraries и найдите «pushbutton». Установите библиотеку pushbutton от polulu.

Библиотека Pushbutton Arduino IDE Polulu

Также, если вы не хотите использовать библиотеку, вы можете добавить код устранения дребезга самостоятельно (это не сложно). Для примера кода устранения дребезга в Arduino IDE вы можете перейти в File > Examples > Digital > Debounce.

Библиотеки OLED

Мы будем использовать следующие библиотеки для управления OLED-дисплеем. Убедитесь, что у вас установлены эти библиотеки:

Вы можете установить библиотеки с помощью Arduino Library Manager. Перейдите в Sketch > Include Library > Manage Libraries и найдите название библиотеки.

Установка библиотек — PlatformIO

Если вы используете VS Code с расширением PlatformIO, следуйте следующим шагам для установки библиотеки:

  1. После создания нового проекта в PlatformIO для вашей платы, перейдите в PIO Home (нажмите на значок домика в нижней панели). Затем нажмите на Libraries. Найдите pushbutton и выберите библиотеку Pushbutton от Polulu.

  2. Затем нажмите Add to Project и выберите проект, над которым вы работаете.

  3. Повторите процесс для библиотек Adafruit SSD1306 и Adafruit GFX. Также не забудьте добавить библиотеку HX711.

В вашем файле platformio.ini должны быть следующие строки, включающие все необходимые библиотеки (также измените скорость Serial Monitor на 115200).

monitor_speed = 115200
lib_deps =
     bogde/HX711@^0.7.5
     pololu/Pushbutton@^2.0.0
        adafruit/Adafruit SSD1306@^2.4.6
     adafruit/Adafruit GFX Library@^1.10.10

Код

Скопируйте следующий код в вашу Arduino IDE. Перед загрузкой на ESP8266 вам нужно вставить ваш коэффициент калибровки (полученный ранее).

// Complete project details at https://RandomNerdTutorials.com/esp8266-load-cell-hx711/
// Library HX711 by Bogdan Necula: https://github.com/bogde/HX711
// Library: pushbutton by polulu: https://github.com/pololu/pushbutton-arduino

#include <Arduino.h>
#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Pushbutton.h>

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 12;
const int LOADCELL_SCK_PIN = 13;

HX711 scale;
int reading;
int lastReading;
//REPLACE WITH YOUR CALIBRATION FACTOR
#define CALIBRATION_FACTOR -478.507

//OLED Display
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//Button
#define BUTTON_PIN 14
Pushbutton button(BUTTON_PIN);

void displayWeight(int weight){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  // Display static text
  display.println("Weight:");
  display.display();
  display.setCursor(0, 30);
  display.setTextSize(2);
  display.print(weight);
  display.print(" ");
  display.print("g");
  display.display();
}

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);

  Serial.println("Initializing the scale");
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  scale.set_scale(CALIBRATION_FACTOR);   // this value is obtained by calibrating the scale with known weights
  scale.tare();               // reset the scale to 0
}

void loop() {

  if (button.getSingleDebouncedPress()){
    Serial.print("tare...");
    scale.tare();
  }

  if (scale.wait_ready_timeout(200)) {
    reading = round(scale.get_units());
    Serial.print("Weight: ");
    Serial.println(reading);
    if (reading != lastReading){
      displayWeight(reading);
    }
    lastReading = reading;
  }
  else {
    Serial.println("HX711 not found.");
  }
}

Просмотреть исходный код

Как работает код

Начните с подключения необходимых библиотек:

#include <Arduino.h>
#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Pushbutton.h>

Определите выводы для HX711 (тензодатчика) — мы используем те же, что и в предыдущих примерах:

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 12;
const int LOADCELL_SCK_PIN = 13;

Создайте экземпляр HX711 с именем scale.

HX711 scale;

Следующие переменные будут хранить текущее показание веса и последнее показание веса. Мы хотим обновлять OLED-дисплей только в случае нового показания, поэтому нам нужны эти две переменные. Кроме того, мы не хотим измерять доли грамма, что сделает весы слишком чувствительными для нашего приложения — вот почему эти переменные имеют тип integer. Если вам нужны десятичные знаки в измерениях, вы можете определить переменные типа float.

int reading;
int lastReading;

Не забудьте заменить следующее значение на ваш коэффициент калибровки. В моём случае эта строка кода выглядит так (моё значение отрицательное):

#define CALIBRATION_FACTOR -471.497

Далее нам нужно определить ширину и высоту OLED:

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

И создать экземпляр библиотеки Adafruit_SSD1306 с именем display.

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Определите GPIO, который вы будете использовать для чтения кнопки, и создайте объект Pushbutton с именем button на этом выводе.

#define BUTTON_PIN 14
Pushbutton button(BUTTON_PIN);

Функция displayWeight()

Мы создали функцию displayWeight(), которая принимает в качестве аргумента вес, который вы хотите отобразить на OLED.

void displayWeight(int weight){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  // Display static text
  display.println("Weight:");
  display.display();
  display.setCursor(0, 30);
  display.setTextSize(2);
  display.print(weight);
  display.print(" ");
  display.print("g");
  display.display();
}

Не знакомы с OLED-дисплеем? Прочитайте: ESP8266 OLED-дисплей с Arduino IDE.

setup()

В setup() инициализируйте Serial Monitor.

Serial.begin(115200);

Инициализируйте OLED-дисплей:

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  Serial.println(F("SSD1306 allocation failed"));
  for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);

И наконец, инициализируйте тензодатчик:

Serial.println("Initializing the scale");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

scale.set_scale(CALIBRATION_FACTOR);   // this value is obtained by calibrating the scale with known weights
scale.tare();               // reset the scale to 0

loop()

Библиотека pushbutton позволяет нам ожидать событие в случае нажатия или отпускания кнопки. В данном случае мы проверяем, была ли нажата кнопка, с помощью метода getSingleDebouncePress() и вызываем функцию tare(), если кнопка была нажата.

if (button.getSingleDebouncedPress()){
  Serial.print("tare...");
  scale.tare();
}

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

if (scale.wait_ready_timeout(200)) {
  reading = round(scale.get_units());
  Serial.print("Weight: ");
  Serial.println(reading);

В loop() мы постоянно получаем новые показания и сравниваем их с последним показанием. Если мы получили новое измерение, мы вызываем функцию displayWeight() для обновления OLED-дисплея.

if (reading != lastReading){
  displayWeight(reading);
}

Демонстрация

После загрузки кода на вашу плату вы можете начать взвешивать объекты с помощью тензодатчика. Показания будут отображаться на OLED-дисплее. Вы можете тарировать весы, нажав кнопку.

Демонстрация цифровых весов ESP8266 OLED

И снова показания на моих цифровых весах ESP8266 соответствуют показаниям на моих кухонных весах.

Тестирование цифровых весов ESP8266

Заключение

В этом руководстве вы узнали, как подключить тензометрический тензодатчик к ESP8266 с помощью усилителя HX711. Выходной сигнал тензодатчика пропорционален приложенной силе. Поэтому вы можете откалибровать его для использования в граммах, килограммах, фунтах или любых других единицах, которые подходят для вашего проекта.

Подводя итог, вы узнали, как откалибровать весы и как получить вес объектов. Вы также узнали, как создать простые цифровые весы с ESP8266, используя OLED-дисплей для отображения измерений и кнопку для тарирования весов.

Мы надеемся, что это руководство оказалось полезным для начала работы с тензодатчиком. Помимо полезности для измерения веса объектов, он также может быть полезен во многих приложениях, таких как обнаружение присутствия объекта, оценка уровня жидкости в ёмкости, вычисление скорости испарения воды, проверка наличия корма в миске вашего питомца и т.д.

Благодаря возможностям Wi-Fi ESP8266, вы можете создать IoT-весы, используя веб-сервер для отображения результатов в браузере вашего смартфона, или сохранять показания в базе данных Firebase и получать к ним доступ откуда угодно, отправлять уведомление, когда вес ниже определённого значения (по электронной почте или через Telegram, например) и т.д. Какие IoT-руководства с использованием тензодатчика вы хотели бы увидеть? Сообщите нам в комментариях ниже.

У нас есть руководства для других популярных датчиков, которые могут быть вам полезны:

Узнайте больше об ESP8266 с нашими ресурсами: