Как записать значение float в EEPROM

Я использую эту библиотеку для своего DS3231, на котором установлен Atmel 24C32. у меня есть значение с плавающей запятой, которое увеличивается на 0,5, например:

27,50

28

28,50 ...

код такой:

float lowTemp= 10.5

float highTemp= 10.5

void setup(){
  lowTemp = i2c_eeprom.read(100);
  highTemp = i2c_eeprom.read(101);
}
void loop(){
  if ((menuswtichStatus == HIGH) && (lcdWelcome == HIGH)) {
    previousMillis = millis();
    lcd.clear();
    menuScroll++;
    lcdClear = 1;
    lcdClear2 = 1;
  }
  if (menuScroll == 1) {
    lcd.setCursor(0, 0);
    lcd.print("Temperature set:");
    lcd.setCursor(0, 1);
    lcd.print("Minimum  ");
    lcd.print(lowTemp);
    lcd.print((char)223);
    lcd.print("C ");
    if (plusSwitchstatus == HIGH) {
      lowTemp += 0.5;
    }
    if (minusSwitchstatus == HIGH) {
      lowTemp -= 0.5;
    }
  }
  if (menuScroll == 2) {
    lcd.setCursor(0, 0);
    lcd.print("Temperature set:");
    lcd.setCursor(0, 1);
    lcd.print("Maximum  ");
    lcd.print(highTemp);
    lcd.print((char)223);
    lcd.print("C ");
    if (plusSwitchstatus == HIGH) {
      highTemp += 0.5;
    }
    if (minusSwitchstatus == HIGH) {
      highTemp -= 0.5;
    }
  }
  if (menuScroll == 3) {
    lcd.setCursor(0, 0);
    lcd.print("   Saving the");
    lcd.setCursor(0, 1);
    lcd.print("   Settings...");
    delay(1000);
    i2c_eeprom.write(100, lowTemp);
    i2c_eeprom.write(101, highTemp);
    delay(1000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("    SETTINGS");
    lcd.setCursor(0, 1);
    lcd.print("     SAVED!");
    delay(2000);
    menuScroll = 0;
    lcdClear = 0;
    lcdClear2 = 0;
  }
}

у меня есть библиотека и прочее, это просто пример моего кода...

Значение с плавающей запятой не сохраняется (записывается), какое решение?

, 👍0

Обсуждение

умножить на два перед записью как целое число или байт, @jsotola

@jsotola я не знаю как...!, @ElectronSurf

возможно, вам нужно задавать более простые вопросы о байтах, целых числах, числах с плавающей запятой, строках и т. д., @jsotola


1 ответ


Лучший ответ:

3

У вас есть несколько вариантов:

  1. Согласно замечанию jsotola: проще всего умножить ваше значение на 2, сохранить его, а после прочтения разделить на 2. В одном байте можно хранить значение от 0 до 127,5 (255/2), или если вы используете знак от -64,0 до +63,5. Конечно, вы также можете использовать смещение, если знаете, что значение не может быть меньше, например, -20.
  2. Если вам нужен больший диапазон, вы все равно можете умножить его на 2, но сохранить его в двух байтах. Разделите значение на «высокое значение» (значение % 256) / 256 и «низкое значение» (значение % 256).
  3. Если вы хотите полностью сохранить значение, используйте sizeof(float) для определения длины и цикл for для записи каждого байта, начиная с первого байта числа с плавающей запятой и заканчивая последним.
,