NodeMCU v3 + Blynk, проблема с EEPROM

SPAX

Member
Всем привет.
Сразу скажу, я новичок, в программировании ардуин очень мало шарю, создавал скетч по образу и подобию с разных других проектов...
Хочу сделать вайфай контроллер за наблюдением температуры и влажности почвы через приложение Blynk.
Имеется NodeMCU v3, DS18B20 и ёмкостной датчик влажности почвы.
Хочу сделать калибровку (мин/макс) датчика влажности почвы путём нажатия кнопок в приложении. Но при добавлении кода еепром в скетч, перестало работать, если убрать весь код с еепром и считывать только показания датчиков, то всё работает...

Код:
#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();
}
 

svs2007m

Active member
Вроде "EEPROMAnything.h" используется для записи структур. Поэтому библиотека сама рассчитывает адреса и длину записи. А у вас все в куче.
 

svs2007m

Active member
EEPROM_readAnything и EEPROM_writeAnything. Это библиотека "EEPROMAnything.h" . А EEPROM.begin(512) и EEPROM.end()
это EEPROM.h. Для каждой из библиотек есть "примеры" в Arduino IDE.
 

svs2007m

Active member
Дружище, для работы с EEPROM библиотека EEPROM.h используется ВСЕГДА. И соответственно функции EEPROM.write(addr, val) и т.д. (см. ПРИМЕРЫ!!!!!). А также мудрые мужички с бородой скажут что это правильное решение для оптимизации памяти или на конец использовать SPIFFS.
EEPROMAnything.h слишком много "жрет". Особенно это критично когда на ней висит какой-нибудь сервер. Но позволяет не "заморачиваться"с адресами и длиной записи (в структуре типа пароли шифры явки для идентификации где либо).
 

SPAX

Member
Дружище, для работы с EEPROM библиотека EEPROM.h используется ВСЕГДА. И соответственно функции EEPROM.write(addr, val) и т.д. (см. ПРИМЕРЫ!!!!!). А также мудрые мужички с бородой скажут что это правильное решение для оптимизации памяти или на конец использовать SPIFFS.
EEPROMAnything.h слишком много "жрет". Особенно это критично когда на ней висит какой-нибудь сервер. Но позволяет не "заморачиваться"с адресами и длиной записи (в структуре типа пароли шифры явки для идентификации где либо).
Как уже сказал, я пробовал убирать бегин и энд, не помогло, попробую ещё с ручным прописанием адресов...хз только пока, как это сделать...
 

svs2007m

Active member
Для работы с EEPROM функции EEPROM.begin(512) и EEPROM.end() ОБЯЗАТАЕЛЬНЫ !!!!!!!!!! У этой библиотеки ДРУГИЕ функции чтения и записи чем у тебя в коде. Если нет структуры убери EPROMAnything.h и все ее функции типа EEPROM_writeAnything() и
EEPROM_readAnything.
 

SPAX

Member
Для работы с EEPROM функции EEPROM.begin(512) и EEPROM.end() ОБЯЗАТАЕЛЬНЫ !!!!!!!!!! У этой библиотеки ДРУГИЕ функции чтения и записи чем у тебя в коде. Если нет структуры убери EPROMAnything.h и все ее функции типа EEPROM_writeAnything() и
EEPROM_readAnything.
Переделал по другому...всё равно не работает((
Код:
#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>         

void setupAddrEEPROM()
{
// Читаем все сохраненные настройки из EEPROM 
  EEPROM.get(0, MIN_SENS);
  EEPROM.get(4, MAX_SENS);
}




////////////////////////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.begin(8);
 
// Debug console
  Serial.begin(9600);
    
// Загружаем данные из EEPROM
  setupAddrEEPROM();

  EEPROM.commit();
  delay(2000);
 

 
// Инициализация 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(8);
    EEPROM.put(0, MIN_SENS);
    EEPROM.commit();
    delay(50);
 }
 if( digitalRead(But_Max) == HIGH )
 {
    EEPROM.begin(8);
    EEPROM.put(4, MAX_SENS);
    EEPROM.commit();
    delay(50);
 }     
 
 // sendSensor();
  if (Blynk.connected()){ Blynk.run();}
  timer.run();
}
 

SPAX

Member
Вот, что в монитор порта сыпет.
21:00:07.761 -> ?⸮⸮!9⸮
21:00:07.795 ->
21:00:07.795 -> f[2119] Disconnected now
21:00:09.936 -> [2120]
21:00:09.970 -> ___ __ __
21:00:09.970 -> / _ )/ /_ _____ / /__
21:00:10.004 -> / _ / / // / _ \/ '_/
21:00:10.038 -> /____/_/\_, /_//_/_/\_\
21:00:10.072 -> /___/ v0.6.1 on NodeMCU
21:00:10.106 ->
21:00:10.106 -> [2168] Connecting to 192.168.1.17
21:00:10.378 -> [2567] Ready (ping: 9ms).
21:00:10.446 -> [2634] Reconnected
21:00:11.636 -> tempPol:27.94
21:00:11.636 ->
21:00:11.636 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
21:00:11.704 ->
21:00:11.704 -> Exception (0):
21:00:11.737 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
21:00:11.805 ->
21:00:11.805 -> >>>stack>>>
21:00:11.839 ->
21:00:11.839 -> ctx: cont
21:00:11.839 -> sp: 3ffffd80 end: 3fffffc0 offset: 0190
21:00:11.873 -> 3fffff10: 40205b83 3ffeeba4 3ffeed78 402049f4
21:00:11.941 -> 3fffff20: 3ffeeba8 3ffeeba4 3ffeed78 4020217a
21:00:11.975 -> 3fffff30: 00000000 3ffeebe0 00000000 3ffeeea4
21:00:12.043 -> 3fffff40: 3ffee958 00000000 3ffeee64 00000000
21:00:12.111 -> 3fffff50: 3ffee958 00000001 3ffee97c 40203cfc
21:00:12.145 -> 3fffff60: 00000a4b 000003e8 00000e33 00000000
21:00:12.213 -> 3fffff70: 00000001 00000002 00000032 40205074
21:00:12.247 -> 3fffff80: 00000000 00000000 00000001 3ffeeea4
21:00:12.315 -> 3fffff90: 3fffdad0 00000000 3ffeee64 40202446
21:00:12.349 -> 3fffffa0: feefeffe feefeffe 3ffeee64 4020518c
21:00:12.417 -> 3fffffb0: feefeffe feefeffe 3ffe84f8 40100f29
21:00:12.485 -> <<<stack<<<
 

CodeNameHawk

Moderator
Команда форума
Викиньте весь код блинка и проверьте работает ли запись в еппром.
 

CodeNameHawk

Moderator
Команда форума
void loop() { if( digitalRead(But_Min) == HIGH ) { EEPROM.begin(8); EEPROM.put(0, MIN_SENS); EEPROM.commit(); delay(50); }
Писать в еепром, пока нога HIGH уже ошибка. Вам нужна дырка в еппром?
А так в
if( digitalRead(But_Min) == HIGH )
{
EEPROM.begin(8);
EEPROM.put(0, MIN_SENS);
EEPROM.commit();
delay(50);
}
добавьте EEPROM.end , пишут, что стирает копию в RAM.
 

CodeNameHawk

Moderator
Команда форума
void setupAddrEEPROM() { // Читаем все сохраненные настройки из EEPROM EEPROM.get(0, MIN_SENS); EEPROM.get(4, MAX_SENS); }
А где EEPROM.end(); ?

Код:
#include <EEPROM.h>

float MIN_SENS = 123.0;               
float MIN_SENS_READ;         

void setup()
{
  // initialize serial and wait for port to open:
  Serial.begin(115200);

  Serial.println();
  Serial.print("Start time write to eeprom - ");
  Serial.println(millis());
 
    EEPROM.begin(8);
    EEPROM.put(0, MIN_SENS);
    EEPROM.commit();
    EEPROM.end();
    
  Serial.print("End time write to eeprom - ");
  Serial.println(millis());
    
    MIN_SENS_READ = 25.55;
    Serial.print("MIN_SENS_READ now is - ");
    Serial.println(MIN_SENS_READ);
 
    EEPROM.begin(8);
    EEPROM.get(0, MIN_SENS_READ);
    EEPROM.end();
}

void loop()
{
  Serial.println();
  Serial.print("Readed MIN_SENS_READ from eeeprom - ");
  Serial.println(MIN_SENS_READ);
  delay(5000);
}
Этот код работает.

Код:
Start time write to eeprom - 64
End time write to eeprom - 64
MIN_SENS_READ now is - 25.55
Readed MIN_SENS_READ from eeeprom - 123.00
Readed MIN_SENS_READ from eeeprom - 123.00
 

SPAX

Member
Ну так это вы написали, что проблема с еппром, а сейчас спрашиваете зачем проверить её (еппром) работу.
Так я сказал "нифига", а не "нафига")) я проверил и не сработало имел ввиду))
Писать в еепром, пока нога HIGH уже ошибка. Вам нужна дырка в еппром?
а как правильно сделать запись на кнопку?
добавьте EEPROM.end , пишут, что стирает копию в RAM.
на сколько я понял, пишут в конце либо энд, либо коммит...я пробовал и энд писать, так же не работало...
Они в void setup() записаны....
 

SPAX

Member
Читайте документацию
ну, всё верно, как я и сказал, "вы должны использовать коммит вместе с врайт, энд так же как и коммит, только ещё чистит рам...."

ну как же нет, вот:
Код:
void setup()
{
  EEPROM.begin(8);
 
// Debug console
  Serial.begin(9600);
    
// Загружаем данные из EEPROM
  setupAddrEEPROM();

  EEPROM.commit();
  delay(2000);
 

SPAX

Member
Попробовал вот так:
Код:
#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();
}
И тоже самое, но с EEPROMAnything....тоже нифига не хочет работать(( перед каждой записью, заливаю скетч на очистку еепром....
Такое ощущение, что он не задаёт первоначальные параметры MAX_SENS и MIN_SENS и не может их прочитать из еепром... хотя я же в самом начале задал
float MIN_SENS = 420; // Калибровка 0%
float MAX_SENS = 210; // Калибровка 100%
 
Сверху Снизу