Добрый, заполнения eeprom кучей float. Но как бы мне 4 байта для хранения например 100.1 или 34.6 или -0.2 десятых один знак не очень подходит. Что можна придумать?
Храни целое, дели на 10 когда надо.
Пока что три байта, менее никак?
if (val>=0) EEPROM.update(addr, 0); else EEPROM.update(addr, 1);
EEPROM.update(addr+1, int(abs(val)));
EEPROM.update(addr+2, int(abs(val)*10)%10);
Что ты за бред написал?
float f = 134.6;
int16_t i;
setup () {
i = (int)(f * 10); // i занимает 2 байта её и сохраняй в EEPROM
Serial.print (“i = “);
Serial.println (i);
f = (float)(i / 10.0); // когда считаешь из EEPROM преобразуешь обратно во float (если надо)
Serial.print(“f = “)
Serial.println(f);
}
loop () {}
И пользуйся методами EEPROM put() и get().
Разве put и get для отрицательного числа не займет 4 байта?
С какого перепугу?
Если отдаешь put переменную типа int16_t, которая занимает 2 байта, то эти два байта он и запишет.
Хм. А разве отрицательное число чем-то отличается от положительного?
Вообще-то отличается. Но в данном случае это не имеет ни какого значения.
#include <EEPROM.h>
float f = -134.6;
int16_t i, k;
setup () {
Serial.begin(9600);
i = (int16_t)(f * 10); // i занимает 2 байта её и сохраняй в EEPROM
EEPROM.put(3, i);
Serial.print (“i = “);
Serial.println (i);
EEPROM.get(3, k);
f = (float)(k / 10.0); // когда считаешь из EEPROM преобразуешь обратно во float (если надо)
Serial.print(“f = “)
Serial.println(f, 1);
}
loop () {}
Я не об этом.
Я хотел уточнить чем отличается отрицательное число от положительного с ТОЧКИ ЗРЕНИЯ ТОПИКСТАРТЕРА?
В случае записи int, а не unsigned int не имеет никакого значения
Ну ты проверил? 2 байта или 4 получилось в примере из #9?
Я так понимаю что числа могут иметь 1 десятичный знак после запятой. Но о максимальном и минимальном значении ты ничего не сказал.
Так что нужно определиться с диапазоном сохраняемых значений.
Если он не выходит за рамки -3276,8…3276,7
то тебе для его хранения вполне достаточно 2-х байтного int
Да, понятно, не выходит за диапазон. От -10.0 до +120.0 градусов)
Ответ будет на мой вопрос?
Почему то дробные не сохраняются (пример с темплейтами put-get для stm32duino eeprom где нету get|put)
float EEPROM_float_read(int addr) { // 2 байта, отрицательное, один знак после запятой (-3276,8…3276,7)
int16_t i;
eeGet(addr, i);
return (float)(i/10);
}
void EEPROM_float_write(int addr, float val) { // 2 байта, отрицательное, один знак после запятой (-3276,8…3276,7)
int16_t i = val * 10;
eePut(addr, i);
}
template void eeGet(int ee,T& value){
byte* p=(byte*)(void*)&value;
unsigned int i;
for(i=0;i<sizeof(value);i++) *p++=EEPROM.read(ee++);
}
template void eePut(int ee,T& value) {
const byte* p=(const byte*)(const void*)&value;
unsigned int i;
for(i=0;i<sizeof(value);i++) EEPROM.update(ee++,*p++);
}
return ((float)i/10);
-
НАУЧИСЬ вставлять код по правилам форума.
-
У меня всё отлично работает, хз что у тебя там за проблемы:
-
Развлекайтесь мальчики, мне надоело очевидные вещи во всех мануалах описанные повторять.
return ((float)i/10.0);
Заработало когда делать на 10.0, забыл этот прикол. Спасибо за помощь, два байта занимает)))