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);
Bazowane na writeanything ze strony Arduino EEprom
oto kod [wersja 1 - podstawowa]:
Wersja 2 - po optymalizacji (nie korzysta z klasy String() oraz mnożenia tylko bitshift <<):
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:
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:
I nasza zmienna varr2 otrzymuje znany nam poprzednio wynik.
przykłąd struktury:
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.
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"
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 / C++
Wersja 2 - po optymalizacji (nie korzysta z klasy String() oraz mnożenia tylko bitshift <<):
Kod: C / C++
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 / C++
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 / C++
I nasza zmienna varr2 otrzymuje znany nam poprzednio wynik.
przykłąd struktury:
Kod: C / C++
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.