Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino dowolna zmienna na HEX i odwrotnie po raz kolejny (tylko inaczej)

DarekMich 25 Kwi 2016 23:12 2877 1
  • #1 25 Kwi 2016 23:12
    DarekMich
    Poziom 15  

    Witam, nie koniecznie problem ale chciałem przedstawić sposób na to aby przedstawić dowolną zmienną z pomocą zmiennej tekstowej string (ciąg HEX) i odwrotnie.

    Podana przeze mnie metoda robi dużo więcej niż tylko zmienia int na hex czy hex na integer obsługuje oprócz tego String,Int, Long, byte, word, fload, double, oraz tablice i struktury i dowolna inna (np. adres urządzenia 1wire, czy adress ip z bibliotki ethernet i wiele wiele więcej);


    Spoiler:
    Funkcje powstały ponieważ dopracowuję akurat sposób w jaki dokonuje przesyłania przy pomocą tanich modułów RF433 MHz ilość energii elektrycznej jaką zużywam. Pech chciał, że akurat wysyłam zarówno napięcie, prąd, częstotliwość i ilość energii zużytej w kWh*1000000 od ostatniego pomiaru (ten co ok. 1s). Oczywiście są to 4 zmienne typu float (ostatni double).

    Przykładowo wygląda to tak:
    PWR 237.3452 10.3421 50.11 14.33321

    łącznie jak widać jest to 35 znaków, z czego długość tekstu jest zmienna.
    chcąc nie tracić na precyzji podjąłem próbę wysyłania tego w wersji jak najbardziej skompresowanej, tj w czystej postaci bitowej. 1 zmienna float to 4 bajty, 4 zmienne to 16 bajtów (czyli co najmniej 2 krotny zysk długości.

    Plan jest taki żeby urządzenie składało łańcuch HEX z powyższych zmiennych (zawsze stała długość - odwzorowanie pamięci 4 zmiennych) dodanie jakiegoś nagłówka następnie wysyłanie wiadomości. a jak wiadomo przy ograniczonej długości wiadomości i prędkości, skracając ją mozna wysłać ją częściej i/lub więcej informacji.

    Z drugiej strony trochę bez sensu jest wysyłać te dane po prostu "otwarty tekstem" :)



    Bazowane na writeanything ze strony Arduino EEprom

    oto kod [wersja 1 - podstawowa]:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wersja 2 - po optymalizacji (nie korzysta z klasy String() oraz mnożenia tylko bitshift <<):
    Kod: c
    Zaloguj się, aby zobaczyć kod


    W efekcie różnica między nimi polega na samej konwersji int > hex i odwrotnie oraz na ilości pamięci (Zmiennych w funkcjach), wersja 2 powinna działać szybciej i potrzebować mniej pamięci ram.

    Odwołanie jest bardzo proste, przykład konwersji w 2 strony:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    otrzymamy: 4047e69b

    Tak otrzymany wynik można wkleić w dowolny converter online żeby otrzymać wynik z powrotem.(przykład dla zmiennej typu float)

    np tutaj

    Zeby natomiast zrobić to w naszym Arduino:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    I nasza zmienna varr2 otrzymuje znany nam poprzednio wynik.

    przykłąd struktury:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Daje to bardzo duże pole manewru dla kogoś kto akurat czegoś takiego szuka.

    Otrzymany łańcuch HEX można przerobić następnie na bajty wtedy długość informacji skróci się jeszcze o połowę.

    Pozdrawiam i miłej zabawy.

    0 1
  • #2 02 Maj 2018 17:08
    alex_zenith
    Poziom 7  

    Witam.
    Próbuję wykorzystać funkcję: hex2dec("63", liczba) i przy obu opcjach tej funkcji liczba zawsze = 0 a powinna = 99.
    Potrzebuję taką funkcję więc proszę o pomoc.
    Paweł

    0