bonsoir,
en train d'essayer d'enregistrer sur une EEPROM I2C différentes variables, y arrives maintenant sans problèmes pour les bytes et les int, mais gros problème pour stocker et récupérer les floats,
bien compris qu'il fallait les découper en 4 octets pour ensuite les traiter séparément à l'enregistrement et opération inverse à la lecture, mais là coince complet, pas doué en C, à la limite de mes compétences sur les conversions de type et surtout vois plus rien, qcq heures que suis dessus....
j'ai donc fait un petit bout de prg qui stocke un ensemble de float en EEPROM au niveau du setup, puis le Loop relis le tout et l'affiche sur un LCD,
mais je me prends dans le nez un msg d'erreur du type "invalid opérands or types 'float' and 'int' to 'binary' operator " à la ligne suivante située dans le setup :
i2c_eeprom_write_byte(AdrBaseEeprom++, (Varfloat >> 24) & 0xFF); // écriture MSB
(bien peur de mélanger un peu le tout et m'y perdre)
si un sachant aux idées claires avais la bonté de jeter un coup d'oeil sur ce soucis, et me remettre sur la piste, serais juste top !
merci par avance
et bien sur le code en question
```
*#include <Wire.h> //I2C library
#include <LiquidCrystal_I2C.h>
#define ad_ROM_1_I2C 0x50
LiquidCrystal_I2C lcd(0x24,20,4);
// variables a sauvegarder dans l'EEPROM
float Varfloat[] = {123.4,234.5,345.6,567.8,678.9};
// routine d'ecriture de byte individuel dans l'EEPROM
// lui passer adresse, donnee
void i2c_eeprom_write_byte(unsigned int eeaddress, byte data )
{
Wire.beginTransmission(ad_ROM_1_I2C);
Wire.write((int)(eeaddress >> 8)); // envoi du MSB de l'adresse
Wire.write((int)(eeaddress & 0xFF)); // envoi du LSB de l'adresse
Wire.write(data); //écriture de l'octet
Wire.endTransmission();
delay(5);// les écritures consécutives trop rapide mettent leur fiabilité en vrac (marche a partir de 3ms)
}
// routine de lecture de byte individuel dans l'EEPROM
// lui passer adresse, elle rend le byte correspondant
byte i2c_eeprom_read_byte(unsigned int eeaddress )
{
byte rdata = 0xFF;
Wire.beginTransmission(ad_ROM_1_I2C);
Wire.write((int)(eeaddress >> 8)); // envoi du MSB de l'adresse
Wire.write((int)(eeaddress & 0xFF)); // envoi du LSB de l'adresse
Wire.endTransmission();
Wire.requestFrom(ad_ROM_1_I2C,1);
if (Wire.available()) rdata = Wire.read(); //lecture de l'octet adressé
return rdata;
}
void setup()
{
Wire.begin(); // Init port I2C
lcd.init(); // initialisation du lcd
lcd.backlight();
Serial.begin(9600);
unsigned int AdrBaseEeprom =0; //adresse de l'EEPROM démarre à 0
for (int i=0; i<(sizeof(Varfloat) / sizeof(float)); i++) // boucle de balayage de la table
{
float temp = Varfloat[i];
i2c_eeprom_write_byte(AdrBaseEeprom++, (Varfloat[i] >> 24) & 0xFF); // écriture MSB ---------ligne a Pb, aussi vrai pour les suivantes...
i2c_eeprom_write_byte(AdrBaseEeprom++, (Varfloat1[i] >> 16) & 0xFF); // écriture MSB-1
i2c_eeprom_write_byte(AdrBaseEeprom++, (Varfloat[i] >> 8) & 0xFF); // écriture MSB-2
i2c_eeprom_write_byte(AdrBaseEeprom++, Varfloat[i] & 0xFF); // écriture LSB
writeFloat(AdrBaseEeprom,AI_C1[i]);
}
}
void loop()
{
//Lecture de l'EEPROM
unsigned int AdrBaseEeprom =0; //adresse de l'EEPROM démarre à 0
for (int i=0; i<(sizeof(Varfloat) / sizeof(float)); i++) // boucle de balayage de la table
{
byte a = i2c_eeprom_read_byte(AdrBaseEeprom++); // chrgt MSB
byte b = i2c_eeprom_read_byte(AdrBaseEeprom++); // chrgt MSB-1
byte c = i2c_eeprom_read_byte(AdrBaseEeprom++); // chrgt MSB-2
byte d = i2c_eeprom_read_byte(AdrBaseEeprom++); // chrgt LSB
unsigned int ret = (unsigned int)((a << 24) | (b << 16) | (c << 8) | (d << 0));
float calcul = (((float)&ret));
// sert a rien, a part verifier de visu que ce qui est écrit correspond aux valeurs qu'on a ecrit
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Valeur lue EEPROM ");
lcd.setCursor(0,1);
lcd.print(calcul); // affiche variable reconstituée
lcd.setCursor(0,2);
lcd.print("Valeur Tblx ");
lcd.setCursor(0,3);
lcd.print(Varfloat[i]);// affiche variable de base
delay(1000);
}
}*
```