• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

SPAX

Member
Хмм...странное дело...заменил строчку
humOut = map(humIn, int16_t(MIN_SENS), int16_t(MAX_SENS), 0, 100);
на
humOut = map(humIn, 480, 210, 0, 100);

и стало работать....как я и говорил, походу не может с еепром вытащить значения...но почему тогда в мониторе порта пишет :
MIN_SENS:0.00
MAX_SENS:0.00
когда я им значения задал в начале скетча?
И на кнопку в приложении блинк не записывает новое значение...

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
 

CodeNameHawk

Moderator
Команда форума
Вы своего не выдумывайте, вопрос был
EEPROM.commit(); только для записи в еепром и он не заменяет EEPROM.end();
Сделайте, то что я советовал
Викиньте весь код блинка и проверьте работает ли запись в еппром.
И покажите код и результат работы. Удачи.
 

SPAX

Member
И покажите код и результат работы. Удачи.
Попробовал....не работает(
Код:
#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>

void setupAddrEEPROM(){

    EEPROM.begin(8);
    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.put(0, MIN_SENS);
    EEPROM.get(0, MIN_SENS);
    EEPROM.end();
    delay(50);
}
if( digitalRead(But_Max) == HIGH  )
{
    EEPROM.begin(8);
    EEPROM.put(4, MAX_SENS);
    EEPROM.get(4, MAX_SENS);
    EEPROM.end();
    delay(50);
}    
   
sendSensor();

}

Вот результат
13:41:07.160 -> ?⸮ԅ9⸮⸮tempPol:27.94
13:41:09.438 ->
13:41:09.438 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
13:41:09.472 ->
13:41:09.472 -> Exception (0):
13:41:09.506 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
13:41:09.574 ->
13:41:09.574 -> >>>stack>>>
13:41:09.608 ->
13:41:09.608 -> ctx: cont
13:41:09.608 -> sp: 3ffffdc0 end: 3fffffc0 offset: 0190
13:41:09.642 -> 3fffff50: 40202fa7 3ffe84d4 3ffee490 40201e1c
13:41:09.710 -> 3fffff60: 3ffee32c 3ffe84d4 3ffee490 4020112f
13:41:09.744 -> 3fffff70: 00000000 3ffee6b8 00000032 40202494
13:41:09.812 -> 3fffff80: 40202f31 00000032 3ffee5ac 3ffee5ac
13:41:09.880 -> 3fffff90: 3fffdad0 3ffe84d0 3ffee458 402012ff
13:41:09.914 -> 3fffffa0: feefeffe 00000000 3ffee56c 402025b0
13:41:09.982 -> 3fffffb0: feefeffe feefeffe 3ffe84f4 40100ec1
13:41:10.016 -> <<<stack<<<
13:41:10.050 ->

Так же попробовал прописать EEPROM.commit(); перед EEPROM.end();.....результат тот же...
 

SPAX

Member

CodeNameHawk

Moderator
Команда форума
а какой должен быть? почему этот не подходит? с датчика приходят числа от 100 до 500... int16_t у нас от -32768 до 32767 2байта...
Должен быть таким же, как тип, который возвращает функция.
Если на пальцах, int16_t занимает два байта, а функция analogRead возвращает int , который в есп равен четырем байтам.

Если есть желание понять, почитайте "приведение типа".
 
Последнее редактирование:

SPAX

Member
Должен быть таким же, как тип, который возвращает функция.
Если на пальцах, int16_t занимает два байта, а функция analogRead возвращает int , который в есп равен четырем байтам.

Если есть желание понять, почитайте "приведение типа".
Я ориентировался на эту шпаргалку:
int8_t | char | от -128 до 127 | 1 byte
uint8_t | byte, unsigned char | от 0 до 255 | 1 byte
int16_t | int | от -32768 до 32767 | 2 byte
uint16_t | unsigned int, word | от 0 до 65535 | 2 byte
int32_t | long | от -2147483648 до 2147483647 | 4 byte
uint32_t | unsigned long | от 0 до 4294967295 | 4 byte

По ней int16_t и int одно и то же....не видел другой инфы, что для ESP это отдельные типы данных....
Какой тогда тип написать??
 

CodeNameHawk

Moderator
Команда форума
По ней int16_t и int одно и то же....не видел другой инфы, что для ESP это отдельные типы данных....
Если вы не видели, это не значит, что для ESP int16_t и int одно и то же.
Можете здесь посмотреть https://github.com/esp8266/Arduino/blob/master/tools/sdk/include/c_types.h
где видно
typedef int int32;

https://esp8266.ru/forum/threads/raznye-dannye-u-esp8266-i-arduino.3738/
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html

Какой тогда тип написать??
Тут ответ очевиден, такой же как в функции.
Пока не разберетесь какой тип какому соответствует используйте стандартный в ардуино int, unsigned int, а она сама подставит нужной длины.
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Попробовал заменить int16_t сначала на int, потом на int32_t, не помогло..
В этом как раз помогло, а в остальном удалите свои излишества, вставьте строки отладки, простой вывод текстовой информации в сериал и отследите в каком месте затык.
Для начала научитесь записать и прочитать из еепром, без всяких кнопок и датчиков, разделяй и властвуй.
 

SPAX

Member
В этом как раз помогло, а в остальном удалите свои излишества, вставьте строки отладки, простой вывод текстовой информации в сериал и отследите в каком месте затык.
Для начала научитесь записать и прочитать из еепром, без всяких кнопок и датчиков, разделяй и властвуй.
Да я бы знал, как это ещё сделать....
Я эти то строчки взял из рабочего кода от простой ардуинки...а на есп не заводится нифига что-то....
 

CodeNameHawk

Moderator
Команда форума
Тут нет ничего удивительного, я дал вам рабочий пример записи и чтения еепром, а вы даже не смогли его нормально скопировать.
 

CodeNameHawk

Moderator
Команда форума
Тогда можете попробовать метод грубой силы, берете пустой скетч, и добавляете в Setup только две строки
Код:
Serial.begin(115200);
Serial.println("Hello word");
Скачиваете и запускаете программу терминал HTERM, настраиваете СОМ порт и его скорость.
Когда в ней увидите Hello word напишите, скажу как быть дальше.
 

SPAX

Member
Тогда можете попробовать метод грубой силы, берете пустой скетч, и добавляете в Setup только две строки
Код:
Serial.begin(115200);
Serial.println("Hello word");
Скачиваете и запускаете программу терминал HTERM, настраиваете СОМ порт и его скорость.
Когда в ней увидите Hello word напишите, скажу как быть дальше.
Сделал, только там помимо много мусора ещё сыпет....

Код:
;d<\0>lњЯ<<\0>Д$а<<3><4><\f><4>„<\f>$д<\f>b|Ћ‚<3>д<27>›sЫcЊ<4>#Њы'gџdgnЬгд<4>#<28>8ДЗ${l;dpуoа<16><3><4><4>‚<4>d<\f>ДЬ<\f><4><4>c<4>gг|<3>мДЋЗЏ#Њы'gз<\0>dЊЏd`<3>Ш<27><27>go<4>l`<2><15><2>nrЋ’Ы'<\f><4>“ЫЫ <3><7>{“Ыn<4><\f>›“’`<3>њ;$дт$<4>њ|<4>“`<3>ьѓgњ<3>Hello word<\r><\n>
 

CodeNameHawk

Moderator
Команда форума
Сделал, только там помимо много мусора ещё сыпет....
Так и должно быть, это лог загрузки есп на скорости 74800.
Дальше все проще добавляете нужную строку, если надо добавляете вывод используемых переменных и смотрите работает ли.
 

SPAX

Member
Так и должно быть, это лог загрузки есп на скорости 74800.
Дальше все проще добавляете нужную строку, если надо добавляете вывод используемых переменных и смотрите работает ли.
так а зачем доп прога была нужна? Если через ардуино иде монитор порта тоже есть?
 
Сверху Снизу