NodeMCU v3 + Blynk + EEPROM

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?

#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();
}

Code work well if just reading sensors values without any EEPROM settings.

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();
}