Jakie kodowanie zastosowano w tym sygnale?


19

Mam tani bezprzewodowy termometr basenowy (AcuRite 617 1 ) i chciałbym przechwycić dane dotyczące temperatury w odbiorniku i używać go ze skomputeryzowanym systemem rejestracji danych.

Dogodnie, wewnątrz odbiornika jest mała płytka zrywalna, która jest podłączona do anteny i ma cyfrowe styki „V”, „G”, „D” i „SH”:

Płyta RF211

Oto fragment przechwyconych danych z pinu „D” podczas transmisji (zdarzają się raz na minutę). Przed tym segmentem istnieją dane, które wydają się być znacznie szybsze, ale uważam, że mogą to być szumy - to początek danych 1,36 kHz / 680 Hz.

przechwycony sygnał z pinu „D”

Trochę googlowałem i nie mogę znaleźć takiego kodowania, które wygląda tak, ale jeśli zgadnę, co się dzieje, oto, co myślę:

  • początkowe 4 cykle 680 Hz mają zsynchronizować zegary, ale nie zawierają danych
  • 13 następnych cykli 1,36 kHz (2x początkowa częstotliwość) wydaje się mieć jedną z dwóch postaci: albo spadają nisko przed punktem środkowym cyklu, albo po nim - zakładam, że jedna forma jest logiczna, a druga jest zerem.
  • potem wydaje się, że jest dziwna luka, ale jeśli pominiesz część niskiego poziomu, która jest częścią poprzedniego „1”, to pozostała przerwa wynosi 735 µs, co jest (poprawną fazą!) kontynuacją Preambuła 680 Hz.

Czy patrzę na to poprawnie? Czy istnieje nazwa tego kodowania?

Kilka dalszych uwag na temat płyty kontrolnej:

  • płyta jest oznaczona „RF211” i wygląda niezwykle spójnie z uniwersalnym odbiornikiem 3W QwikRadio MICRF211 „3V działającym na 433,92 MHz” 3
  • arkusz danych MICRF211 ma następujący rysunek (z bardzo małym wyjaśnieniem), który wygląda kusząco jak to, co widzę, z wyjątkiem fali prostokątnej o podwójnej szybkości przesyłania danych w porównaniu do mojego przechwytywania:
    profil danych

14.02.2016 Aktualizacja: Przejrzałem ponownie ten projekt i wydaje się, że otrzymuję czysty 64-bitowy strumień między 4-cyklową preambułą a 1-cyklową „postamble”, po czym płyta wyświetlacza wyłącza moduł RF przez ciągnięcie ^ SH nisko (górna linia):

64 bity danych

Zgodnie ze schematem Micrela „33/66% PWM” (który nie pojawia się nigdzie indziej w Google), to jest to

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

Więc teraz muszę zacząć manipulować temperaturą, aby zdekodować bity. Tutaj („x”) są bity, które wydają się zmieniać bez widocznej zmiany na wyświetlaczu:

0000011110011000110000000000000000000000100011101000010010101010
------------------------------------------------x----xxxx----xxx

Zakładam, że są to albo najmniej znaczące bity, albo poziom naładowania baterii (który jest pokazywany jako „niski”, gdy spada znacznie).

15.02.2016 Aktualizacja: Biorę udział w pokazie, aby nadać nowej wymianie stosu „Inżynierii wstecznej” pęknięcie przy określaniu znaczenia: /reverseengineering/12048/what-is-contained -w-tej-transmisji-rf-basen-czujnik-temperatura-jednostka-podstawowa-re


BTW - Czytanie komentarzy użytkowników na stronie Home Depot dla AcuRite 617 nie daje dobrego wrażenia na temat ogólnej trwałości tego produktu. Właściwie to brzmi, jakby to było przesadne posunięcie, jeśli chodzi o to, że nie wycieka do nadawcy.
Michael Karas

o tak jest. mój już wyciekł. ale wysuszyłem go i zdemontowałem i mam pewien stopień pewności, że mogę poprawić uszczelnienie za pomocą gorącego kleju i / lub silikonu. komora baterii wydaje się być dobrze zaprojektowana z przyzwoitym o-ringiem; reszta jednostki jest tak zła i nigdy więcej nie musi być otwierana ...
Rob Starling

Przejrzał inne odpowiedzi, ale to z wyglądu. Początkowa fala prostokątna ma zsynchronizować segmentator danych na poziomie 50%. Wstrzymaj przed danymi, aby upewnić się, że poziom „1” zanikł. Następnie 2: 1mk-spc = 1 powiedzmy, a 1: 2 = 0. Przy histerezie 50:50 nie przełącza się między poprzednimi 1 lub 0 ALE nie powinno się zdarzyć podczas strumienia danych. Powyższe jest „złe”, ponieważ nie próbuje zachować średniego stosunku 50:50, a poziom prądu stałego będzie dryfował, jeśli dane mają więcej zer lub zer, ale jeśli stała czasowa DC jest długa w porównaniu do długości msg, nie ma materia. Następnie ponownie zsynchronizuj z preambułą 1: 1 dla następnej wiadomości.
Russell McMahon

Dekoder może być opamp z jednym sygnałem wejściowym zasilanym przez filtr RC do ustawiania średniego poziomu prądu stałego i innym sygnałem zasilanym przez rezystor plus sprzężenie zwrotne histerezy (może około 4R), dzięki czemu sygnał 1: 1 nie odwraca wyjścia, ale 2 : 1 lub 1: 2 tak. Trochę zabawy z histerezą% i stałą czasową DC RC i powinno działać wystarczająco dobrze.
Russell McMahon

Kilka granulek węglika wapnia lub metalicznego wapnia na dole obudowy powinno utrzymywać suchość i nieznaczne ciśnienie :-). Nie, nigdy tego nie próbowałem.
Russell McMahon

Odpowiedzi:


8

Micrel nazywa to schematem PWM 33/66%. Wydaje się, że jest to dość prosty, ale doraźny protokół.

PWM oznacza modulację szerokości impulsu. Istnieje strona Wikipedii, która jest bardziej szczegółowa, ale w skrócie, PWM to miejsce, w którym utrzymujesz ustalony okres, więc tutaj jest czas od rosnącej krawędzi do następnej rosnącej krawędzi, ale zmieniasz procent czasu spędzanego na wysokim stan przez zmianę, gdy nastąpi opadanie krawędzi. W tym przypadku widać, że ma 33% wysokości dla „1” i 66% wysokości dla „0”.

Początkowa seria impulsów ma jednakowy czas wysoki i niski. Zwykle odbywa się to w celu umożliwienia odbiornikowi synchronizacji przed otrzymaniem rzeczywistych danych.

Zobacz http://www.micrel.com/_PDF/App-Notes/an-22.pdf, aby uzyskać więcej informacji na temat tego, czego oczekują od modułu.

Typowym sposobem na otrzymanie tego rodzaju kodowania byłoby wprowadzenie go na pin przechwytujący wejście timera mikrokontrolera. Lub możesz po prostu podłączyć się do ogólnego wejścia i poprosić o próbkę przy 4-5x okresie PWM. Stąd algorytm dekodowania nie jest zbyt trudny.

Alternatywnie, jak sugeruje markt, możesz wrócić do samego czujnika temperatury. Ale jeśli jest to analogowy sygnał wyjściowy, będziesz musiał go przekonwertować na cyfrowy i może mieć nieco inne liczby w logowaniu niż oryginalne wyjście.


3

Ludzie, których znam, zwykle nazywają tę technikę kodowania „PWM”, co, jak sądzę, jest rozsądnym opisem.

Moją pierwszą myślą, patrząc na strumień danych i zakładając, że poprawnie odgadniesz biegunowość bitów, jest to, że jest to 12-bitowy odczyt ADC, najpierw LSB, z wiodącym „1” jako bitem początkowym. Najpierw używam LSB, ponieważ początek prawdopodobnie następnego odczytu pokazuje zmianę jednobitową i jest mało prawdopodobne, aby odczyt ADC temperatury (basenowej) zmieniał się o 2 lub 3 MSB w tak krótkim czasie.

Zagłębiłbym się trochę dalej w system, wracając do tego, co generuje dane (w przeciwieństwie do przesyłania), sprawdzam, czy potrafisz zidentyfikować czujnik temperatury i szukam pewnej korelacji między przesyłanymi danymi a temperaturą.


Wydaje mi się, że @RobStarling powinien już być w stanie wiedzieć, jaka jest transmitowana temperatura, dzięki spojrzeniu na urządzenie odbiornika i zobaczeniu, co jest wyświetlane.
Michael Karas

1
to prawda, ale te rzeczy mogą być podstępne. np. wyświetlanie można przełączać pomiędzy ˚F / ˚C, więc transmisja może być w absolutnym ˚C lub ˚F albo albo w stosunku do jakiegoś dziwnego przesunięcia, albo do pewnej dowolnej dokładności ustalonego punktu. są też 3 przełączalne identyfikatory stacji („A”, „B”, „C”) i chociaż mówi, że zmiana identyfikatora może pomóc w odbiorze, mam przeczucie, że to tylko prefiks identyfikacyjny w wiadomościach - zmienię i zobacz, jakie zmiany w danych.
Rob Starling

@RobStarling - Możesz otworzyć moduł nadawczy, aby sprawdzić, czy używa on prostego typu czujnika temperatury, takiego jak LM75 lub jednego z innych popularnych typów I2C. Jeśli tak, jest prawdopodobne, że dane są przesyłane przez łącze, ponieważ wartość temperatury jest po prostu zgodna z odczytem z czujnika temperatury. Z drugiej strony, jeśli nadawca użyje jako czujnika czujnika analogowego, takiego jak dioda lub tranzystor BJT, trudniej będzie wywnioskować rzeczywiste przesłane dane.
Michael Karas

Podejrzewam, że najlepszą szansą, aby dowiedzieć się o zawartości danych, jest umieszczenie nadawcy w kontrolowanej sytuacji, w której można powoli zmieniać temperaturę, tak aby można było zobaczyć, że czytanie zmienia się po kolei. Będziesz miał wyświetlacz odbiornika, który powie ci, czego się właściwie oczekuje.
Michael Karas

@MichaelKaras - trudno zobaczyć, co to jest czujnik - jest na małej desce wciśniętej w mały uchwyt na czubku, zalany odrobiną pasty termicznej, aby przymocować go do zewnętrznej ściany pod wodą.
Rob Starling

2

Prawie wszystkie schematy transmisji RF będą musiały mieć kilka cech w protokołach kodowania danych. Obejmowałyby one:

  1. Spójna preambuła formatu używana do blokowania odbiornika na częstotliwości
  2. Wskaźnik impulsu synchronizacji do oznaczenia początku, jeśli wskazanie ramki
  3. Metoda kodowania danych 1 i 0 za pomocą pewnego rodzaju zakodowanego taktowania odzyskiwania danych.

Odnotowany dziwny puls kuli jest z pewnością wskaźnikiem pulsu synchronizacji.

Kodowanie danych wydaje się zgodne z tym, co widziałem jako kodowanie szerokości impulsu. Jest to dość powszechna technika, w której jeden kierunek przejścia podąża za stałą częstotliwością, co prowadzi do czasów komórek bitowych o stałej szerokości. Podczas działania komórki bitowej aktywny puls jest prezentowany jako 25% czasu komórki bitowej lub 75% czasu komórki bitowej. Schemat ten nie jest schematem zrównoważonego kodowania DC od impulsu do impulsu, jak oferty kodowania Manchester. Jest to powszechna technika z kodowaniem szerokości impulsu w celu zapewnienia równowagi DC w protokole wiadomości poprzez wysyłanie dodatkowych bitów w celu stworzenia ogólnej równowagi w całej wiadomości. W najprostszej postaci dane są wysyłane dwukrotnie, a druga kopia jest logicznie odwrócona.

W twoim przykładzie dziwnie jest widzieć dane modulowane szerokością impulsu występujące przed impulsem synchronizacji. Jednak nadal jest wykonalnym schematem, jeśli algorytm dekodowania danych jest zaprojektowany tak, aby akceptować odebrane dane z synchronizacją w tej pozycji. Możliwe, że urządzenie wysyła jeden typ danych przed synchronizacją i jeden po niej. Podział może dotyczyć adresu czujnika / danych temp LUB danych rzeczywistych / danych odwróconych.

Edytować:

Warto zauważyć, że wygląda prawie na to, że jednostka nadajnika używa innego algorytmu programowego do formułowania dodatnich szerokości impulsu dla komórek danych przed wzorem synchronizacji niż dla szerokości impulsu w i po wzorze synchronizacji. Oznacza to, że może istnieć oddzielny fragment oprogramowania generującego wcześniejszy wzorzec niż ten dla kolejnej części wzorca. Ta różnica wzorca może sugerować, że źródło danych w każdym przypadku wymagało innej obsługi pod względem sposobu uzyskiwania dostępu krok po kroku. Różnicą widoczną na schemacie taktowania może być po prostu taktowanie instrukcji lub dwie różnice w pętlach generowania wzorca.


zastanawiam się, czy to jest: preambuła (kwadrat) + bit startowy (1) + unikalny identyfikator (12 bitów) + puls synchronizacji + dane. (och, jak sugerowałeś ... np. może oczekuje, że µC przygotuje się na dane podczas impulsu synchronizacji)
Rob Starling,

2

Zacząłem dekodować Acurite 617 i oto moje wstępne spostrzeżenia. Mogę powiedzieć, że ostatni bajt jest pewnego rodzaju bajtem „kontrolnym”, a następne trzy ostatnie bajty zawierają temperaturę. Te bajty są również wysyłane przy użyciu siódmego bitu w celu uzyskania parzystości i używana jest tylko dolna część każdego bajtu. Napisałem program Arduino do przechwytywania danych i widziałem następujące komunikaty / temperaturę.

40 ce c 00 00 00 0c 03 be
(00 0C 03) => 0C3 => 67 F.

40 ce c 00 00 00 0c 84 39
(00 0C 04) => 0C4 => 67 F.

40 ce c 00 00 0c 05 b8
(00 0C 05) => 0C5 => 67 F.

Inne dane / szablony, które widziałem to:

E2 => 73 F.

F5 => 76 F.

108 => 80F (81 00 88)

109 => 80 F.

Korzystając z tego, powinieneś być w stanie dokonać konwersji „prostej” (założenia).

Ponieważ nie mam dobrego zakresu (a fakt, że dane są wysyłane raz na minutę), nie jestem pewien, czy mam czas. Widzę synchronizację HI i LO jako 720 usec, a bity danych to 240 i 480 usec.

Mam nadzieję, że później będę miał więcej informacji. Mam ich sporo. Gdy tylko zaczną wyciekać, wyjmuję je z basenu i suszę do użytku w domu. Późniejsze 617 modułów (z odkręcanym dnem i o-ringiem) wydają się trwać dłużej.


Zrobiłem trochę więcej dekodowania. Ostatni bajt (bajt kontrolny) sprawia, że ​​XOR wszystkich ośmiu bajtów jest równy 0FFH. Na przykład dla „40 CE C0 00 00 8D 0C 30” 40 xor CE xor C0 xor 00 xor 00 xor 8D xor 0C xor 30 jest równy 0FF.

Również obniżyłem temperaturę do 34F, a liczba wynosiła 10 miejsc po przecinku (tj. 00 00 0A), a przy 80F liczba wynosiła 264 miejsc po przecinku (tj. 81 00 88 lub 108H).

Z tego używam Temp (F) = 0,1811 * Liczba + 32,1889. Mogę uzyskać większy zakres, aby uzyskać lepsze dane, jeśli zobaczę jakiś błąd.

Patrząc na napis Roba Starlinga 14.02.2016:

00000111/10011000/11000000/00000000/00000000/10001110/10000100/10101010 07 98 C0 00 00 8E 84 AA

XOR = FF

Liczba = 0E4 lub 228

Temp = 73,5 F.


Dzięki chłopaki!!! jestem prawie pewien, że liczba nie jest tylko „zliczeniem”, ale raczej dokładną temperaturą w 0,1 ° C - to znaczy „matematyka” dekodowania 228jest taka 22.8C. W przypadku Farenheita rób to, co zwykle F=C*9/5+32.
Rob Starling,

podsumowane na stronie Reverse Engineering SE: reverseengineering.stackexchange.com/a/13593/15076
Rob Starling

1
Rob, masz rację - powinienem to zobaczyć. F = 0,18 * Liczba + 32,0. Dobrze, że wskazałeś, że wkrótce zamierzam umieścić go w prawdziwej gorącej wodzie, aby uzyskać lepsze „m” i „x” za pomocą szerszego zakresu.
Ken S

Nadal możesz chcieć przeprowadzić kalibrację, aby uzyskać dokładniejsze liczby, ponieważ kilku recenzentów skarżyło się na wyłączenie wyświetlacza o kilka stopni. Może to jednak również odzwierciedlać fakt, że znajduje się tylko ≈4 "pod powierzchnią, a większość termometrów basenowych w starej szkole jest na długim sznurku.
Rob Starling

Aktualizacja: napisałem bibliotekę Arduino - github.com/robstarling/ArduRight - daj mi znać, czy to działa dla Ciebie! Ma przykład i wszystko. Odwołując się do zdjęcia w tym poście, musisz przylutować przewody do styków „SH”, „D” i „G”. Aby uruchomić przykładowy szkic, podłącz te przewody odpowiednio do pinów 2, 7 i GND.
Rob Starling,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.