(résolu) Stocker un float dans l'EEPROM

Bonjour,

J’aurais besoin de stocker un float dans l’EEPROM interne, mais je ne vois pas comment faire. La fonction EEPROM.write ne permet que de stocker du byte, et un float est sur 4 bytes.

Il faudrait donc que “j’explose” mon float pour récupérer chacun de ses 4 octets pour pouvoir ensuite les stocker individuellement, et ensuite pouvoir reconstruire le float suite à un EEPROM.read

Mais là, je sèche… Un champion du monde du code pourrait-il me filer un 'tit coup de main, SVP ?

Salut, j'ai rencontré le même problème qui est résolu aujourd'hui ...

http://arduino.cc/forum/index.php/topic,147297.0.html

Bon test.

Merci à toi, moi j'ai trouvé ça :

http://thijs.elenbaas.net/2012/07/extended-eeprom-library-for-arduino/

La fonction EEPROM.write ne permet que de stocker du byte

La curiosité n’est jamais un défaut dans le domaine technique, elle réserve souvent des surprises très agréables.
La première forme de curiosité est de lire le code de la fonction EEprom.write d’origine arduino (librairie EEprom de l’ide) :

void EEPROMClass::write(int address, uint8_t value)
{
	eeprom_write_byte((unsigned char *) address, value);
}

Deuxièmme expression de la curiosité on voit que le fichier cpp fait l’inclusion suivante :
#include <avr/eeprom.h>
On continue en faisant une recherche google sur avr/eeprom.h et on arrive ici :
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

Et là on s’apperçoit qu’Arduino a :

  • encapsulé une fonction avr sans rien y modifier. Opération inutile a part éviter aux utilisateurs d’utiliser un pointeur,
  • limité les choix possibles au seul octet mais qu’il existe bien d’autres possibilités d’écriture dont celle du float qui n’attend que tu t’en serves.
uint8_t 	eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__
uint16_t 	eeprom_read_word (const uint16_t *__p) __ATTR_PURE__
uint32_t 	eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__
float   	eeprom_read_float (const float *__p) __ATTR_PURE__
void 	        eeprom_read_block (void *__dst, const void *__src, size_t __n)
void 	        eeprom_write_byte (uint8_t *__p, uint8_t __value)
void 	        eeprom_write_word (uint16_t *__p, uint16_t __value)
void 	        eeprom_write_dword (uint32_t *__p, uint32_t __value)
void 	        eeprom_write_float (float *__p, float __value)
void 	        eeprom_write_block (const void *__src, void *__dst, size_t __n)
void 	        eeprom_update_byte (uint8_t *__p, uint8_t __value)
void 	        eeprom_update_word (uint16_t *__p, uint16_t __value)
void 	        eeprom_update_dword (uint32_t *__p, uint32_t __value)
void 	        eeprom_update_float (float *__p, float __value)
void 	        eeprom_update_block (const void *__src, void *__dst, size_t __n)

Et cerise sur le gateau toutes les fonctions sont documentées.

Merci beaucoup !!! C'est vrai que je n'ai pas cherché plus loin après avoir lu la référence de EEPROM.h Je ne suis pas assez curieux, donc...