• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
Дальше все проще добавляете нужную строку, если надо добавляете вывод используемых переменных и смотрите работает ли.
так а зачем доп прога была нужна? Если через ардуино иде монитор порта тоже есть?
 
Сверху Снизу