Pages: [1]   Go Down
Author Topic: guardar float en la EEPROM interna usando union (info)  (Read 2119 times)
0 Members and 1 Guest are viewing this topic.
Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 721
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
}

Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@curro92 tambien sabes italiano, jejeje

Gracias por el enlace.
Logged

Trabajando en ...

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

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

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: November 05, 2011, 11:07:13 am by Ixreb » Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://es.wikipedia.org/wiki/IEEE_coma_flotante
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Pages: [1]   Go Up
Jump to: