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”:
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.
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:
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):
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
Odpowiedzi:
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.
źródło
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ą.
źródło
Prawie wszystkie schematy transmisji RF będą musiały mieć kilka cech w protokołach kodowania danych. Obejmowałyby one:
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.
źródło
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.
źródło
228
jest taka22.8C
. W przypadku Farenheita rób to, co zwykleF=C*9/5+32
.