Odczyt bezprzewodowej sondy temperatury i wilgotności

Odczyt bezprzewodowej sondy temperatury i wilgotności

Krótkie wprowadzenie

Artykułem tym chciałbym się z Wami podzielić tym jak udało mi się odczytać przy pomocy Arduino UNO R3 wartości temperatury i wilgotności wysyłane przez bezprzewodową sondę.
Od jakiegoś czasu zajmuję się monitorowaniem warunków (temperatura, wilgotność) w mieszkaniu i na zewnątrz. Celem moim jest zbudowanie jeszcze przed tą zimą inteligentnego systemu sterowania ogrzewaniem i wentylacją w mieszkaniu.
Jestem w posiadaniu stacji pogodowej (mniej więcej takiej) z bezprzewodową sondą temperatury i wilgotności. Postanowiłem nauczyć się odczytywać jej wskazania i przesyłać je do komputera.

Stacja pogodowa
Dokładnie taką stację posiadam

Zapytanie do producenta

Pierwszą rzeczą jaką postanowiłem zrobić to zapytać producenta o protokół jakim przesyłane są te wartości. Początek był obiecujący. Miły pan wprawdzie nie wiedział nic więcej ponad to, że sonda nadaje na częstotliwości 433 MHz, ale obiecał się dowiedzieć. Skończyło się jednak na mailowej odpowiedzi o treści „Tak, pytałem u źródła, niestety, nie da się tak zrobić, aby czujka sczytywała do innego urządzenia niż nasza stacja bazowa.
Oczywiście nie uwierzyłem :)

Pytanie na majsterkowo.pl

Postanowiłem poszukać pomocy gdzie indziej, a mianowicie na portalu https://majsterkowo.pl. Zadałem pytanie w wątku https://majsterkowo.pl/forum/arduino-i-bezprzewodowy-czujnik-temperatury-i-wilgotnosci-t816.html licząc na pomoc społeczności. Jednak jedyna odpowiedź jaką dostałem brzmiała „W opisie jest napisane z jaką stacją to współpracuje. Do pracy z Arduino tego raczej nie zmusisz, producent na pewno zadbał o odpowiednie kodowanie sygnału.”
Nie zabrzmiało to zbyt zachęcająco, ale oczywiście tym bardziej w to nie uwierzyłem ;)

Kupno odbiornika RF 433

W międzyczasie zakupiłem między innymi nadajnik i odbiornik RF 433 MHz.

Opublikuj swój projekt i odbierz 50% rabatu do wykorzystania w sklepie Nettigo.pl

Kilka zakupionych elementów
Odbiornik i nadajnik, wyświetlacz LCD oraz DHT22
To te dwa najmniejsze zielone elementy.

Analiza sygnału

Kupno analizatora

Buszując gdzieś po sieci natrafiłem na pojęcie „analizatora stanów logicznych”. Pomyślałem, że właśnie tego potrzebuję.
W sieci znalazłem bardzo bogatą ofertę tego typu urządzeń od takich za wiele tysięcy złotych (np http://www.conrad.pl/websale7/?Ctx={ver%2f7%2fver}{st%2f3ec%2fst}{cmd%2f0%2fcmd}{m%2fwebsale%2fm}{s%2fconrad%2fs}{l%2f01-aa%2fl}{p1%2fd2f6e56f669660582c6750d86eaf57b8%2fp1}{md5%2f5ffac58ff15c6a24fcf953c797b8c9b3%2fmd5}&act=product&prod_index=123271&cat_index=SHOP_AREA_17630_1114018&otp1=tablink2) do bardzo prostych i tanich podłączanych bezpośrednio do portu LPT (drukarkowego) w komputerze.

Ostatecznie zdecydowałem się na takie urządzenie:

Analizator stanów logicznych
Analizator stanów logicznych

Analizator ten ma 8 kanałów, częstotliwość odczytu do 24 MHz i … kosztuje tylko 57 PLN :)
Znalazłem go na Allegro.

Do tego analizatora należy pobrać oprogramowanie ze strony http://www.saleae.com/.

Odczyt sygnałów

Aby odczytać nadawane przez sondę sygnały postanowiłem podłączyć analizator bezpośrednio do nadajnika RF wewnątrz sondy. Po otwarciu sondy wnętrze przedstawia się następująco

Wnętrze sondy
Wnętrze sondy
Żółtymi przewodami podpięty jest czujnik temperatury, dwoma czarnymi czujnik wilgotności, czerwonym i czarnym baterie, a trzema czerwonymi nadajnik RF. To właśnie tam podpiąłem się analizatorem stanów logicznych.
Do podpięcia się bardzo brakowało mi krokodylków lub specjalnych sond. W przyszłości na pewno sobie takie kupię.

Następnie rozpocząłem pomiar. Ustawiłem częstotliwość próbkowania na 1 MHz, wyłączyłem wszystkie kanały poza pierwszym. Włączyłem dla niego opcję „Require rising edge transition”, która powoduje, że pomiar danych rozpocznie się dopiero kiedy sygnał na wejściu zmieni się z niskiego na wysoki i nacisnąłem „Start”.
Po jakimś czasie (sonda nadaje co ok 50-56 sekund – więcej o tym później) na ekranie ujrzałem taki obrazek:

Widok na wszystkie dane
Widok na wszystkie dane

Widać na nim, że odczytane zostały dane, że nadawanie trwało trochę ponad 0,8s.
Po powiększeniu początku danych zobaczyłem:

Powiększony początek pomiaru
Powiększony początek pomiaru

Widać, że sonda nadaje krótki „piki” (stan wysoki), a pomiędzy nimi przerwy.
Stan wysoki zawsze trwa ok 560μs, a przerwy pomiędzy nimi 8640, 3800 i 1900μs. Przerwa 8640 μs występuje na samym początku transmisji, na samym końcu oraz tylko kilka razy w środku. Przerwy 3800 i 1900 o wiele częściej i są pomieszane. W tym momencie wydawało mi się, że 8640 to jakiś sygnał synchronizująco-rozdzielający, a te dwie pozostałe przerwy oznaczają bity o wartościach 0 i 1.
Czas to sprawdzić.

Analiza w arkuszu kalkulacyjnym

Analizę danych postanowiłem przeprowadzić w LibreOffice Calc (dla niewtajemniczonych to taki darmowy odpowiednik Excela ;) ).

Po wybraniu w oprogramowaniu analizatora opcji „Options/Export Data” (Ctrl+E) pojawia się okienko

saleae - okienko eksportu
saleae – okienko eksportu

Po wybraniu opcji jak na obrazku na dysku utworzony został plik z następującymi danymi – poniżej początkowy fragment:

W pierwszej kolumnie jest czas mierzony w sekundach, w drugiej kolumnie jest wartość sygnału jaka się pojawiła na wejściu w tym czasie.
Zaimportowałem te dane do arkusza i dodałem dwie kolejne kolumny: czas i stan.
W kolumnie czas wpisałem wszędzie formułę (dla komórki C3) =1000*(A4-A3). Dzięki temu otrzymałem czas w milisekundach trwania danego stanu.
Widać ponownie, że stan wysoki zawsze trwa ok 560μs, a stan niski 8640, 3800 i 1900μs. W czwartej kolumnie wpisuję regułę, które dla przerwy równej 3800μs wylicza, że to 1, a dla 1900μs wylicza, że to 0. Dla 8640μs wypisuje wartość „dystans”. Oto przykładowe dane:

Time[s] SCIO czas analiza
0 0
11,35824 1 0,56
11,3588 0 8,64 dystans
11,36744 1 0,56
11,368 0 3,8 1
11,3718 1 0,56
11,37236 0 1,88 0
11,37424 1 0,56
11,3748 0 1,92 0
11,37672 1 0,56
11,37728 0 3,84 1

Na tym poziomie analizy zauważyłem, że podczas pojedynczej transmisji 6 razy przesyłanych jest 37 bitów. Za każdym razem takich samych. Serie 37 bitów rozdzielane są „dystansami”.

Aby przeanalizować wartości tych bitów wykonałem następujące czynności. Najpierw wykorzystując autofiltr przeniosłem do drugiego arkusza taką paczkę 37 bitów do pierwszej kolumny. W kolejnych kolumnach zapisałem następujące formuły, które miały następujące znaczenie.

Kol. formuła znaczenie
B =1-A2 odwrotny bit (nie wiem czy długa przerwa to bit czy krótka)
C =A2+2(A3+2(A4+2(A5+2(A6+2(A7+2(A8+2*A9)))))) wartość bajtu zaczynającego się od tego bitu przy założeniu, że: długa przerwa to 1, a krótka to 0, najpierw jest najmłodszy bit a potem coraz starsze.
D =B2+2(B3+2(B4+2(B5+2(B6+2(B7+2(B8+2*B9)))))) wartość bajtu zaczynającego się od tego bitu przy założeniu, że: długa przerwa to 0, a krótka to 1, najpierw jest najmłodszy bit a potem coraz starsze.
E =A9+2(A8+2(A7+2(A6+2(A5+2(A4+2(A3+2*A2)))))) wartość bajtu zaczynającego się od tego bitu przy założeniu, że: długa przerwa to 1, a krótka to 0, najpierw jest najstarszy bit a potem coraz młodsze.
F =B9+2(B8+2(B7+2(B6+2(B5+2(B4+2(B3+2*B2)))))) wartość bajtu zaczynającego się od tego bitu przy założeniu, że: długa przerwa to 0, a krótka to 1, najpierw jest najstarszy bit a potem coraz młodsze.

Dla następujących danych:

  • kanału nr 3
  • temperatury 24,1 stopnia Celsjusza
  • wilgotności 43%

tabela przedstawiała się następująco:

A B C D E F
1 0 137 118 145 110
0 1 68 187 34 221
0 1 162 93 69 186
1 0 209 46 139 116
0 1 104 151 22 233
0 1 52 203 44 211
0 1 26 229 88 167
1 0 141 114 177 78
0 1 70 185 98 157
1 0 35 220 196 59
1 0 17 238 136 119
0 1 8 247 16 239
0 1 4 251 32 223
0 1 130 125 65 190
1 0 193 62 131 124
0 1 224 31 7 248
0 1 240 15 15 240
0 1 120 135 30 225
0 1 60 195 60 195
0 1 30 225 120 135
1 0 143 112 241 14
1 0 71 184 226 29
1 0 35 220 196 59
1 0 145 110 137 118
0 1 72 183 18 237
0 1 164 91 37 218
0 1 82 173 74 181
1 0 169 86 149 106
0 1 212 43 43 212
0 1 106 149 86 169
1 0
0 1
1 0
0 1
1 0
1 0
0 1

Na żółto zaznaczyłem te bajty gdzie widać pewne interesujące dane. W ostatniej żółtej komórce widać wilgotność, a w przedostatniej temperaturę pomnożoną przez 10. Pierwsze dwie zaznaczyłem na żółto bo to po prostu wcześniejsze dwa bajty. Że to ta kolumna to utwierdziłem się po kilku kolejnych pomiarach dla różnych wartości temperatury i wilgotności.
Powstały oczywiście pytania:

  • czy na wilgotność potrzeba aż 8 bitów?  skoro jej wartości są od 0-99 to wystarczy 7.
  • na ilu bitach i w jaki sposób kodowana jest temperatura, ten jeden bajt wystarczy na temperatury od 0.0 do 25.5 stopni Celsjusza, a ma wystarczyć na jakieś -50.0 do 70.0 czyli 1200 wartości więc co najmniej 11 (w praktycznie 12) bitów

Po kolejnych pomiarach i próbach, których nie będę tu szczegółowo opisywał (było ich ok 10) doszedłem do następujących wniosków:

licznik bity wartości komentarz
1 1 9 jakieś 4 bity
2 0
3 0
4 1
5 1 219 losowe id
6 1
7 0
8 1
9 1
10 0
11 1
12 1
13 0 0 jakieś 2 bity
14 0
15 0 1 kanał (od 0)
16 1
17 0 332 temperatura
18 0
19 0
20 1
21 0
22 1
23 0
24 0
25 1
26 1
27 0
28 0
29 0 25 wilgotność
30 0
31 0
32 1
33 1
34 0
35 0
36 1
37 0 0 jakiś bit

Oto znaczenie kolejnych sekcji:

  1. jakieś 4 bity – te bity ani razu nie zmieniły swojej wartości
  2. losowe id – wg dokumentacji po każdej zmianie baterii konieczne jest ponowne synchronizacja stacji bazowej z sondą ponieważ sonda zaczyna wysyłać nowe, losowe id – to prawdopodobnie te bity
  3. jakieś 2 bity – nigdy się nie zmieniły
  4. kanał (od 0) – w sondzie można wybrać kanał, jego wartość wysyłana jest właśnie na tych dwóch bitach
  5. temperatura – zakładam, że wysyłana jest na tych 12 bitach jako liczba całkowita będąca wartością temperatury pomnożoną przez 10. Podejrzewam, że najstarszy bit to bit znaku, ale nie robiłem jeszcze testów dla temperatur ujemnych
  6. wilgotność – jest przechowywana jako liczba całkowita na tych bitach. Możliwe, że nie na 8 od 29 bitu, a tylko na 7 od 30 bitu, a bit 29 jest do czegoś innego.
  7. jakiś bit – jego wartość nigdy się nie zmieniła.

Na tym etapie postanowiłem przerwać analizę danych i zająć się budową odbiornika, który będzie bezprzewodowo je odczytywał. W przyszłości podłączę go mojego systemu monitoringu temperatury zacznę prowadzić dalsze badania.

Wysłanie samemu danych do odbiornika

Aby przetestować poprawność rozpracowanych danych postanowiłem zmontować układ do nadawania i przeprowadzić próbę nadania temperatury i wilgotności do stacji bazowej czyli udawanie sondy.

Napisałem następujący programik:

Wszystko zadziałało właściwie od razu. Jedyny problem jaki napotkałem to odstępy pomiędzy nadawaniem kolejnych pomiarów. Okazało się, że odstęp ten jest różny na różnych kanałach i tak:

  • na kanale 1 wynosi on 50s
  • na kanale 2 wynosi on 53s
  • na kanale 3 wynosi on 56s

Dokładnie co taki okres czasu stacja bazowa spodziewa się kolejnego nadawania i oczekuje na niego przez krótki okres czasu. Prawdopodobnie aby oszczędzać baterię.

Odczyt danych

Odczyt danych okazał się najtrudniejszą częścią, a to za sprawą dużej ilości błędów.
Po pierwsze kiedy sonda nie nadaje to odbiornik i tak wychwytuje „coś” z powietrza i ciągle na jego wyjściu stan się zmienia. Kiedy sonda zaczyna nadawać to odbiornik chwilę potrzebuje żeby się „dostroić” do mocy sygnału i pierwsze bity są uszkodzone często.
Poza tym okazało się, że czułość odbiornika jest niewielka i już przy odległości rzędu metra liczba niedokładnych odczytów mocno rośnie.

Pierwsze podejście

Pierwsza wersja programu do odczytu wyglądała następująco:

Nie działała ona najlepiej, o tym co poprawiłem w dalszej części artykułu.

Problemy z zasięgiem

Jak już pisałem kiedy żaden nadajnik nie nadawał odbiornik „łapał coś” i stan na wyjściu co chwila się zmieniał. Założyłem jednak, że kiedy nadajnik zacznie nadawać to odbiornik zacznie reagować prawidłowo.
Pierwsza wersja programu została napisana tak, że program czeka na stan wysoki o odpowiedniej długości, a następnie odczytuje dane spodziewając się prawidłowych czasów zarówno stanów wysokich jak i niskich. Po pierwszym błędzie program przerywał odczyt i próbował zanalizować odczytane dane, a mianowicie jeżeli udało się odczytać choć jedną serię danych to następowało porównywanie odczytanych serii.

Pierwsze próby robiłem nadając mój testowy sygnał z nadajnika, który zakupiłem razem z odbiornikiem. Sygnał nadawany był z niewielkiej odległości. Zauważyłem, że dane nie odczytują się do końca poprawnie. Często zamiast sześciu serii danych odczytywane było pięć serii.
Przyczyną okazało się to, że kiedy nadajnik zaczynał nadawać to odbiornik tak jakby potrzebował chwili aby się do niego dostroić.

Dużo gorzej było kiedy próbowałem odczytać sygnał z oryginalnej sondy, tu już przy około metrowej odległości zaczynały się spore problemy. Często nie udawało się odczytać w ogóle danych lub najwyżej jedną, dwie serie.
Przyczyną jak się okazało było pojawianie się na wyjściu stanów wysokich mimo tego, że sonda nadawała stan niski.
Próbowałem poprawić czułość sondy przylutowując antenkę w postaci kawałka drutu o długości około 15 cm, ale niewiele to pomogło. Wywiązała się nawet dyskusja na forum majsterkowo.pl. Jak tylko znajdę moment to popracuję nad tą antenką.

Kolejnym sposobem było ignorowanie krótkich stanów wysokich, to poprawiło nieco jakość odbioru.

Oto przykład wadliwie odczytanych danych:

saleae - zakłócenia w trakcie transmisji
saleae – zakłócenia w trakcie transmisji

W tym momencie postanowiłem zrobić co następuje:

  • jeszcze bardziej uniewrażliwić oprogramowanie na sporadyczne błędy
  • nie przerywać pomiaru po pierwszym poważnym błędzie tylko czekać na kolejną serię danych
  • być może pewną inteligencję wprowadzić

Poprawianie jakości odczytu

Omówienie sytuacji aktualnej

Tak wygląda log z pierwszej wersji programu, który za chwilę omówię

W pierwszej linii znajdują się informacje o odczycie, czyli:

  • kanał na którym nastąpił odczyt
  • odczytana temperatura
  • odczytana wilgotność
  • liczba pełnych udanych odczytów wszystkich bitów – jak pisałem wcześniej sonda nadaje 6 razy ten sam zestaw bitów w trakcie pojedynczej transmisji

Kolejne trzy wiersze zawierają informację o odczytach kolejnych bitów i tak:

  • pierwszy wiersz (lb:) zawiera informację o tym ile razy bit został prawidłowo odczytany
  • kolejny wiersz (sb:) zawiera informację o tym jakie informacje zostały odczytane – kiedy program odczytuje zero to zmniejsza tę wartość o 1, a kiedy odczytuje 1 zwiększa ją – w idealnym przypadku ta wartość jest równa tej z pierwszego wiersza lub ujemnej wartości z pierwszego wiersza
  • ostatni wiersz (b:) zawiera interpretację odczytu czyli 0, 1 lub ? jeśli interpretacja jest niejednoznaczna

W tym przypadku widać, że bity od 0 do 24 zostały odczytane 4 razy, a pozostałe bity 3 razy. Każdy bit za każdym razem został odczytany tak samo. Gdyby tak nie było i np bit 0 nie został 4 razy odczytany jako 1 tylko np raz jako 0 to wartość (sb:) nie wynosiłaby 4 tylko 2, a gdyby dwa razy jak 0 a dwa razy jako 1 to ta wartość wynosiłaby 0 i nie dałoby się powiedzieć jaką właściwie ten bit ma wartość.

Kolejnych 10 wierszy, tych zaczynających się od „pre”,  zawiera informacje o czasach 10 pomiarów niskich i wysokich stanów zanim rozpoczął się właściwy pomiar. Liczby w nawiasach oznaczają:

  • moment w którym zmiana została zmierzona, jest to technicznie millis() % 65536 – obcinam wartość millis() tylko do 16 bitów bo ze względu na małą pamięć nie mam gdzie przechowywać danych, ledwo się mieszczą
  • czas w jakim stan był niski
  • czas w jakim stan był wysoki

W tym przypadku wyraźnie widać, że te odczyty nie są szumem, a stanowią poprawne wartości odczytywanych bitów. Nie zostały jednak zaliczone do pomiaru. Stało się tak prawdopodobnie dlatego, że w momencie jak sonda  zaczęła nadawać to odbiornik potrzebował chwili aby się dostosować do nadawanego sygnału.
Na obrazie poniżej widać jak wygląda odczyt początku transmisji. Stan wysoki na lewo od zielonego znacznika „1” to pierwszy stan wysoki nadany przez sondę. Między znacznikami „1” a „2” sonda nadawała stan niski, jednak odbiornik wychwycił kilka stanów wysokich. Są to zakłócenia z którymi mój algorytm sobie nie poradził i uznał całość za szumy.

saleae - widok na początek transmisji
saleae – widok na początek transmisji

Widać też zakłócenia w dalszej części i dopiero potem (od mniej więcej 87ms) czyste dane.

Kolejnych 37 wierszy zawiera informacje o odczytach kolejnych bitów w kolejnych 6 transmisjach. Liczby w nawiasach mają takie samo znaczenie jak w wierszach „pre”.
Tu widać, że podczas odczytu 4 serii bitów nagle nastąpiła przerwa podczas odczytu bitu nr 25. Czas stanu wysokiego jest ok, jednak czas stanu niskiego jest zbyt krótki, wynosi tylko 1292μs. Oto co się stało:

saleae - zakłócenia w trakcie transmisji
saleae – zakłócenia w trakcie transmisji

Pomiędzy znacznikami „1” i „2” powinien być stan niski, jednak widać, że odbiornik wychwycił jakieś zakłócenia jedno o długości 103μs, a drugie o długości 1028μs. Aktualny algorytm zignorował to pierwsze, jednak tego drugiego już nie i uznał odczyt za błędny i przerwał działanie.

Oto co postanowiłem zrobić aby algorytm lepiej działał:

  • nie przerywać całkowicie działania po pierwszym błędnym odczycie, ale czekać na kolejną transmisję (czyli przerwę o czasie 8640μs) i zaprzestać czekania dopiero kiedy zbyt długo ona nie nastąpiła.
  • jeszcze bardziej uniewrażliwić algorytm na takie pojedyncze zakłócenia.

Nie przerywanie działania

Pisząc program, który po pierwszym błędzie nie przerywa działania tylko czeka na kolejną porcję danych praktycznie główną pętlę napisałem od nowa. Oto ten program.

Uniewrażliwienie na zakłócenia

Za to jeszcze się nie zabrałem, na poważnie, ale już całkiem nieźle to działa. Analizując program widać co już zrobiłem

Zestaw użytych elementów

Do przeprowadzenia tej pracu użyłem:

  • Arduino UNO R3 – zakupione na w sklepie internetowym nettigo.pl w zestawie startowym – oprócz samego arduino z zestawu użyłem
    • kabelki
    • płytkę stykową
  • analizator stanów logicznych saleae – jest to podróbka, ale działa

Co dalej

Następne kroki jakie zamierzam zrobić w tym temacie:

  • podpięcie układu do moje stacji monitorowania warunków w mieszkaniu i na zewnątrz. Stacja już całkiem nieźle działa, ale nie jest jeszcze gotowa na artykuł. Jeżeli interesuje Was ten temat już teraz to zapraszam na mój blog
  • Poprawienie jakości filtrowania zakłóceń
  • Zakup na nettigo innego odbiornika – może będzie bardziej czuły
  • Przerobienie programu aby na przerwaniach chodził i oszczędzał energię

Podsumowanie

Mam nadzieję, że temat Wam się spodobał i nie był zbyt długi i nużący.

Jest to mój pierwszy artykuł więc będę wdzięczny za wszelkie konstruktywne uwagi na jego temat.

Jeżeli ktoś miałby ochotę wspólnie ze mną rozwijać ten temat to zapraszam do współpracy. Cel na jesień/zimę to automatyka do sterowania ogrzewaniem w domu oparta między innymi o technologię z-wave.

Ocena: 4.7/5 (głosów: 83)
Nettigo - patron działu Elektronika

Podobne posty

Arduino ethernet device

Arduino ethernet device

Poniżej opisany projekt przedstawia „wrap” biblioteki EtherCard https://github.com/njh/EtherCard.Biblioteka EtherCard bardzo ładnie rozwiązuje konfigurację modułu ethernet…

42 komentarzy do “Odczyt bezprzewodowej sondy temperatury i wilgotności

  • Myślę, że opieranie automatyki domowej na podstawie bezprzewodowego nadajnika i odbiornika tego typu może odbić się czkawką ;)
    Wystarczy dowcipny sąsiad lub jakieś warunki zakłócające sygnał z czujnika i już masz w domu lodówkę albo piekarnik ;)

    Odpowiedz
    • mam jeszcze za oknem ds18b20 ;)

      a tak poważnie to myślę, że ryzyko jest niewielkie i warte swojej ceny :) a pewna dbałość w warstwie softu dodatkowo to ryzyko ograniczy

      Odpowiedz
      • jacek: Po pierwsze wielki szacunek za profesjonalne i wyczerpujące podejście do tematu, myślę, że wiesz teraz o tych układzikach więcej, niż dyrekcja fabryki, która je składa ;-)
        Natomiast ryzyka nie nazwałbym niewielkim – te stacje (w tym chyba Twoja) zwykle nie mają żadnego parowania tylko jednostronną „adaptację” do nadajnika a pewnie jakieś 50% tych zabawek pochodzi z jednej fabryki i ma identyczne kodowanie. Ja już nie raz łapałem pomiary na różnych kanałach mimo, że mam tylko jedną sondę. A sam czasami jej używałem np. w zamrażalniku żeby zweryfikować poprawność termostatu w lodówce. Nie chciałbyś raczej w słoneczny dzień +25 podejmować jakiejś decyzji na podstawie odczytu -26st.C/wilg. 100%… Nawet uśredniony z drugim rzeczywistym odczytem daje temperaturę ujemną w środku lata.

        Odpowiedz
        • @tomee: dzięki za komplement :)

          wiesz, ja jednak zaryzykuję, a z tego typu błędnymi odczytami spróbuję sobie poradzić, myślę, że uda mi się zrobić nieco bardziej inteligentny system jak taka prosta stacja ;)

          Odpowiedz
  • Super analiza. Coś podobnego chodzi mi po głowie od jakiegoś czasu i Twój opis tylko utwierdza mnie w przekonaniu, że to będzie ciekawe wyzwanie ale chyba jednak z dużą szansą na powodzenie. Czekam na opis kolejnych działań!

    Odpowiedz
    • bardzo dziękuję :)

      jak tylko coś będę miał gotowego dam znać, a myślę, że coraz częściej coś będę miał bo jak to mówią „pierwsze koty za płoty”

      Odpowiedz
  • Gratuluję projektu i rezultatów – jestem wręcz zaskoczony, jak prosto jest to kodowane. Przecież wystarczyłoby żeby temperatura była inaczej kodowana, np. od 15 bitu, i już byłoby trochę trudniej.

    Zastanawia mnie jednak co innego – w większości tego typu komunikacji gdzieś zostaje zaszyta suma kontrolna – właśnie po to, żeby wiedzieć czy wszystko jest prawidłowo odebrane. Czy sprawdzałeś, że te bity, które uznałeś za ID rzeczywiście zmieniają się tylko przy resecie baterii? Podałeś dane tylko z jednego testu, więc muszę wierzyć na słowo, ale naprawdę powinna tam gdzieś być suma kontrolna.

    Co do odbiornika – to normalne, że muszą złapać poziom. Zwykle robi się to jakąś preambułą (szczególnie jeśli ‚1’ i ‚0’ są kodowane różnymi poziomami sygnału, a nie długością pauzy); tutaj jak widać poradzili sobie powtarzając transmisję 6 razu. Pierwszy 1-2 są do wyrzucenia z definicji.

    I jeszcze jedno: zegary w tych urządzeniach nie mają szansy być precyzyjne, obstawiałbym drift rzędu kilku sekund dziennie na nadajniku, może trochę mniej na na odbiorniku – ciekaw jestem, na czym jest wykonywana resynchronizacja? Może na końcu transmisji…

    I na deser – rzuć okiem tutaj, chyba coś podobnego: http://forum.arduino.cc/index.php?topic=145341.0

    Odpowiedz
    • dziękuję :)

      Brak sumy kontrolnej bardzo mnie zdziwił, ale naprawdę jej nie ma. Podczas prac nad programowym filtrowaniem błędów odczytu widziałem już chyba ze dwie setki odczytów i żaden bit nie zmieniał się w taki sposób, że mógłby być tą sumą lub jej częścią. W szczególności bity na początku i końcu w ogóle się nie zmieniają.

      Co do „łapania poziomu” to zauważyłem, że już po kilku(nastu max) bitach poziom jest łapany. Te bity zauważ wolno są nadawane. Szkoda, że nie pomyśleli o tym, ja w swojej implementacji nadajnika po prostu przez chwilę nadawałem krótkie sygnały.

      Ta synchronizacja jest bardzo prosta, odbiornik zaczyna nasłuchiwać już ok sekundy przed czasem, odbiera komunikację i następnym razem wie kiedy znowu zacząć słuchać.

      Ta analiza do której linka mi wysłałeś to bardzo ciekawy materiał, chodzi mi po głowie aby rozwijać bibliotekę potrafiącą wiele różnych sond tego typu odczytywać. Tak żeby nie być skazanym na jeden model.
      Na tym niskim poziomie często będzie podobnie, kilka transmisji (u mnie 6, w przykładzie, który podałeś 3) takiej samej paczki bitów (u mnie 37, w Twoim przykładzie 57 bodajże), którą potem trzeba zinterpretować. Różnica tylko w czasach transmisji.
      Zdecydowana większość kodu dla takich stacji mogłaby być wspólna.

      Odpowiedz
  • Gratuluje świetnego rozgryzienia problemu ;) Najbardziej podobała mi się sytuacja, kiedy usłyszałeś od „producenta”, że się nie da, a Ty tu ładnie pokazałeś, że się da ;P

    A tak swoją drogą to problem z zakłóceniami mógłbyś rozwiązać stosując częstotliwość 868 MHz, jest u nas mniej popularna. Ewentualnie Bluetooth bo skacze po kanałach i tym sposobem minimalizowane jest ryzyko zakłócenia.

    Rozmawiałem ostatnio z ludźmi z ST i z naszych rozmów właśnie wyszło, że do sterowania urządzeniami mobilnymi obecnie nadaje się albo Bluetooth, albo RF 868 MHz. Z kolei 2,4GHz i wszystkie WiFi’ki podatne są na zakłócenia choćby nawet przez mikrofalówkę. No i podobno częstotliwość ta nie jest legalna w Polsce ;P Osobiście mam aparaturkę RC właśnie 2,4GHz z pełną syntezą sygnału i nigdy nie miałem problemu z sterowaniem. Może dlatego, że o ile dobrze mi wiadomo to aparatura RC w technologii 2,4GHz podobnie jak Bluetooth skacze po wstęgach i tym sposobem eliminuje możliwość podłączenia się do tego samego kanału na którym akurat nadajemy.

    Odpowiedz
    • dziękuję :)

      Też nie rozumiem postawy producenta, może osobie z którą rozmawiałem nie udało/chciało się zdobyć informacji i mnie zbył.

      Co do sterowania to zainteresowała mnie mocno technologia z-wave, mam zamiar niedługo w to wejść . Jest sporo urządzeń na rynku, które w tej technologii się komunikują. Sama nośna w tej technologii to właśnie 868 MHz.
      Może ktoś ma już jakieś doświadczenia i podzieliłby się nimi.

      Odpowiedz
  • Świetna robota, bardzo ciekawie się czytało. Zastanawia mnie tylko, czy na pewno nie lepiej zrobić całości od podstaw, montując odpowiednie czujniki dedykowane Arduino? Z mojego doświadczenia z takimi stacjami pogodowymi wynika, że nie są wzorem stabilności ani jakości – a przecież nie zrobiłeś tego researchu po to, aby oszczędzić 50 zł.

    PS. Synchronizacja może w ogóle nie korzystać z zegara, który się może rozjechać tylko z timera – po synchronizacji ustawiany jest licznik na 56 sekund i do następnego odczytu. W ten sposób szansa na rozjechanie synchronizacji jest niewielka, bo w 56 sekund nawet kiepski zegar będzie „trzymał”

    Odpowiedz
    • Ta moja ma już jakieś 2 lata i nieźle działa.
      Zrobiłem to dokładnie po to żeby zaoszczędzić te 50 zł :) a nawet sporo więcej niż 50 zł bo takie „wypasione” czujniki np systemu KNX to potrafią ponad 500 PLN kosztować, a nie 30.

      Odpowiedz
      • Moja właśnie padła po 2 latach. Kupiłem drugą (droższą) i przeżyła również 2 lata :) Dlatego trzeciej już nie kupiłem, mam tylko motocyklowy termometr (odporny na warunki pogodowe).

        Patrzę na ceny czujników wilgotności i (szczególnie) temperatury: w sumie oba nie kosztują tyle, ile wydałeś na analizator stanów :) Ale rozumiem, że rozrywka umysłowa – bezcenna :) Jeszcze raz: bardzo ciekawy post, przyda się innym majsterkowiczom na pewno.

        Odpowiedz
        • Analizator stanów w wersji produkcyjnej to powiedzmy 20 zł (bo arduino do testów przecież tylko używam) i można go podłączyć do np 6 sond po 30 zł każda co daje 200 zł za taki zestaw.

          Odpowiedz
  • Mam pomysl – raczej nie odnosnie dalszej analizy obecnego sposobu zczytywania danych – a nie latwiej byloby odczytywac sygnal wyslany juz do wyswietlacza stacji bazowej i tam odkodowany? Rozkrecamy stacje bazowa, podlaczamy sie do sygnalu idacego na wyswietlacz czy wrecz do wyswietlacza (mozliwe, ze ciezko bedzie mechanicznie) i mamy dokladny odczyt temperatury i wilgotnosci. Taki pomysl tylko. Odpornosc na zaklocenia maksymalna, bo odczytujemy dokladnie to co mamy na wyswietlaczu. Ale o szczegoly prosze nie pytac – az tak dobrze sie nie znam na cyfrowce.
    Albo wrecz analizator optyczny wyswietlacza – pare czujnikow optycznych, zeby z siedmiosegmentowych wyswietlaczy odczytac dane… lub wrecz analizator obrazu z kamerka

    Odpowiedz
    • @bimki: myślę, że byłoby o wiele trudniej,
      analizator potrafi zebrać DUŻO próbek i ładnie je pokazać,
      potrafi też czysty sygnał zebrać z nadajnika,
      odbiornik mnóstwo szumów łapie i w tej sieczce trudniej byłoby się połapać,
      oczywiście dałoby się, ale tak było łatwiej
      poza tym ja akurat jestem na etapie poznawania tego wszystkiego i takie doświadczenie z analizatorem jest dla mnie cenne

      pozdrawiam
      Jacek Szpyrka

      Odpowiedz
  • Trzeba przyznać że jestem pod wrażeniem zdeterminowania w dążeniu do celu. Dobrze, że nie zaufałeś w to co Ci napisał producent. Jak widać, na pomoc producenta często nie ma co liczyć bo albo sami nie wiedzą, albo celowo nie chcą powiedzieć, sam ostatnio kupiłem dekoder dvb-t który powinien odtwarzać napisy, a nie odtwarza, napisałem do producenta i pewnie na odpowiedzi się nie doczekam.

    Ile taka przeróbka Cię kosztowała? Długo czasu na to poświęciłeś?

    Pozdrawiam!

    Odpowiedz
  • a ja mam pomysł o czym mogą mówić pierwsze 4 bity (odczytana wartość 9) może to podzielony przez 10 wskaźnik naładowania baterii w nadajniku, ów stacja ma ikonkę rozładowania baterii nadajnika sondy, ale to takie tam dywagacje:)

    Odpowiedz
  • Gratuluję determinacji, jednak mam wrażenie, że to daremny wysiłek. Jak już ktoś wspomniał chyba lepiej było by zrobić własną stację pogodową. Ale co kto lubi.
    Słówko na temat pasma 433 MHz: podobnież jest to pasmo krótkofalarskie i wykorzystanie tego typu urządzeń jest nie do końca legalne. A co do tych tanich odbiorniczków – te superreakcyjne odbiorniki są nie tylko mało niezawodne ale też emitują zaklócenia.

    Odpowiedz
  • Super artykul. Kochani, blagam, nie wstawiajcie usmieszkow. To strasznie meczy oczy. Zwlasza w tresci artykulu. Nie mowiac o recenzjach. Na elektrodzie ich nie zobaczycie. Tak jest najwygodniej.

    Odpowiedz
  • Witam!
    Domyślam się że gotowy kod podany jest dla Arduino lecz niestety nie posiadam tego ale czy można ten kod wstawić jako gotowy hex ale w wersji dla Attiny2313 i pytanie czy zmieścił by się w tym procesorze ??

    Pozdrawiam

    P.S. bardzo ciekawy artykuł :)

    Odpowiedz
  • Świetny artykuł!
    Jakiś czas temu zakupiłem prosty termometr z biedronki z zaokienną, bezprzewodową sondą. No i właśnie od jakiegoś czasu zastanawiam się jak się dobrać do tego sygnału by wprowadzić go do komputera. Teraz już wiem jak podejść do tematu ;) Myślę, że będę obserwował na bieżąco.

    pozdrawiam

    Ps. Piszesz o problemach z zasięgiem, czy w oryginale (czyli zestaw baza + sonda) zasięg też jest tak mały? (1m), czy uwidacznia się to tylko w modelu Twój odbiornik + fabryczna sonda z zestawu?

    Odpowiedz
      • Przeczytałem artykuł na Twojej stronie, gdyż mam tą samą stację z Biedronki. U mnie sprawa jest jakby odwrotna:) Mianowicie sonda mi się uszkodziła i chciał bym wysyłać temperaturę stacji. Mam trochę różnych czujników w domu i szkoda by było wyrzucać tę stację. Nie wiesz jak można by za pomocą kodu arduino wysłać temperaturę do stacji? Przerobiłem nieco ten kod do wysyłania z artykułu wg. protokołu Ariol(ktoś w komentarzach u Ciebie napisał), ale niestety nie chce działać.

        Odpowiedz
      • UPDATE – udało się:) Jakoś obliczyłem sobie wartości czasów impulsów z Twoich wykresów i mogę wysyłać temperaturę na tę stację:) Jednak protokół auriol jest nieco inny.

        Odpowiedz
      • No i jeszcze informacja jak by ktoś szukał. Temperatura jest tam zapisana w postaci signed binary i zajmuje 12 bitów, a jest w kodzie uzupełnień do dwóch.

        Odpowiedz
  • Cześć,
    Zmień odbiornik.
    Ten ma fatalny filtr i łapie dużo śmieci. Zrobiłem reverse engineering podobnej stacji ale z wykorzystaniem STM32F103x. Polecam odbiornik ZZ-RS10-433MHz (19pln).
    Do pomiaru czasu pomiędzy impulsami używaj funkcjonalności capture timera ustawionego na wyzwalanie narastającym zboczem, to hardware zrobi za ciebie cały pomiar a tobie pozostanie tylko interpretacja długości impuslów.

    Odpowiedz
  • Witam , jeśli chodzi o długość kawałka drutu jako antenę – 165 mm i będzie o wiele lepiej z zasięgiem i czułością (to dokładnie półfalowa antenka) – bardzo rzeczowy projekt – pozdrawiam

    Odpowiedz
  • Przydatne informacje, szczególnie na temat wilgotności te parametry. Warto to analizować. Taki poziom wilgotności w mieszkaniu jest bardzo istotny, tak samo jak temperatura.

    Odpowiedz

Odpowiedz

anuluj

Odczyt bezprzewodowej sondy temperatury i wilgotności

Nie przegap nowych projektów!

Zapisując się na nasz Newsletter będziesz miał pewność, że nie przegapisz żadnego nowego projektu opublikowanego w Majsterkowie!

Od teraz nie przegapisz żadnego projektu!

Masz uwagi?