Problema con float y memoria EEPROM

Hola, quería saber si alguien me puede explicar como puedo separar en bytes un float (creado a partir de la lectura de un sensor de temperatura), para poder guardar en la memoria EEPROM el byte más significativo y el menos significativo, y luego leer la memoria y unir los bytes para formar nuevamente el float.
Estuve intentado utilizando los comando highByte() y lowByte(), pero no tuve éxito.

Hola ManuRodr,

En arduíno no te sabría decir exactamente cómo funciona, pero entiendo que será similar. yo esto lo he trabajado así con los PIC que se programan en C también, de hecho Microchip creo ha comprado ATMEL así que no creo que difiera mucho.

Lo que quieres hacer con highByte y lowByte te serviría para los int que son 16 bits, los float son 32 bits (4 bytes). Suelen ir codificados en lo que se llama BIG ENDIAN, googlealo y míratelo bien. A mi parecer es bastante engorroso trabajar con esa codificación, a mi personalmente no me gusta, así que cuando tengo que jugar con floats mi manera de trabajar es la siguiente, separo en dos enteros la parte entera y la parte decimal y ahí aplico el highByte y lowByte, de tal modo que tengo entero_H, entero_L, decimal_H y decimal_L, en 4 bytes y bajo una codificación para mí más amigable el float para hacer con él lo que me da la gana.

Espero te sirva de ayuda.

Un saludo!

crea una union entre float y bytes (los 4 que ocupa)

union {
byte asBytes[4];
float asFloat;
} fb;

entonces cargas tu float asi

fb.asFloat = 2.33;

o asi
fb.asBytes[0] = 0x00; y los que faltan o al revés leyendolo.
Espero se entienda.

Gracias surbyte....utilizar una union me funcionó para obtener los bytes, pero sigo teniendo un problema.

Una vez obtenidos los bytes los almaceno en la memoria eeprom uno por uno. Luego con otro programa debo leer la eeprom, debo unir los bytes y formar nuevamente el float.

Si todas las operaciones las tienes que hacer byte por byte, asumo que es porque la librería carece de las funciones put y get.

En el otro hilo había propuesto que también es posible descomponer y reconstruir un valor float mediante la obtención del puntero de la variable:

float f = 3.14;
byte* asBytes = (byte*)&f;
// A partir de aquí, asBytes convierte una variable float en un array de 4 bytes

for (byte i = 0; i < sizeof(float); i++)
  EEPROM.update(i, asBytes[i]);

Para reconstruir el valor, sería de manera similar:

float f = 3.14;
byte* asBytes = (byte*)&f;

for (byte i = 0; i < sizeof(float); i++)
  asBytes[i] = EEPROM.read(i);

// A partir de aquí ya has recuperado el valor original de f

Danicap:
Suelen ir codificados en lo que se llama BIG ENDIAN

Será en otras arquitecturas; en AVR todo está codificado con little-endian. El byte menos significativo (LSB) siempre va primero.
La codificación de float es totalmente otra historia, ahí no sé decir si es uno o es el otro.

Luego tenemos la límitante de que no podemos almacenar valores enteros mayores a 255.

Creo que la solución es usar los comentarios de los compañeros y recurrir a la matemática básica de los decimales: descomponer el número y obtener cada dígito significativo a intervalos de 0-9, luego con la posición decimal, puedes recurrir a reconstruirlos empleando múltiplos de 10.

Ademas debes considerar crear vectores individuales para cada valor almacenado, esto es asignar una cadena de posiciones de memoria con una determinada posición decimal. Por ejemplo, el vector:

10 11 12 13 14 15 16 17 18 19

Puede almacenar un número de 9 dígitos XXXXXXXXX, con X = 0-9. Tú decides en donde estará ubicado el punto decimal.

La reconstrucción es solo una rutina de lectura de la EEPROM y aplicar la matemática relativa a los decimales.

Análisis del número decimal = dividir con 10
Reconstrucción del número decimal = múltiplos de 10

Luego con otro programa debo leer la eeprom, debo unir los bytes y formar nuevamente el float.

Reconstruyes los bytes leyendolos 1 a 1 y cuando completas los 4 bytes ya tienes el float.
La representación de 1.234 es

fb.asBytes[0] =0xB6
fb.asBytes[1] =0xF3
fb.asBytes[2] =0x9D
fb.asBytes[3] =0x3F

entonces si almacenaras en la EEPROM B6, F3, 9D, 3F usando fb.asBytes y luego solo lo recuperas del mismo modo usando lo mismo de modo que una vez mas fb.asBytes[0..1..2..3] contendras los valores anteriores entonces si consultas el valor de fb.asFloat simplemente verías 1.234
Muy muy fácil.