NodeMCU v3 EEPROM problem

Hi everybody.
I am just beginner and have some trouble with NodeMCU EEPROM.
I want create wifi controller for flowers.
I can’t make right sketch…
I want calibrating soil humidity sensor by 2 button in Blynk app. But all my efforts is no results…
Can someone help me?
Code work well if just reading sensors values without any EEPROM settings.

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <Wire.h>

//  период чтения датчиков не менее 2сек(2000UL)
#define READ_DATA  2000UL
uint32_t ms;      // Текущее время в милисекундах

//датчик температуры пола DS18B20
#define DS         D6               //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6)
OneWire  ds1(DS);
float tempPol  = 99.0;              // Текущие показания от датчика теплого пола ds18b20

// датчик влажн почвы
#define SENS_HUM A0                 //объявляем пин датчика влажн почвы как GPIO 17 (A0)
#define But_Min V9                  //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max V10                 //Виртуальная кнопка колибровки Max значения влажности почвы

// датчик влажн почвы
int16_t humIn;                      // Читаем показания датчика влажности почвы Аналоговый вход
int16_t humOut;                     // Оброботанные показания от датчика влажности почвы 0-100%
float MIN_SENS = 0.0;               // Калибровка 0%
float MAX_SENS = 0.0;               // Калибровка 100%


BlynkTimer timer;

////////////////////////////CONNECT////////////////////////////////////////////////
#define USE_LOCAL_SERVER

#ifdef USE_LOCAL_SERVER
      #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите
     
#endif

/*
   Wifi Credentials
*/

#define WIFI_SSID               "******"  //Имя точки доступа WIFI VVK   AndroidAP
#define WIFI_PASS               "******" //пароль точки доступа WIFI vtb24admin 1234567890

/*
     Blynk Auth Code
*/
#define AUTH                      "*******"


///////////////////////////////////////////////////////
//          Функции для подключения к Blynk          //

void ConnectBlynk()
{
  //*******************************************************
  // Запускаем WiFi
    if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся
    {
      BLYNK_LOG(WIFI_SSID);
     
      WiFi.begin(WIFI_SSID, WIFI_PASS);

      int8_t count=0;
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
        count++;
        if (count >= 5){break;Serial.println("WiFi not connected");}
      }
    }
  /*  Дисконект - для справки
    WiFi.disconnect(); // отключаемся от сети
    Serial.println("Disconnect WiFi.");
  */
 
  //*******************************************************
  // Запускаем Blynk

  if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся
    {
          // CONNECT TO BLYNK
          #ifdef USE_LOCAL_SERVER // Если используются локальный сервер
            Blynk.config(AUTH, SERVER, 8080);
            Blynk.connect();
          #else // Иначе конектимся постаринке к блинку
            Blynk.config(AUTH);
            Blynk.connect();
          #endif
    }

 
  // До бесконечности будем оставаться в цикле while
  // пока не установим связь с сервером
  //  while (Blynk.connect() == false) {}
 
}//ConnectBlynk()


// Реконектимся если обрыв связи
void reconnectBlynk() {
  if (!Blynk.connected())
  {
    BLYNK_LOG("Disconnected now");
    ConnectBlynk();
    if (Blynk.connected())
    {
      BLYNK_LOG("Reconnected");     
    }
    else
    {
      BLYNK_LOG("Not reconnected");     
    }
  }
}
////////////////////////////CONNECT-END//////////////////////////////////////////////////

////////////////////////EEPROM//////////////////////////////////////////////////////////
#include <EEPROM.h>         
#include "EEPROMAnything.h" // http://playground.arduino.cc/Code/EEPROMWriteAnything
 
  bool Recorded = false;
  int addr = 0;
  int a[3];
  enum n_addr {a_Recorded,a_MIN_SENS, a_MAX_SENS};

void setupAddrEEPROM(){
 
  a[a_Recorded]=addr;               addr+=sizeof(Recorded);

  a[a_MIN_SENS]=addr;               addr+=sizeof(MIN_SENS);
  a[a_MAX_SENS]=addr;               addr+=sizeof(MAX_SENS);
           
}

// Читаем все сохраненные настройки из EEPROM

void setupEEPROM()
{
  EEPROM.begin(512);
  EEPROM_readAnything(a[a_Recorded], Recorded); // Прочитаем из EEPROM состониие переменной Recorded
  // Если в переменной Recorded ненаходится слова true то запишем в EEPROM базовые настройки
  if (Recorded == false){
    Recorded=true;
    EEPROM_writeAnything(a[a_Recorded], Recorded);

    EEPROM_readAnything(a[a_MIN_SENS], MIN_SENS);
    EEPROM_readAnything(a[a_MAX_SENS], MAX_SENS);
  }
  EEPROM.end();
}
////////////////////////EEPROM-END//////////////////////////////////////////////////////

void sendSensor()
{
  static uint32_t msDHT = 0;
 
  byte data1[2];
 
  ds1.reset();
  ds1.write(0xCC);
  ds1.write(0x44);
 
  if (ms - msDHT >= READ_DATA)
  {
   
  Blynk.virtualWrite(V5, tempPol);
  Blynk.virtualWrite(V8, humOut);

  Blynk.virtualWrite(But_Min, HIGH);
  Blynk.virtualWrite(But_Max, HIGH);

 
// Читаем данные с ds18b20
    ds1.reset();
    ds1.write(0xCC);
    ds1.write(0xBE);
    data1[0] = ds1.read();
    data1[1] = ds1.read();
    tempPol = ((data1[1] << 8) | data1[0]) * 0.0625;
// Выводим показания в монитор порта
    Serial.print("tempPol:");
    Serial.println(tempPol);

// Читаем показания датчика влажности почвы
    humIn = analogRead(SENS_HUM);
       
// Обрабатываем показания и представляем в виде от 0 до 100
   humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
  // humOut = map(humIn, 360, 760, 0, 100);
// Выводим показания в монитор порта
    Serial.print("humIn:");
    Serial.println(humIn);
    Serial.print("MIN_SENS:");   
    Serial.println(MIN_SENS,2);
    Serial.print("MAX_SENS:");   
    Serial.println(MAX_SENS,2);
    Serial.print("humOut:");   
    Serial.println(humOut);
   
    msDHT = ms;
  }
}

void setup()
{

 
// Загружаем данные из EEPROM
  setupAddrEEPROM();
  setupEEPROM();
  delay(2000);
 
// Debug console
  Serial.begin(9600);
 
// Инициализация PIN-ов Arduino
  pinMode(SENS_HUM, INPUT);
  delay(50);
 
// Вызываем функцию подключения к Blynk
   reconnectBlynk();   
   
// Задаем интервальные таймеры
   timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером

// Инициализация датчика OneWire для DS18B20
  Wire.begin();
  delay(50);
 
}

void loop()
{
  ms = millis();
 
if( digitalRead(But_Min) == HIGH )
 {
    EEPROM.begin(512);
    EEPROM_writeAnything(a[a_MIN_SENS], MIN_SENS);
    EEPROM.end();
    delay(50);
 }
 if( digitalRead(But_Max) == HIGH )
 {
    EEPROM.begin(512);
    EEPROM_writeAnything(a[a_MAX_SENS], MAX_SENS);
    EEPROM.end();
    delay(50);
 }     
 
  sendSensor();
  if (Blynk.connected()){ Blynk.run();}
  timer.run();
}

Using EEPROM like this is a bad idea, as each memory location has an average life of 100,000 read-write operations.
You’d be better using SPIFFS or the new SmallFS storage provided in the latest ESP core.

You also need to change your code structure so that your void loop is compatible with Blynk, and use a BlynkTimer instead of your current millis functions. Read this for an example of how and why to do this:

Also, your logic regarding your minimum and maximum water levels, and updating your stored values if a new minimum or maximum value are found, seems flawed to me.
You can probably debug this much better if you add some serial print statements to show the readings that are coming from your EEPROM/SPIFFS/LittleFS system initially, and what data you are about to write back to the storage system later in your code.

Pete.

I do not worry about 100,000 read-write operations because these my 2 values (max and min) will be changed very very seldom (approx 1-2 time per month).
I want have a possible to change this values just for calibrating first time before a using this controller.
Also I tryed to change code without millis, but no results…

#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <Wire.h>

//датчик температуры пола DS18B20
#define DS         D6               //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6)
OneWire  ds1(DS);
float tempPol  = 99.0;              // Текущие показания от датчика теплого пола ds18b20

// датчик влажн почвы
#define SENS_HUM A0                 //объявляем пин датчика влажн почвы как GPIO 17 (A0)
#define But_Min V9                  //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max V10                 //Виртуальная кнопка колибровки Max значения влажности почвы

// датчик влажн почвы
int16_t humIn;                      // Читаем показания датчика влажности почвы Аналоговый вход
int16_t humOut;                     // Оброботанные показания от датчика влажности почвы 0-100%
float MIN_SENS = 0.0;               // Калибровка 0%
float MAX_SENS = 0.0;               // Калибровка 100%


BlynkTimer timer;

////////////////////////////CONNECT////////////////////////////////////////////////
#define USE_LOCAL_SERVER

#ifdef USE_LOCAL_SERVER
      #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите
      
#endif

/*
   Wifi Credentials
*/

#define WIFI_SSID               "FSB_local_network"  //Имя точки доступа WIFI VVK   AndroidAP
#define WIFI_PASS               "Megapolis888" //пароль точки доступа WIFI vtb24admin 1234567890

/*
     Blynk Auth Code
*/
#define AUTH                      "cNSP5w0pViLPZ3zkE4ynxluAEKrL9h9G"


///////////////////////////////////////////////////////
//          Функции для подключения к Blynk          //

void ConnectBlynk()
{
  //*******************************************************
  // Запускаем WiFi
    if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся
    {
      BLYNK_LOG(WIFI_SSID);
      
      WiFi.begin(WIFI_SSID, WIFI_PASS);

      int8_t count=0;
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
        count++;
        if (count >= 5){break;Serial.println("WiFi not connected");}
      }
    }
  /*  Дисконект - для справки 
    WiFi.disconnect(); // отключаемся от сети
    Serial.println("Disconnect WiFi.");
  */
  
  //*******************************************************
  // Запускаем Blynk

  if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся
    {
          // CONNECT TO BLYNK
          #ifdef USE_LOCAL_SERVER // Если используются локальный сервер
            Blynk.config(AUTH, SERVER, 8080);
            Blynk.connect();
          #else // Иначе конектимся постаринке к блинку
            Blynk.config(AUTH);
            Blynk.connect();
          #endif
    }

  
  // До бесконечности будем оставаться в цикле while
  // пока не установим связь с сервером
  //  while (Blynk.connect() == false) {}
  
}//ConnectBlynk()


// Реконектимся если обрыв связи
void reconnectBlynk() {
  if (!Blynk.connected())
  {
    BLYNK_LOG("Disconnected now");
    ConnectBlynk();
    if (Blynk.connected()) 
    {
      BLYNK_LOG("Reconnected");      
    } 
    else 
    {
      BLYNK_LOG("Not reconnected");      
    }
  }
}
////////////////////////////CONNECT-END//////////////////////////////////////////////////

////////////////////////EEPROM//////////////////////////////////////////////////////////
#include <EEPROM.h>         
#include "EEPROMAnything.h" // http://playground.arduino.cc/Code/EEPROMWriteAnything
 
  bool Recorded = false;
  int addr = 0;
  int a[3];
  enum n_addr {a_Recorded,a_MIN_SENS, a_MAX_SENS};

void setupAddrEEPROM(){
  
  a[a_Recorded]=addr;               addr+=sizeof(Recorded); 

  a[a_MIN_SENS]=addr;               addr+=sizeof(MIN_SENS);
  a[a_MAX_SENS]=addr;               addr+=sizeof(MAX_SENS);
            
}

// Читаем все сохраненные настройки из EEPROM

void setupEEPROM()
{
  EEPROM.begin(512);
  EEPROM_readAnything(a[a_Recorded], Recorded); // Прочитаем из EEPROM состониие переменной Recorded
  // Если в переменной Recorded ненаходится слова true то запишем в EEPROM базовые настройки
  if (Recorded == false){
    Recorded=true;
    EEPROM_writeAnything(a[a_Recorded], Recorded);

    EEPROM_readAnything(a[a_MIN_SENS], MIN_SENS);
    EEPROM_readAnything(a[a_MAX_SENS], MAX_SENS);
  }
  EEPROM.end();
}
////////////////////////EEPROM-END//////////////////////////////////////////////////////

void sendSensor()
{
      
  byte data1[2];
  
  ds1.reset();
  ds1.write(0xCC);
  ds1.write(0x44);
             
  Blynk.virtualWrite(V5, tempPol);
  Blynk.virtualWrite(V8, humOut);

  Blynk.virtualWrite(But_Min, HIGH);
  Blynk.virtualWrite(But_Max, HIGH); 

  
// Читаем данные с ds18b20
    ds1.reset();
    ds1.write(0xCC);
    ds1.write(0xBE);
    data1[0] = ds1.read();
    data1[1] = ds1.read();
    tempPol = ((data1[1] << 8) | data1[0]) * 0.0625;
// Выводим показания в монитор порта
    Serial.print("tempPol:");
    Serial.println(tempPol);

// Читаем показания датчика влажности почвы
    humIn = analogRead(SENS_HUM);
        
// Обрабатываем показания и представляем в виде от 0 до 100
   humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
  // humOut = map(humIn, 360, 760, 0, 100);
// Выводим показания в монитор порта
    Serial.print("humIn:");
    Serial.println(humIn);
    Serial.print("MIN_SENS:");    
    Serial.println(MIN_SENS,2);
    Serial.print("MAX_SENS:");    
    Serial.println(MAX_SENS,2);
    Serial.print("humOut:");    
    Serial.println(humOut); 
     
}

void setup()
{
  
// Загружаем данные из EEPROM
  setupAddrEEPROM();
  setupEEPROM();
  delay(2000);
  
// Debug console
  Serial.begin(9600);
  
// Инициализация PIN-ов Arduino
  pinMode(SENS_HUM, INPUT);
  delay(50);
  
// Вызываем функцию подключения к Blynk
   reconnectBlynk();    

    
// Задаем интервальные таймеры
   timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером

   timer.setInterval(1000L, sendSensor);
   
// Инициализация датчика OneWire для DS18B20 
  Wire.begin();
  delay(50);
  
}

void loop()
{
     
if( digitalRead(But_Min) == HIGH )
 {
    EEPROM.begin(512);
    EEPROM_writeAnything(a[a_MIN_SENS], MIN_SENS);
    EEPROM.end();
    delay(50);
 }
 if( digitalRead(But_Max) == HIGH )
 {
    EEPROM.begin(512);
    EEPROM_writeAnything(a[a_MAX_SENS], MAX_SENS);
    EEPROM.end();
    delay(50);
 }      
  
  if (Blynk.connected()){ Blynk.run();}
  timer.run();
}

What exactly does this mean ? …

Are you able to connect to Blynk?
Are you seeing any reading in the serial monitor?

Pete.

01:00:42.038 -> .6.6.6.6.6[4671] Not reconnected
01:00:45.368 -> tempPol:25.00
01:00:45.368 ->
01:00:45.368 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
01:00:45.436 ->
01:00:45.436 -> Exception (0):
01:00:45.470 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
01:00:45.538 ->
01:00:45.538 -> >>>stack>>>
01:00:45.572 ->
01:00:45.572 -> ctx: cont
01:00:45.572 -> sp: 3ffffd80 end: 3fffffc0 offset: 0190
01:00:45.606 -> 3fffff10: 4020599b 3ffeebb8 3ffeed80 40204808
01:00:45.674 -> 3fffff20: 3ffeebbc 3ffeebb8 3ffeed80 402021ba
01:00:45.708 -> 3fffff30: 00000000 3ffeec20 00000000 3ffeeeac
01:00:45.775 -> 3fffff40: 3ffee96c 00000000 3ffeee6c 00000000
01:00:45.843 -> 3fffff50: 3ffee96c 00000001 3ffee990 40203d14
01:00:45.877 -> 3fffff60: 0000123f 000003e8 00001740 00000000
01:00:45.945 -> 3fffff70: 00000001 00000002 00000032 40204e8c
01:00:45.979 -> 3fffff80: 00000000 00000000 00000001 3ffeeeac
01:00:46.047 -> 3fffff90: 3fffdad0 00000000 3ffeee6c 4020245f
01:00:46.081 -> 3fffffa0: feefeffe feefeffe 3ffeee6c 40204fa4
01:00:46.149 -> 3fffffb0: feefeffe feefeffe 3ffe84f8 40100f29
01:00:46.217 -> <<<stack<<<

If I deleted all EEPROM settings code works well.

I tried create other code and same but with EEPROMAnything - no results again ((

#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <Wire.h>

//  период чтения датчиков не менее 2сек(2000UL)
//#define READ_DATA  2000UL
//uint32_t ms;      // Текущее время в милисекундах

//датчик температуры пола DS18B20
#define DS         D6               //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6)
OneWire  ds1(DS);
float tempPol  = 99.0;              // Текущие показания от датчика теплого пола ds18b20

// датчик влажн почвы
#define SENS_HUM A0                 //объявляем пин датчика влажн почвы как GPIO 17 (A0)
#define But_Min V9                  //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max V10                 //Виртуальная кнопка колибровки Max значения влажности почвы

// датчик влажн почвы
int16_t humIn;                      // Читаем показания датчика влажности почвы Аналоговый вход
int16_t humOut;                     // Оброботанные показания от датчика влажности почвы 0-100%
float MIN_SENS = 420;               // Калибровка 0%
float MAX_SENS = 210;               // Калибровка 100%


BlynkTimer timer;

////////////////////////////CONNECT////////////////////////////////////////////////
#define USE_LOCAL_SERVER

#ifdef USE_LOCAL_SERVER
  #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите
 
#endif

/*
   Wifi Credentials
*/

#define WIFI_SSID               "***"  //Имя точки доступа WIFI VVK   AndroidAP
#define WIFI_PASS               "***" //пароль точки доступа WIFI vtb24admin 1234567890

/*
 Blynk Auth Code
*/
#define AUTH                      "***"


///////////////////////////////////////////////////////
//          Функции для подключения к Blynk          //

void ConnectBlynk()
{
  //*******************************************************
  // Запускаем WiFi
if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся
{
  BLYNK_LOG(WIFI_SSID);
 
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  int8_t count=0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    Serial.print(WiFi.status());
    count++;
    if (count >= 5){break;Serial.println("WiFi not connected");}
  }
}
  /*  Дисконект - для справки
WiFi.disconnect(); // отключаемся от сети
Serial.println("Disconnect WiFi.");
  */

  //*******************************************************
  // Запускаем Blynk

  if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся
{
      // CONNECT TO BLYNK
      #ifdef USE_LOCAL_SERVER // Если используются локальный сервер
        Blynk.config(AUTH, SERVER, 8080);
        Blynk.connect();
      #else // Иначе конектимся постаринке к блинку
        Blynk.config(AUTH);
        Blynk.connect();
      #endif
}


  // До бесконечности будем оставаться в цикле while
  // пока не установим связь с сервером
  //  while (Blynk.connect() == false) {}

}//ConnectBlynk()


// Реконектимся если обрыв связи
void reconnectBlynk() {
  if (!Blynk.connected())
  {
BLYNK_LOG("Disconnected now");
ConnectBlynk();
if (Blynk.connected())
{
  BLYNK_LOG("Reconnected");    
}
else
{
  BLYNK_LOG("Not reconnected");    
}
  }
}
////////////////////////////CONNECT-END//////////////////////////////////////////////////

////////////////////////EEPROM//////////////////////////////////////////////////////////
#include <EEPROM.h>
//#include "EEPROMAnything.h"

void setupAddrEEPROM(){

EEPROM.begin(8);
EEPROM.get(0, MIN_SENS);
EEPROM.get(4, MAX_SENS);
//EEPROM_readAnything(0, MIN_SENS);
//EEPROM_readAnything(4, MAX_SENS);
EEPROM.end();

}
   

////////////////////////EEPROM-END//////////////////////////////////////////////////////

void sendSensor()
{
// static uint32_t msDHT = 0;

  byte data1[2];

  ds1.reset();
  ds1.write(0xCC);
  ds1.write(0x44);

//  if (ms - msDHT >= READ_DATA)
//  {
   
  Blynk.virtualWrite(V5, tempPol);
  Blynk.virtualWrite(V8, humOut);

  //Blynk.virtualWrite(But_Min, HIGH);
  //Blynk.virtualWrite(But_Max, HIGH);


// Читаем данные с ds18b20
ds1.reset();
ds1.write(0xCC);
ds1.write(0xBE);
data1[0] = ds1.read();
data1[1] = ds1.read();
tempPol = ((data1[1] << 8) | data1[0]) * 0.0625;
// Выводим показания в монитор порта
Serial.print("tempPol:");
Serial.println(tempPol);

// Читаем показания датчика влажности почвы
humIn = analogRead(SENS_HUM);
   
// Обрабатываем показания и представляем в виде от 0 до 100
   humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
   //humOut = map(humIn, 480, 210, 0, 100);
// Выводим показания в монитор порта
Serial.print("humIn:");
Serial.println(humIn);
Serial.print("MIN_SENS:");  
Serial.println(MIN_SENS);
Serial.print("MAX_SENS:");  
Serial.println(MAX_SENS);
Serial.print("humOut:");  
Serial.println(humOut);
   
//   msDHT = ms;
//  }
}

void setup()
{

// Debug console
  Serial.begin(9600);
   
// Загружаем данные из EEPROM
  setupAddrEEPROM();

  delay(2000);

// Инициализация PIN-ов Arduino
  pinMode(SENS_HUM, INPUT);
  delay(50);

// Вызываем функцию подключения к Blynk
   reconnectBlynk();  

// Задаем интервальные таймеры
   timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером

   timer.setInterval(1500L, sendSensor);
 
// Инициализация датчика OneWire для DS18B20
  Wire.begin();
  delay(50);

}

void loop()
{
  //ms = millis();

if( !digitalRead(But_Min) == 1 )
{
EEPROM.begin(8);
EEPROM.put(0, MIN_SENS);
//EEPROM_writeAnything(0, MIN_SENS);
EEPROM.get(0, MIN_SENS);
//EEPROM_readAnything(0, MIN_SENS);
EEPROM.end();
delay(50);
}
if( !digitalRead(But_Max) == 1 )
{
EEPROM.begin(8);
EEPROM.put(4, MAX_SENS);
//EEPROM_writeAnything(4, MAX_SENS);
EEPROM.get(4, MAX_SENS);
//EEPROM_readAnything(4, MAX_SENS);
EEPROM.end();
delay(50);
}    
   
// sendSensor();
  if (Blynk.connected()){ Blynk.run();}
  timer.run();
}

After changed
humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
on
humOut = map(humIn, 480, 210, 0, 100);
And code work,

01:40:54.546 -> ___ __ __
01:40:54.580 -> / _ )/ /_ _____ / /__
01:40:54.580 -> / _ / / // / _ / '/
01:40:54.580 -> /
//_, /////_
01:40:54.614 -> /
__/ v0.6.1 on NodeMCU
01:40:54.648 ->
01:40:54.648 -> [648] Connecting to 192.168.1.17
01:40:54.682 -> [721] Ready (ping: 17ms).
01:40:54.716 -> [788] Reconnected
01:40:57.129 -> tempPol:28.19
01:40:57.129 -> humIn:288
01:40:57.129 -> MIN_SENS:0.00
01:40:57.163 -> MAX_SENS:0.00
01:40:57.163 -> humOut:71

but why
MIN_SENS:0.00
MAX_SENS:0.00
And buttons in app don’t work ((

Little bit progress…
I added
EEPROM.put(0, MIN_SENS);
EEPROM.put(4, MAX_SENS);
in void setupAddrEEPROM()
And this work, BUT buttons in app still did not work ((

#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <Wire.h>

//  период чтения датчиков не менее 2сек(2000UL)
//#define READ_DATA  2000UL
//uint32_t ms;      // Текущее время в милисекундах

//датчик температуры пола DS18B20
#define DS         D6               //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6)
OneWire  ds1(DS);
float tempPol  = 99.0;              // Текущие показания от датчика теплого пола ds18b20

// датчик влажн почвы
#define SENS_HUM A0                 //объявляем пин датчика влажн почвы как GPIO 17 (A0)
#define But_Min V9                  //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max V10                 //Виртуальная кнопка колибровки Max значения влажности почвы

// датчик влажн почвы
int16_t humIn;                      // Читаем показания датчика влажности почвы Аналоговый вход
int16_t humOut;                     // Оброботанные показания от датчика влажности почвы 0-100%
float MIN_SENS = 480;               // Калибровка 0%
float MAX_SENS = 210;               // Калибровка 100%


BlynkTimer timer;

////////////////////////////CONNECT////////////////////////////////////////////////
#define USE_LOCAL_SERVER

#ifdef USE_LOCAL_SERVER
      #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите
      
#endif

/*
   Wifi Credentials
*/

#define WIFI_SSID               "***"  //Имя точки доступа WIFI VVK   AndroidAP
#define WIFI_PASS               "***" //пароль точки доступа WIFI vtb24admin 1234567890

/*
     Blynk Auth Code
*/
#define AUTH                      "***"


///////////////////////////////////////////////////////
//          Функции для подключения к Blynk          //

void ConnectBlynk()
{
  //*******************************************************
  // Запускаем WiFi
    if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся
    {
      BLYNK_LOG(WIFI_SSID);
      
      WiFi.begin(WIFI_SSID, WIFI_PASS);

      int8_t count=0;
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
        count++;
        if (count >= 5){break;Serial.println("WiFi not connected");}
      }
    }
  /*  Дисконект - для справки
    WiFi.disconnect(); // отключаемся от сети
    Serial.println("Disconnect WiFi.");
  */
 
  //*******************************************************
  // Запускаем Blynk

  if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся
    {
          // CONNECT TO BLYNK
          #ifdef USE_LOCAL_SERVER // Если используются локальный сервер
            Blynk.config(AUTH, SERVER, 8080);
            Blynk.connect();
          #else // Иначе конектимся постаринке к блинку
            Blynk.config(AUTH);
            Blynk.connect();
          #endif
    }

 
  // До бесконечности будем оставаться в цикле while
  // пока не установим связь с сервером
  //  while (Blynk.connect() == false) {}
 
}//ConnectBlynk()


// Реконектимся если обрыв связи
void reconnectBlynk() {
  if (!Blynk.connected())
  {
    BLYNK_LOG("Disconnected now");
    ConnectBlynk();
    if (Blynk.connected())
    {
      BLYNK_LOG("Reconnected");     
    }
    else
    {
      BLYNK_LOG("Not reconnected");     
    }
  }
}
////////////////////////////CONNECT-END//////////////////////////////////////////////////

////////////////////////EEPROM//////////////////////////////////////////////////////////
#include <EEPROM.h>
//

void setupAddrEEPROM(){
 
    EEPROM.begin(8);
    EEPROM.put(0, MIN_SENS);
    EEPROM.put(4, MAX_SENS);
    EEPROM.get(0, MIN_SENS);
    EEPROM.get(4, MAX_SENS);
    EEPROM.end();
 
}
    

////////////////////////EEPROM-END//////////////////////////////////////////////////////

void sendSensor()
{
 // static uint32_t msDHT = 0;
 
  byte data1[2];
 
  ds1.reset();
  ds1.write(0xCC);
  ds1.write(0x44);
 
//  if (ms - msDHT >= READ_DATA)
//  {
    
  Blynk.virtualWrite(V5, tempPol);
  Blynk.virtualWrite(V8, humOut);

  //Blynk.virtualWrite(But_Min, HIGH);
  //Blynk.virtualWrite(But_Max, HIGH);

 
// Читаем данные с ds18b20
    ds1.reset();
    ds1.write(0xCC);
    ds1.write(0xBE);
    data1[0] = ds1.read();
    data1[1] = ds1.read();
    tempPol = ((data1[1] << 8) | data1[0]) * 0.0625;
// Выводим показания в монитор порта
    Serial.print("tempPol:");
    Serial.println(tempPol);

// Читаем показания датчика влажности почвы
    humIn = analogRead(SENS_HUM);
        
// Обрабатываем показания и представляем в виде от 0 до 100
   humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
   //humOut = map(humIn, 480, 210, 0, 100);
// Выводим показания в монитор порта
    Serial.print("humIn:");
    Serial.println(humIn);
    Serial.print("MIN_SENS:");   
    Serial.println(MIN_SENS);
    Serial.print("MAX_SENS:");   
    Serial.println(MAX_SENS);
    Serial.print("humOut:");   
    Serial.println(humOut);
    

 //   msDHT = ms;
//  }
}

void setup()
{

// Debug console
  Serial.begin(9600);
    
// Загружаем данные из EEPROM
  setupAddrEEPROM();
  delay(2000); 
 
// Инициализация PIN-ов Arduino
  pinMode(SENS_HUM, INPUT);
  delay(50);
 
// Вызываем функцию подключения к Blynk
   reconnectBlynk();   

// Задаем интервальные таймеры
   timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером

   timer.setInterval(1500L, sendSensor);
    
// Инициализация датчика OneWire для DS18B20
  Wire.begin();
  delay(50);
 
}

void loop()
{
  //ms = millis();
 
if( digitalRead(But_Min) == HIGH  )
 {
    EEPROM.begin(8);
    EEPROM.put(0, MIN_SENS);
    EEPROM.end();
    delay(50);
 }
 if( digitalRead(But_Max) == HIGH  )
 {
    EEPROM.begin(8);
    EEPROM.put(4, MAX_SENS);
    EEPROM.end();
    delay(50);
 }     
    
 // sendSensor();
  if (Blynk.connected()){ Blynk.run();}
  timer.run();
}

I did it!

#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <Wire.h>

//датчик температуры пола DS18B20
#define DS         D6               //объявляем пин датчика температуры пола DS18B20 как GPIO 12 (D6)
OneWire  ds1(DS);
float tempPol  = 99.0;              // Текущие показания от датчика теплого пола ds18b20

// датчик влажн почвы
#define SENS_HUM A0                 //объявляем пин датчика влажн почвы как GPIO 17 (A0)
#define But_Min V9                  //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max V10                 //Виртуальная кнопка колибровки Max значения влажности почвы

// датчик влажн почвы
int16_t humIn;                      // Читаем показания датчика влажности почвы Аналоговый вход
int16_t humOut;                     // Оброботанные показания от датчика влажности почвы 0-100%
float MIN_SENS = 480;               // Калибровка 0%
float MAX_SENS = 210;               // Калибровка 100%


BlynkTimer timer;

////////////////////////////CONNECT////////////////////////////////////////////////
#define USE_LOCAL_SERVER

#ifdef USE_LOCAL_SERVER
      #define SERVER IPAddress(192, 168, 1, 17) // Свой IP пишите
      
#endif

/*
   Wifi Credentials
*/

#define WIFI_SSID               "**"  //Имя точки доступа WIFI VVK   AndroidAP
#define WIFI_PASS               "**" //пароль точки доступа WIFI vtb24admin 1234567890

/*
     Blynk Auth Code
*/
#define AUTH                      "**"


///////////////////////////////////////////////////////
//          Функции для подключения к Blynk          //

void ConnectBlynk()
{
  //*******************************************************
  // Запускаем WiFi
    if (WiFi.status() != WL_CONNECTED)// Если нет WiFi, то коннектимся
    {
      BLYNK_LOG(WIFI_SSID);
      
      WiFi.begin(WIFI_SSID, WIFI_PASS);

      int8_t count=0;
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
        count++;
        if (count >= 5){break;Serial.println("WiFi not connected");}
      }
    }
  /*  Дисконект - для справки
    WiFi.disconnect(); // отключаемся от сети
    Serial.println("Disconnect WiFi.");
  */
 
  //*******************************************************
  // Запускаем Blynk

  if (WiFi.status() == WL_CONNECTED)// Если нет WiFi, то не коннектимся
    {
          // CONNECT TO BLYNK
          #ifdef USE_LOCAL_SERVER // Если используются локальный сервер
            Blynk.config(AUTH, SERVER, 8080);
            Blynk.connect();
          #else // Иначе конектимся постаринке к блинку
            Blynk.config(AUTH);
            Blynk.connect();
          #endif
    }

 
  // До бесконечности будем оставаться в цикле while
  // пока не установим связь с сервером
  //  while (Blynk.connect() == false) {}
 
}//ConnectBlynk()


// Реконектимся если обрыв связи
void reconnectBlynk() {
  if (!Blynk.connected())
  {
    BLYNK_LOG("Disconnected now");
    ConnectBlynk();
    if (Blynk.connected())
    {
      BLYNK_LOG("Reconnected");     
    }
    else
    {
      BLYNK_LOG("Not reconnected");     
    }
  }
}
////////////////////////////CONNECT-END//////////////////////////////////////////////////

////////////////////////EEPROM//////////////////////////////////////////////////////////
#include <EEPROM.h>

void setupAddrEEPROM(){
 
    EEPROM.begin(8);
    EEPROM.get(0, MIN_SENS);
    EEPROM.get(4, MAX_SENS);
    if(int16_t(MIN_SENS) == 0)
    {
      EEPROM.begin(8);
      MIN_SENS = 480;
      EEPROM.put(0, MIN_SENS);
      EEPROM.end();
    }
    if(int16_t(MAX_SENS) == 0)
    {
      EEPROM.begin(8);
      MAX_SENS = 210;
      EEPROM.put(4, MAX_SENS);
      EEPROM.end();
    }
    EEPROM.end();
  }
    

////////////////////////EEPROM-END//////////////////////////////////////////////////////

void pressVButton_Min() {
    EEPROM.begin(8);
    MIN_SENS = analogRead(SENS_HUM);
    EEPROM.put(0, MIN_SENS);
    EEPROM.end();
    delay(50);
}

BLYNK_WRITE(But_Min){
  int pinValue = param.asInt();
  Serial.print("But_Min: ");
  Serial.println(pinValue);
  if(pinValue == 1) {
    pressVButton_Min();
    }
 }
 
void pressVButton_Max() {
    EEPROM.begin(8);
    MAX_SENS = analogRead(SENS_HUM);
    EEPROM.put(4, MAX_SENS);
    EEPROM.end();
    delay(50);
}
 
BLYNK_WRITE(But_Max){
  int pinValue2 = param.asInt();
  Serial.print("But_Max: ");
  Serial.println(pinValue2);
  if(pinValue2 == 1) {
    pressVButton_Max();
    }
 }

void sendSensor()
{
 
  byte data1[2];
 
  ds1.reset();
  ds1.write(0xCC);
  ds1.write(0x44);
      
  Blynk.virtualWrite(V5, tempPol);
  Blynk.virtualWrite(V8, humOut);
    
// Читаем данные с ds18b20
    ds1.reset();
    ds1.write(0xCC);
    ds1.write(0xBE);
    data1[0] = ds1.read();
    data1[1] = ds1.read();
    tempPol = ((data1[1] << 8) | data1[0]) * 0.0625;
// Выводим показания в монитор порта
    Serial.print("tempPol:");
    Serial.println(tempPol);

// Читаем показания датчика влажности почвы
    humIn = analogRead(SENS_HUM);
        
// Обрабатываем показания и представляем в виде от 0 до 100
   humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);

// Выводим показания в монитор порта
    Serial.print("humIn:");
    Serial.println(humIn);
    Serial.print("MIN_SENS:");   
    Serial.println(MIN_SENS);
    Serial.print("MAX_SENS:");   
    Serial.println(MAX_SENS);
    Serial.print("humOut:");   
    Serial.println(humOut);

}

void setup()
{

// Debug console
  Serial.begin(9600);
    
// Загружаем данные из EEPROM
  setupAddrEEPROM();
  delay(2000);
 
// Инициализация PIN-ов Arduino
  pinMode(SENS_HUM, INPUT);
  delay(50);
 
// Вызываем функцию подключения к Blynk
   reconnectBlynk();   

// Задаем интервальные таймеры
   timer.setInterval(30000, reconnectBlynk); // Проверяем есть ли связь с сервером

   timer.setInterval(1500L, sendSensor);
    
// Инициализация датчика OneWire для DS18B20
  Wire.begin();
  delay(50);
 
}

void loop()
{
  if (Blynk.connected()){ Blynk.run();}
  timer.run();
}