Запись char в энергонезависимую память

//
  float f(1.0);
  byte b[4];
  
void setup() {
  Serial.begin(115200);
  Serial.println(f);
  f_to_b();
  Serial.println(*(float *)&b);
}

void loop() {
}

void f_to_b() {
  for (byte i=0; i<4; i++) {
    b[i]=*((byte *)&f + i);
    Serial.println(b[i], HEX);
  }
}

1 лайк
#include <AT24Cxx.h>
#define i2c_address 0x50
AT24Cxx eep(i2c_address, 01);

void setup() {
  float val_1 = -16.17;
  float val_2 = 0;

  EEPROM_float_write(0, val_1);
  val_2 = EEPROM_float_read(0);

  // выводим в сериал
  Serial.begin(9600);
  Serial.println(val_2);
}

void loop() {}


void EEPROM_float_write(int addr, float val)  // запись в ЕЕПРОМ
{
  byte b[4];
  for (byte i = 0; i < 4; i++) {
    b[i] = *((byte *)&val + i);
    eep.write(i + addr, b[i]);
    Serial.println(b[i], HEX);
  }
  //byte *x = (byte *)&val;
  //for(byte i = 0; i < 4; i++) eep.write(i+addr, x[i]);
}

float EEPROM_float_read(int addr)  // чтение из ЕЕПРОМ
{
  byte x[4];
  for (byte i = 0; i < 4; i++) x[i] = eep.read(i + addr);
  float *y = (float *)&x;
  return y[0];
}

все так же, либо я не понял, что с этим делать(

Преобразование в 36 и 37 измените на то как у меня…
return *(float *)&x;

У меня нет микросхемы под рукой и я просто формирую массив из float и потом этот же массив вывожу как float …

Добавьте ещё вывод СЧИТАННЫХ байтов - может у вас читается не то что пишется !!!

все же я не понимаю, как именно надо изменить код.
Если не затруднит, не можете отредактировать этот?

#include <AT24Cxx.h>
#define i2c_address 0x50
AT24Cxx eep(i2c_address, 01);

void setup() {
  float val_1 = -12.34;
  float val_2 = 0;

  EEPROM_float_write(0, val_1);
  val_2 = EEPROM_float_read(0);

  // выводим в сериал
  Serial.begin(9600);
  Serial.println(val_2);
}

void loop() {}


void EEPROM_float_write(int addr, float val)  // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  for (byte i = 0; i < 4; i++) eep.write(i + addr, x[i]);
}

float EEPROM_float_read(int addr)  // чтение из ЕЕПРОМ
{
  byte x[4];
  for (byte i = 0; i < 4; i++) x[i] = eep.read(i + addr);
  float *y = (float *)&x;
  return y[0];
}

Что тут не понятно ? Две строки заменить одной …

а нет, тогда понял, просто способ не сработал, поэтому решил, что что-то делаю не так. И вы правы, он читает из памяти что-то не то.

#include <AT24Cxx.h>
#define i2c_address 0x50
AT24Cxx eep(i2c_address, 01);

void setup() {
  Serial.begin(9600);
  float val_1 = -12.34;
  float val_2 = 0;

  EEPROM_float_write(0, val_1);
  Serial.println();
  val_2 = EEPROM_float_read(0);

  // выводим в сериал
Serial.println(" ");
  Serial.println(val_2);
}

void loop() {}


void EEPROM_float_write(int addr, float val)  // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  for (byte i = 0; i < 4; i++) {
    Serial.print(" ");
    Serial.print(x[i], HEX);
    eep.write(i + addr, x[i]);
  }
}

float EEPROM_float_read(int addr)  // чтение из ЕЕПРОМ
{
  byte x[4];
  for (byte i = 0; i < 4; i++) {
    Serial.print(" ");
    Serial.print(x[i], HEX);
    x[i] = eep.read(i + addr);
  }
  // float *y = (float *)&x;
  //return y[0];
  return *(float *)&x;
}
 A4 70 45 C1
 56 52 2 6D 
-24.22

Читайте устав - Командир всегда прав !!! :grinning:

2 лайка

Такое ощущение, что код даже не читает данные из модуля памяти. Пишу случайный адрес, а он все равно выводит те же данные, что и с правильным адресом.

Полное стирание чипа есть в библиотеке ?

Попробовал. После стирания чип все равно забит мусором. Заменил микросхему и все работает как часы. Всем огромное спасибо за помощь. Работающий код:

#include <AT24Cxx.h>
#define i2c_address 0x50
AT24Cxx eep(i2c_address, 01);

void setup() {
  Serial.begin(9600);
  float val_1 = -14235.35;
  float val_2 = 0;

  EEPROM_float_write(0, val_1);
  Serial.println();
  val_2 = EEPROM_float_read(0);

  // выводим в сериал
  Serial.println(" ");
  Serial.println(val_2);
}

void loop() {}


void EEPROM_float_write(int addr, float val)  // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  for (byte i = 0; i < 4; i++) {
    Serial.print(" ");
    Serial.print(x[i], DEC);
    eep.write(i + addr, x[i]);
  }
}

float EEPROM_float_read(int addr)  // чтение из ЕЕПРОМ
{
  byte x[4];
  for (byte i = 0; i < 4; i++) {
    Serial.print(" ");
    x[i] = eep.read(i + addr);
    Serial.print(x[i], DEC);
  }
  // float *y = (float *)&x;
  //return y[0];
  return *(float *)&x;
}

“Дело было не в бобине …”

2 лайка

ТС, если ты вдруг надумаешь хранить в этой ЕЕПРОМ не float, a long/int32_t/uint32_t/DWORD или прочее 32битное , не нужно долбить форум, код будет тот же, только return’ить нужно тот формат который тебе нужен.

Для 16бит нужно урезать осетра(в цикле for) до двух байт

2 лайка

Или сделать по уму, как тут уже советовали и забыть про все обрезания.

Так он с указателями разобраться не в состоянии , а вы его носом в шаблоны макнуть хотите…

Так то реализация через шаблоны прикольная…
Вот они оказывается н̶а̶х̶у̶а̶ зачем нужны :slight_smile:

а здесь почитать про флоат для ардуины

1 лайк

100% не он. Он читатель, а не писатель
Да и не запрещал он никогда это, не использовал - да, но не запрещал.

О себе в третьем лице?
Много аккаунтов… Попахивает шизофренией, так то…

:laughing:
Не переживай, скоро приступ пройдёт и я опять буду нормальный… Наверное… Как все)))
Кстати, вчера ветку про сдвиговые регистры и светодиоды читал, вы можете думать, что это тоже я :grinning:
ЗЫЖ А аккаунтов у меня, я же говорил, штук пять за 15 лет. :wink:
ЗЫЖЖ Всё, я тут больше ничего отвечать не буду, не моя тема)

ок, спс, но думаю на этом все