Как записать значение 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;
}
}
у меня есть библиотека и прочее, это просто пример моего кода...
Значение с плавающей запятой не сохраняется (записывается), какое решение?
@ElectronSurf, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 3
У вас есть несколько вариантов:
- Согласно замечанию jsotola: проще всего умножить ваше значение на 2, сохранить его, а после прочтения разделить на 2. В одном байте можно хранить значение от 0 до 127,5 (255/2), или если вы используете знак от -64,0 до +63,5. Конечно, вы также можете использовать смещение, если знаете, что значение не может быть меньше, например, -20.
- Если вам нужен больший диапазон, вы все равно можете умножить его на 2, но сохранить его в двух байтах. Разделите значение на «высокое значение» (значение % 256) / 256 и «низкое значение» (значение % 256).
- Если вы хотите полностью сохранить значение, используйте sizeof(float) для определения длины и цикл for для записи каждого байта, начиная с первого байта числа с плавающей запятой и заканчивая последним.
,
@Michel Keijzers
Смотрите также:
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- Отправка и получение различных типов данных через I2C в Arduino
- Какой реальный срок службы EEPROM?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Как перевести float в четыре байта?
умножить на два перед записью как целое число или байт, @jsotola
@jsotola я не знаю как...!, @ElectronSurf
возможно, вам нужно задавать более простые вопросы о байтах, целых числах, числах с плавающей запятой, строках и т. д., @jsotola