• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Jak zapisać w EEPROM float nie działa mi put, get
#1
Mam coś takiego:
void saveconfig(){
  EEPROM.update(0,Temp1);
  EEPROM.update(1,czasy[0].godz);
  EEPROM.update(2,czasy[0].minuta);
........
 }

void loadconfig(){
  Temp1 = EEPROM.read(0);
  czasy[0].godz = EEPROM.read(1);
  czasy[0].minuta = EEPROM.read(2);
...........
}

Temp1 mam jako int i działa ale zapisuje się np. 24 a nie 24.1
jak zmienię na float i jak chce zapisać jako get albo put to wychodzą mi głupoty albo
nie działa. A mam #include <EEPROM.h> i niby powinno być EEPROM.get i put.
Co mam nie tak?
A jeszcze mam pytanie na płytce z DS3231 mam też pamięć EEPROM może ktoś podpowie jak tam zapisywać a nie w arduino?
 
Odpowiedź
#2
Witam,
To zapisz sobie część całkowitą temperatury jako jednego int-a, a część ułamkową jako drugiego. Z liczy z przecinkiem robisz dwie liczy całkowite.
Pozdrawiam,
Tomek.
 
Odpowiedź
#3
A jak to zrobić i potem jak to scalić do liczby z przecinkiem?
A może się domyślasz dlaczego nie działa put get?
 
Odpowiedź
#4
Witam,


Kod:
float liczba = 10.56;
byte calkowite;
byte ulamkowe;
float liczba1;
void setup()
{
// rozbicie
    calkowite = (byte) liczba;
    unsigned int pomocnicza = (unsigned int) (liczba * 100);
    ulamkowe = pomocnicza % 100;
// scalenie
    liczba1 = calkowite + 0.01 * ulamkowe;
}

void loop()
{

}

Pozdrawiam,
Tomek.
 
Odpowiedź
#5
Wielkie dzięki! A co jest z tymi get, put? Może wiesz dlaczego mi nie działa?
 
Odpowiedź
#6
Zgodnie z tym https://www.arduino.cc/en/Reference/EEPROMUpdate  update() służy tylko do zapisu byte (0-255), działa z int? Ciekawe. Większość funkcji działa ze zmiennymi byte, inne trzeba sobie rozbić na byte i zapisywać osobno. Zmienne typu byte, int, float mają różną ilość bajtów, dla każdej trzeba wyliczyć adres gdzie zapisać ich poszczególne bajty. Dział ci różnie, może nadpisujesz bajty zmiennych? Rozwinięciem jest funkcja put. Kłopotem może być znalezienie odpowiedniego adresu, gdzie zapisać dane. Dlatego w przykładzie z eeprom i put jest stworzenie typu struktury. Działa to tak, że robisz całą paczkę danych konfiguracyjnych zlepioną ze zmiennych różnych typów w jeden nowy typ zdefiniowany przez Ciebie.  Zapisujesz i odczytujesz całą taką zmienną. Jeśli to zapis konfigu to wystarczy zapis od znanego adresu i wrzucasz całość, tak samo odczyt. Generalnie nie ma co się bać EEpromu, producent gwarantuje 100000 zapisów, ale testy pokazują, że "zwyczajowo" działa dłużej, a rozsądne używanie starcza na wieki.
Przykład ze strukturami:
Kod:
#include <EEPROM.h>
int minuta;
byte godzina;
byte flagazapisu;
float temperatura;
int address;

struct save {
 byte godz;
 int minuta;
 float temp;
};
save zmiennakonfiguracyjnatypusave ={ 22,55,22.22};


void setup() {
save  dane2={0,0,0}; //nowa zmienna typu save
 Serial.begin(115200);
 while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB port only
 }

godzina=zmiennakonfiguracyjnatypusave.godz;
minuta=zmiennakonfiguracyjnatypusave.minuta; //to sa rozne zmienne
temperatura=zmiennakonfiguracyjnatypusave.temp;

Serial.println("co my tu mamy po uruchomieniu, zmienne domyslne z flash");
Serial.print("Godzina: ");
Serial.println(godzina);
Serial.print("minuta: ");
Serial.println(minuta);
Serial.print("Temperatura: ");
Serial.println(temperatura);

Serial.println("Zmienne domyslne z EEPROM");
flagazapisu=EEPROM.read(address);

if (flagazapisu==55)
{
address++;

EEPROM.get(address, dane2);
godzina=dane2.godz;
minuta=dane2.minuta; //to sa rozne zmienne
temperatura=dane2.temp;
Serial.print("GodzinaE: ");
Serial.println(godzina);
Serial.print("MinutaE: ");
Serial.println(minuta);
Serial.print("TemperaturaE: ");
Serial.println(temperatura);
}
else
{
Serial.println ("Nie bylo nic w EEPROMmie");
}


//zapisujemy nowe dane do EEPROM:
godzina++;
if (godzina>=24) godzina=0;
minuta++;
if (minuta>=60) minuta=0;
temperatura+=1;
if (temperatura>=100000) Serial.println("Pewnie już nie ma Eeprom, sporo zapisow");
zmiennakonfiguracyjnatypusave={godzina,minuta,temperatura};
dane2=zmiennakonfiguracyjnatypusave;//tylko tak dla jaj
address=0;
 EEPROM.update(address, 55);
address++;
EEPROM.put(address, dane2);


zmiennakonfiguracyjnatypusave ={ 22,55,22.22};

 address += sizeof(dane2); //Zmiana adresu o wielkosc struktury zmiennej dane2
EEPROM.put(address,zmiennakonfiguracyjnatypusave);
EEPROM.get(address, dane2);
godzina=dane2.godz;
minuta=dane2.minuta; //to sa rozne zmienne
temperatura=dane2.temp;

Serial.println("Zmienne odczyte z drugiego kompletu EEPROM");
Serial.print("GodzinaE2: ");
Serial.println(godzina);
Serial.print("MinutaE2: ");
Serial.println(minuta);
Serial.print("TemperaturaE2: ");
Serial.println(temperatura);


}

void loop() {
 /* Empty loop */
}
Oczywiście trochę tu pojechałem, by pokazać jak to działa.
Znalazłem jeszcze taki przykład, pewnie działa jak update:
Kod:
#include <avr/eeprom.h>

typedef struct
{
float value1;
float value2;
float value3;
float value4;
}  settingsType;

settingsType settings = {700.3,123.56, 650.5, 100};


void setup(){
Serial.begin(9600);

eeprom_update_block((const void*)&settings, (void*)0, sizeof(settingsType));

eeprom_read_block((void*)&settings, (void*)0, sizeof(settingsType));

Serial.print(settings.value1);
}

void loop(){
 //if(digitalRead(1)) {Serial.begin(9600);}
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości