EEPROM.put не сохраняет значение больше байта на ESP8266

Arduino IDE 1.8.19. Версия аддона ESP8266 - 3.1.2
При использовании eeprom.update - не компилируется. В свежем “Ищу исполнителя” выложен “гарантированно рабочий скетч”(с) https://forum.arduino.ru/t/dorabotat-sketch-s-esp32-na-arduino-nano/15800/9?u=толстый где eeprom.commit стоит после каждого сохранения и каждого считывания(так и надо?) Попробовал - так же сохраняется только размерность байт. Может это работает только для ESP32?
Вопрос: кривые руки или кривая библиотека? И как заставить сохраняться 16_t и 32_t ?

#include <EEPROM.h>

#define Button  13

bool flag = false;
uint8_t regim = 1;
uint16_t TempY = 290;
uint32_t interval_ON = 3000;
uint32_t interval_OFF = 1000;
uint32_t tempMillis;


void button() {

  if (digitalRead(Button) == LOW && flag == false) {
    regim++;
    flag = true;
    if (regim > 4)regim = 1;
    delay(150);

    EEPROM.put(0, regim);
    EEPROM.put(5, TempY);
    EEPROM.put(10, interval_ON);
    EEPROM.put(15, interval_OFF);
    EEPROM.commit();
  }

  if (digitalRead(Button) == HIGH && flag == true) {
    flag = false;
    delay(150);
  }
}

void setup() {

  Serial.begin(9600);
  EEPROM.begin(20);
  EEPROM.get(0, regim);
  EEPROM.get(5, TempY);
  EEPROM.get(10, interval_ON);
  EEPROM.get(15, interval_OFF);
  pinMode(Button, INPUT_PULLUP);
}

void loop() {

  //delay(100);
  button();

  if (millis() - tempMillis >= 5000) {
    tempMillis = millis();
    Serial.println(regim);
    Serial.println(TempY);
    Serial.println(interval_ON);
    Serial.println(interval_OFF);
    Serial.println(" ");
  }
}




Результат

3
65535
4294967295
4294967295
 
4
65535
4294967295
4294967295
 
1
65535
4294967295
4294967295

судя по этим данным, оно у вас даже байт не сохраняет

открывайте исходники библиотеки и ищите ошибку

Сохраняет. После нажатия на кнопку значение увеличивается( по кругу), а после выкл/вкл питания читает уже новое(последнее) значение.
На .СС попадалась тема, где значение сохранялось только по нулевому адресу. У меня сохраняется на любом, но только 8_t.

Это в исходниках EEPROM.h

    template< typename T > const T &put( int idx, const T &t ){
        EEPtr e = idx;
        const uint8_t *ptr = (const uint8_t*) &t; 
        for( int count = sizeof(T) ; count ; --count, ++e )  (*e).update( *ptr++ );
        return t;
    }

3я строка - это type cast значения к типу byte, не? Т.е. чтобы не передали, приводится к 8-битному целому без знака, потом сохраняется. Или не так?

В сетапе сделайте . put сначала))

2 лайка

Но как, Холмс?! И как теперь заставить работать в основном цикле?

#include <EEPROM.h>

#define Button  13

bool flag = false;
uint8_t regim = 1;
uint16_t TempY = 290;
uint32_t interval_ON = 3000;
uint32_t interval_OFF = 1000;
uint32_t tempMillis;


void button() {

 if (digitalRead(Button) == LOW && flag == false) {
   regim++;
   flag = true;
   if (regim > 4)regim = 1;
   delay(150);

   EEPROM.put(0, regim);
   /*
     EEPROM.put(5, TempY);
     EEPROM.put(10, interval_ON);
     EEPROM.put(15, interval_OFF);
     EEPROM.commit();
   */
 }

 if (digitalRead(Button) == HIGH && flag == true) {
   flag = false;
   delay(150);
 }
}

void setup() {

 Serial.begin(9600);
 EEPROM.begin(20);

 EEPROM.put(5, TempY);
 EEPROM.put(10, interval_ON);
 EEPROM.put(15, interval_OFF);
 EEPROM.commit();

 EEPROM.get(0, regim);
 EEPROM.get(5, TempY);
 EEPROM.get(10, interval_ON);
 EEPROM.get(15, interval_OFF);
 pinMode(Button, INPUT_PULLUP);
}

void loop() {

 //delay(100);
 button();

 if (millis() - tempMillis >= 5000) {
   tempMillis = millis();
   Serial.println(regim);
   Serial.println(TempY);
   Serial.println(interval_ON);
   Serial.println(interval_OFF);
   Serial.println(" ");
 }
}

Результат

3
290
3000
1000
 

не, не так
Не к 8-битному целому, а к указателю на него.
И потом последовательно сохраняются все байты многобайтного типа.
На вид все ОК.
Надо еще глянуть код update и код чтения

2 лайка

Семен - Семеныч :))))

Update не компилируется.

C:\arduino-1.8.19\portable\sketchbook\TEST_EEPROM\TEST_EEPROM.ino: In function 'void button()':
TEST_EEPROM:21:12: error: 'class EEPROMClass' has no member named 'update'
   21 |     EEPROM.update(0, regim);
      |            ^~~~~~
Используем библиотеку EEPROM версии 1.0 из папки: C:\arduino-1.8.19\portable\packages\esp8266\hardware\esp8266\3.1.2\libraries\EEPROM 
exit status 1
'class EEPROMClass' has no member named 'update'

да не тот update
у вас в 4-й строке кода put() есть update, гляньте

да так же.
Епром тут совсем не при чем, судя по всему он работает и никаких проблем с ним нет.
Проблема в вашем коде.
Вы сами затирали свои переменные значениями 0xFF в первом коде

1 лайк

Не понял. Какая четвёртая строчка?

Скетч

#include <EEPROM.h>

#define Button  13

bool flag = false;
uint8_t regim = 1;
uint16_t TempY = 290;
uint32_t interval_ON = 3000;
uint32_t interval_OFF = 1000;
uint32_t tempMillis;


void button() {

  if (digitalRead(Button) == LOW && flag == false) {
    regim++;
    flag = true;
    if (regim > 4)regim = 1;
    delay(150);

    EEPROM.update(0, regim);
    /*
      EEPROM.put(5, TempY);
      EEPROM.put(10, interval_ON);
      EEPROM.put(15, interval_OFF);
      EEPROM.commit();
    */
  }

  if (digitalRead(Button) == HIGH && flag == true) {
    flag = false;
    delay(150);
  }
}

void setup() {

  Serial.begin(9600);
  EEPROM.begin(20);

  EEPROM.put(5, TempY);
  EEPROM.put(10, interval_ON);
  EEPROM.put(15, interval_OFF);
  EEPROM.commit();

  EEPROM.get(0, regim);
  EEPROM.get(5, TempY);
  EEPROM.get(10, interval_ON);
  EEPROM.get(15, interval_OFF);
  pinMode(Button, INPUT_PULLUP);
}

void loop() {

  //delay(100);
  button();

  if (millis() - tempMillis >= 5000) {
    tempMillis = millis();
    Serial.println(regim);
    Serial.println(TempY);
    Serial.println(interval_ON);
    Serial.println(interval_OFF);
    Serial.println(" ");
  }
}

Результат

C:\arduino-1.8.19\portable\sketchbook\TEST_EEPROM\TEST_EEPROM.ino: In function 'void button()':
TEST_EEPROM:21:12: error: 'class EEPROMClass' has no member named 'update'
   21 |     EEPROM.update(0, regim);
      |            ^~~~~~
Используем библиотеку EEPROM версии 1.0 из папки: C:\arduino-1.8.19\portable\packages\esp8266\hardware\esp8266\3.1.2\libraries\EEPROM 
exit status 1
'class EEPROMClass' has no member named 'update'

А зачем в button() .put убрали?

Где? Номер строки, пожалуйста. И почему тогда байт шьётся нормальное значение а не 0xFF?

Тест для MMM.

потому что только байт вы инициализируете в сетапе

Давайте, поработайте мозгами. Код в #6 работает, а в заглавном посте - нет. Сравните их и догадайтесь, в чем причина

Чёй-та?

void setup() {

  Serial.begin(9600);
  EEPROM.begin(20);
  EEPROM.get(0, regim);
  EEPROM.get(5, TempY);
  EEPROM.get(10, interval_ON);
  EEPROM.get(15, interval_OFF);
  pinMode(Button, INPUT_PULLUP);
}

вот именно
И что, по вашему, вы читаете в этих строчках из неинициализированного ЕЕПРОМ?

EEPROM.get(0, regim);
  EEPROM.get(5, TempY);
  EEPROM.get(10, interval_ON);
  EEPROM.get(15, interval_OFF);
  • те самые 0xFF, которые потом и видите

А как же нулевая ячейка, которая читается нормально?

она читается так же. Но вы ее потом перезаписываете реальным значением режима. А все остальные данные пишете те, что прочитали из ЕЕПРОМа

Ну поняли?