• 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
Zapis odczyt EEprom double, float
#1
Witajcie.

Znalazłem taką funkcję
Kod:
//======================== EEPROM
void EEPROMWritelong(int address, long value)
     {
     //Decomposition from a long to 4 bytes by using bitshift.
     //One = Most significant -> Four = Least significant byte
     byte four  = (value & 0xFF);
     byte three = ((value >> 8) & 0xFF);
     byte two   = ((value >> 16) & 0xFF);
     byte one   = ((value >> 24) & 0xFF);

     //Write the 4 bytes into the eeprom memory.
     EEPROM.write(address    , four);
     EEPROM.write(address + 1, three);
     EEPROM.write(address + 2, two);
     EEPROM.write(address + 3, one);
     }

//This function will return a 4 byte (32bit) long from the eeprom
//at the specified address to address + 3.
long EEPROMReadlong(long address)
     {
     //Read the 4 bytes from the eeprom memory.
     long four = EEPROM.read(address);
     long three = EEPROM.read(address + 1);
     long two = EEPROM.read(address + 2);
     long one = EEPROM.read(address + 3);

     //Return the recomposed long by using bitshift.
     return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
     }

Problem w tym, że nie mogę tymi funkcjami prawidłowo zapisać danych współrzędnych GPSa

Mam zmienne pozycja_LAT i pozycja_LON typu float oraz flat i flon - dane z GPSu
dołożyłem dwie zmienne pomocnicze llat i llon typu long i teraz tak dokonuję zapis do EEPROM


Kod:
         EEPROMWritelong(121,flat*1000000);
         EEPROMWritelong(125,flon*1000000);

Kod:
    llat        = EEPROMReadlong(121); //EEPROMWritelong(121,50052254);    
    llon        = EEPROMReadlong(125); //EEPROMWritelong(125,20076146);
    pozycja_LAT = (float)(llat/1000000);
    pozycja_LON = (float)(llon/1000000);

Próbowałem też na siłę wrzucić dane ale to nic nie daje. Cały czas w EEpromie jest tylko 50,0 i 20,0

Mnożenie przez 1000000 wykonuję żeby pozbyć się przecinka i potem dzielę żeby ten przecinek odzyskać

Wszystko fajnie tylko że to nie działa
 
Odpowiedź
#2
Wczoraj opisałem float w eeprom tu: https://forum.arduinopolska.pl/watek-jak...mi-put-get - to w całości rozwiąże problem.
Jest w AVR coś takiego jak domyślna promocja do INT, jeśli w wyrażeniu używasz float i 1000, to 1000 lepiej zapisać tak 1000.0. Obawiam się, że zapis (float)(Ilat/1000000) powoduje rzutowanie na float już wyniku obciętego do liczb całkowitych. Dla pewności wyrzuć sobie te dane na serial i oczkami zobacz, czy efekt jest taki jak zaplanowany.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Wystarczyło zmienić albo dopisać rzutowanie
Kod:
   pozycja_LAT = (float)((float)llat/1000000);
   pozycja_LON = (float)((float)llon/1000000);
przed zmienną long a nie przed wyrażeniem.
Ale jeszcze napomknę że z terminalem to nie jest taka prosta sprawa (jest prosta, ale trzeba wiedzieć) ponieważ domyślnie daje tylko 2 miejsca po przecinku. Ale wystarczy dodać po zmiennej drugą wartość i już jest ok
Kod:
Serial.print(pozycja_LAT,6);
Serial.print(pozycja_LON,6);
 
Odpowiedź
#4
Oczywiście, można pozycja_LAT = (float)((float)llat/1000000), można też pozycja_LAT = ((float)llat/1000000.0), Serial.print(llat/1000000.0,6) zadziała, można też użyć istniejących funkcji put/get typowych dla arduino (a dla wielu zmiennych połączonych w strukturę) lub eeprom_update_block()/eeprom_read_block() przygotowanych w AVR <avr/eeprom.h>. Dla każdej filozofii programowania odpowiednie rozwiązanie. Można też grzebnąć w bibliotece, bo ta zmienna jest w GPS przechowywana jako liczby całkowite i taka konwersja w te i wewte jest po prostu zadziwiająca.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości