дарова епта. изучи хорошо мой код //===ПАРСИНГ===
#define PARSE_AMOUNT 5      // число значений в массиве, который хотим получить
int intData[PARSE_AMOUNT];  // массив численных значений после парсинга
bool recievedFlag;
bool getStarted;
byte index_buf = 0;
String string_convert = "";
//===HX711===
#include "HX711.h"
HX711 scale[4]; // Массив из 4 объектов HX711 для 4 датчиков
#define  SPEED_MODE 0 //ускорение датчика до 80мгц
#define STABILIZATION 2 //количество замеров для усреднения результата
int pins_DT[] = { 3, 5, 7, 9 };
int pins_CLK[] = { 2, 4, 6, 8 };
float calibration_factor[] = { 0, 0, 0, 0}; // калибровка датчика
//====LCD=====
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

#include <EEPROM.h>

// Функция для записи массива float в EEPROM с проверкой на совпадение
void writeFloatArrayToEEPROM(int startAddr, float arr[], int length) {
  int addr = startAddr;
  for (int i = 0; i < length; i++) {
    float storedValue;
    EEPROM.get(addr, storedValue);

    // Записываем в EEPROM только если значения отличаются
    if (arr[i] != storedValue) {
      EEPROM.put(addr, arr[i]);
      // Serial.print("Value updated at address ");
      // Serial.print(addr);
      // Serial.print(": ");
      // Serial.println(arr[i], 2);
    } else {
      // Serial.print("No change at address ");
      // Serial.println(addr);
    }

    addr += sizeof(float); // Смещаем адрес на размер float (4 байта)
  }
}

// Функция для считывания массива float из EEPROM
void readFloatArrayFromEEPROM(int startAddr, float arr[], int length) {
  int addr = startAddr;
  for (int i = 0; i < length; i++) {
    EEPROM.get(addr, arr[i]);
    addr += sizeof(float); // Смещаем адрес на размер float (4 байта)
  }
}

//ЧТЕНИЕ ДАННЫХ С HX711
float read_HX711(int scales, bool ini = false) {
  if (ini) { //инициализация датчика
    if (SPEED_MODE)
    { //ускорение датчика до 80мгц
      scale[scales].power_up();  // Включаем датчик
      // Установим частоту на 80 Гц
      pinMode(pins_CLK[scales], OUTPUT);
      digitalWrite(pins_CLK[scales], HIGH); // Устанавливаем SCK в HIGH для 80 Гц
      delayMicroseconds(60); // Удерживаем сигнал
    }
    scale[scales].begin(pins_DT[scales], pins_CLK[scales]);
    scale[scales].set_scale();
    scale[scales].tare();
    scale[scales].set_scale(calibration_factor[scales]); // применяем калибровку

    return;
  }
  float unit;
  if (STABILIZATION > 0)  {
    for (int ii = 0; ii < STABILIZATION; ii++) {
      unit = + scale[scales].get_units(), 10;  // выполняем замеры 10 раз
    }
    unit / STABILIZATION;
    if (unit * 0.035274 < 0)  return -1.0;
    else return unit * 0.035274;
  }
  unit = + scale[scales].get_units(), 10; // делим значения на 10
  if (unit * 0.035274 < 0)  return -1.0;
  else return unit * 0.035274;
}

// КАЛИБРОВКА HX711
float calibration_HX711(int scales, int calibr_mas) {
  float units;
  float ounces;
  // Сбрасываем датчик на 0 (тарируем)
  scale[scales].set_scale();
  scale[scales].tare();
  delay(10000);  // Ждем 10 секунд для стабилизации
  // Запрашиваем текущее значение от датчика
  long reading = scale[scales].get_units(10); // усредняем за 10 измерений
  // Вычисляем калибровочный коэффициент
  calibration_factor[scales] = reading / calibr_mas;
  // Применяем новый калибровочный коэффициент
  scale[scales].set_scale(calibration_factor[scales]);
  // Повторно считываем данные после калибровки
  units = scale[scales].get_units(10); // усредняем за 10 измерений
  // Если значение отрицательное, приводим его к 0
  if (units < 0) {
    units = 0.00;
  }

  // Переводим из граммов в унции
  ounces = units * 0.035274;
  //записываем новое значение калибровки в еепром
  writeFloatArrayToEEPROM(0, calibration_factor, 4);
  // Возвращаем массу в унциях
  return ounces;
}