NodeMCU проблема с чтением EEPROM....

Simple-user
Offline
Зарегистрирован: 12.11.2018

Всем привет.

Пытаюсь записать в память контроллера два значения по нажатию кнопок. Не получается....

#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 D7                  //Виртуальная кнопка колибровки Min значения влажности почвы
#define But_Max D8                 //Виртуальная кнопка колибровки Max значения влажности почвы

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


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

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

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

void sendSensor()
{

  byte data1[2];
  
  ds1.reset();
  ds1.write(0xCC);
  ds1.write(0x44);
  
// Читаем данные с 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); 
    
}

void setup()
{

// Debug console
  Serial.begin(9600); 
    
// Загружаем данные из EEPROM
  setupAddrEEPROM();
  delay(2000);  
 
// Инициализация PIN-ов Arduino
  pinMode(SENS_HUM, INPUT);
  delay(50);
       
// Инициализация датчика OneWire для DS18B20 
  Wire.begin();
  delay(50);
  
}

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

В монитор порта сыпет ошибки....

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Какие ошибки? Секрет?

Simple-user
Offline
Зарегистрирован: 12.11.2018

Нет конечно))

00:53:48.696 -> H)⸮⸮
00:53:48.730 -> ⸮tempPol:27.06
00:53:50.974 ->
00:53:50.974 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
00:53:51.042 ->
00:53:51.042 -> Exception (0):
00:53:51.076 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
00:53:51.144 ->
00:53:51.144 -> >>>stack>>>
00:53:51.178 ->
00:53:51.178 -> ctx: cont
00:53:51.178 -> sp: 3ffffdc0 end: 3fffffc0 offset: 0190
00:53:51.212 -> 3fffff50:  40202f97 3ffe84d4 3ffee494 40201e0c  
00:53:51.280 -> 3fffff60:  3ffee330 3ffe84d4 3ffee494 40201122  
00:53:51.314 -> 3fffff70:  00000000 3ffee6bc 00000032 40202484  
00:53:51.382 -> 3fffff80:  40202f21 00000032 3ffee5b0 3ffee5b0  
00:53:51.450 -> 3fffff90:  3fffdad0 00000000 3ffee45c 402012f3  
00:53:51.484 -> 3fffffa0:  feefeffe feefeffe 3ffee570 402025a0  
00:53:51.552 -> 3fffffb0:  feefeffe feefeffe 3ffe84f4 40100ec1  
00:53:51.586 -> <<<stack<<<
00:53:51.620 ->

b707
Offline
Зарегистрирован: 26.05.2017

задержка 2 секунды (строка 84) - непозволительная роскошь для ЕСП, у него скорее всего ватчдог срабатывает.

Simple-user
Offline
Зарегистрирован: 12.11.2018

b707 пишет:

задержка 2 секунды (строка 84) - непозволительная роскошь для ЕСП, у него скорее всего ватчдог срабатывает.

изменил на 1000, не помогло...

если поменять строчку 62 на 63

62  humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
63  humOut = map(humIn, 480, 210, 0, 100);

то скетч на половину работает, ошибок нет, но данные по нажатию не сохраняет....

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

В esp ещё commit если я правильно помню после записи вызвать надо. Щас попробую пример найти, недавно на форуме было.

Simple-user
Offline
Зарегистрирован: 12.11.2018

andycat пишет:
В esp ещё commit если я правильно помню после записи вызвать надо. Щас попробую пример найти, недавно на форуме было.

По сути либо коммит либо энд, но пробовал с коммитом тоже, ноль толку...

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А почему put а не write используете?

Simple-user
Offline
Зарегистрирован: 12.11.2018

andycat пишет:
А почему put а не write используете?

write записывает всего 1 байт (int8_t), число от от -128 до 127.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Simple-user
Offline
Зарегистрирован: 12.11.2018

Вообще ничего мне не говорит...)

Я в программировании ардуин почти ноль(( делал скетч по образу и подобию....

Simple-user
Offline
Зарегистрирован: 12.11.2018

Опа, что то получилось....
добавил пару строк
EEPROM.put(0, MIN_SENS);
EEPROM.put(4, MAX_SENS);
В void setupAddrEEPROM(){
и заработало, НО не пишет в память по нажатию кнопок в блинке((

 

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

 

Simple-user
Offline
Зарегистрирован: 12.11.2018

Сделал!

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

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Во, а говорили не разбираетесь, оказывается просто необходимо желание :)

Simple-user
Offline
Зарегистрирован: 12.11.2018

Да я вообще не шарю практически, тупо по примерам...вообще случайно похожую строчку нашёл и вставил...так бы сам никогда не догадался.... и то, надо бы чтоб кто-нибудь глянул нормальным глазом, всё ли нормально там по коду...

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вы даёте, конечно. Это как случайно дачу построить, а потом кого-нить из строителей позвать, чтобы глянул.

Simple-user
Offline
Зарегистрирован: 12.11.2018

В отличии от дачи, тут всё кристально прозрачно и видно весь код), не надо рыть шурфы, чтоб посмотреть как устроен фундамент))