• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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%
 
Сверху Снизу