Go Down

Topic: guardar float en la EEPROM interna usando union (info) (Read 2365 times) previous topic - next topic

curro92

Hola,
He encontrado en el foro italiano otra forma de convertir float o int a byte y viceversa: lo hace utilizando el tipo de dato union del lenguaje C
Para un float se define una union que contiene dos elementos, un float y un array de 4 bytes. Al contenido de esa union (que son 4 bytes) se puede acceder  como si se tratara de una variable float, o  como si se tratara de un array de 4 bytes. En el ejemplo de abajo se escribe un float en la EEPROM interna, y luego un int. Y se reconstruye el valor de las variables leyendo de la EEPROM.

Code: [Select]

#include <EEPROM.h>

union Float_Byte
{
float datoF;
byte  datoB[4];
} unionFB;

union Integer_Byte
{
int  datoI;
byte datoB[2];
} unionIB;


void setup()
{
  Serial.begin(9600);
}


void loop()
{
  unionFB.datoF = -12.13 ;

  Serial.print("\nFloat 1: ") ;
  Serial.println(unionFB.datoF);
  Serial.print("\nbyte1: ");  Serial.print(unionFB.datoB[0], DEC) ; // 123
  Serial.print("\nbyte2: ");  Serial.print(unionFB.datoB[1], DEC) ; // 20
  Serial.print("\nbyte3: ");  Serial.print(unionFB.datoB[2], DEC) ; // 66
  Serial.print("\nbyte4: ");  Serial.print(unionFB.datoB[3], DEC) ; // 193
 
  // guardar un float en la EEPROM en las posiciones 0-3
  EEPROM.write(0, unionFB.datoB[0]);
  EEPROM.write(1, unionFB.datoB[1]);
  EEPROM.write(2, unionFB.datoB[2]);
  EEPROM.write(3, unionFB.datoB[3]);
   

 
  // reconstuir el float leyendo la EEPROM
  unionFB.datoF = 0.0 ;
  unionFB.datoB[0] =  EEPROM.read(0);
  unionFB.datoB[1] =  EEPROM.read(1);
  unionFB.datoB[2] =  EEPROM.read(2);
  unionFB.datoB[3] =  EEPROM.read(3);

  Serial.print("\n\nFloat 2: ");
  Serial.println(unionFB.datoF);
     
  // guardar un int en las posiciones 4-5  de la EEPROM
  unionIB.datoI = -12 ;

  Serial.print("\nInt 1: ") ;
  Serial.println(unionIB.datoI);
 
  Serial.print("\nbyte1: ");  Serial.print(unionIB.datoB[0], DEC) ; // 244
  Serial.print("\nbyte2: ");  Serial.print(unionIB.datoB[1], DEC) ; // 255
     
  EEPROM.write(4, unionIB.datoB[0]);
  EEPROM.write(5, unionIB.datoB[1]);
 
  // reconstuir el int leyendo la EEPROM
  unionIB.datoI = 0 ;
  unionIB.datoB[0] =  EEPROM.read(4);
  unionIB.datoB[1] =  EEPROM.read(5);

  Serial.print("\n\nInt 2: ");
  Serial.println(unionIB.datoI);
 
  delay(5555); // para no desperdiciar ciclos
}


flico

@curro92 tambien sabes italiano, jejeje

Gracias por el enlace.
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

SrDonGato

La he puesto en el playground también, es una de las dudas que preguntan mucho y así está a mano.

Gracias por la info.


un saludo

Ixreb

#3
Nov 05, 2011, 05:05 pm Last Edit: Nov 05, 2011, 05:07 pm by Ixreb Reason: 1
Siento reflotar este post. Pero es que llevo ya rato intentando saber de donde salen los valores 123, 20, 66, 193 al pasar -12.13 al array de byte. No transforma a ascii ni nada similar, no sé como lo codifica. Seguro que la solución no es compleja aunque ahora no consiga verla, pero me gustaría entenderlo para además ver si también se pueden codificar un string o char array ya que quizá podría ser útil en algún proyecto sea para EEPROM como es el caso o para envío de tramas.

Un saludo

chiva

http://es.wikipedia.org/wiki/IEEE_coma_flotante
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Go Up