Blog (30)
Komentarze (1.1k)
Recenzje (0)
@KaworuDIY — stacja meteo

DIY — stacja meteo

Najwyraźniej jestem zbyt leniwym człowiekiem aby wystawić za okno termometr i sprawdzać co aktualnie się na nim znajduje, dlatego też zbudowałem sobie parę lat temu, taką oto termometrynkę:

541861

Stara wersja z bluetooth

Zbudowana z kilku powodów, chęci znania aktualnej temperatury za oknem, temperatury wnętrza, kaloryferów, ścian, ciśnienia i wilgotności. Wszystko wraz z modułem BT aby dane przesyłać, i zapisywać w db, a tak, bo lubię. Z wilgotności nic nie wyszło, gdyż układ Si7005 jest po prostu idiotycznie IMO zaprojektowany. Pracując na I2C posiada pin Chip Select, który w dodatku na modułach z HopeRF nie jest wyprowadzony, w efekcie jeśli na szynie I2C jest poza nim inne urządzenie - całość nie będzie działać, jeśli Si ma zasilanie. Całość zbudowana na moim ukochanym AVRze, ATmega8A z małym dodatkiem AS1106 (to odpowiednik MAX7219, z tym że potrafi działać na 3v3), czujnikami temperatury (jak zawsze) DS18B20 i BMP085 za czujnik ciśnienia. Wszystko działa(ło) całkiem sprawnie, no z paroma wyjątkami: termometr zewnętrzny jest za blisko ścian, zimą pokazuje około 1‑2 stopnie za dużo, latem około 5. Jest osłonięty przed słońcem, ale z uwagi na bliskość parapetu, ciemnego w dodatku, pokazuje temperaturę lekko ogrzanego od niego powietrza. Bluetooth w Linuksie ma bugi, kiedy serwer nie może się połączyć z modułem, od czasu do czasu wywala cały serwer z kernel-panic. Dlatego, głównie z powodu problemów z BT, powstała wersja na ETH.

541864

Nowa wersja z ethernetem

Wpis nie jest "stricte" DIY, to bardziej raport z konstrukcji, takie przemyślenia, pomysły i rozwiązania, które się mogą przydać komuś, kto się babrze w takich rzeczach. Tymczasem pecyfikacja wersji 2.0 jest następująca: ATmega328p - jako główny chip, ENC28J60 - zabugowany kontroler Ethernetu, DS18B20 - jako czujnik temperatury, BMP185 - jako czujnik ciśnienia, BH1750 - czujnik poziomu oświetlenia, SHT21 - czujnik wilgotności względnej. Poza tym, w porównaniu do pierwszej wersji - brakuje wyświetlacza, BT, płytka nie jest dwuwarstwowa. I oczywiście nie ma schematu, po co komu schematy, genialny umysł ogarnia bez schematów. :D

541867

Wszystkie czujniki są cyfrowe, DS18B20 podłączony jest przez OneWire, reszta przez I2C. Projekt uwzględnia także dwa wejścia analogowe, ale w praktyce pozostały niewykorzystane. A, i jest także wyjście na wentylator wraz z czujnikiem obrotów. Do zasilania wykorzystane standardowe złącze 2,1/5,5mm. Wedle założenia na płytce powinno go nie być, ale niestety moduły z ENC28J60 nie uwzględniają opcji zasilania przez ethernet, dlatego potrzeba zewnętrznego rozdzielacza. Jak mi się będzie chciało robić wersje 2‑warstowową, to na drugiej stronie PCB spokojnie wciśnie się kontroler eth, wtedy moduł z nim staje się zbędny i można spokojnie zrobić PoE bez rozdzielacza. Ale to przewidziane jest na v4, w v3 za to dodany będzie czujnik wyładowań atmosferycznych, AS3935. Idealny nie jest, głównie ze względu na 70% skuteczność w ich wykrywaniu z większych odległości (oraz wymóg zaprojektowania anteny dla 500kHz/Q15), ale za to potrafi obliczyć ich energię i odległość od stacji, ot będzie kolejny bajer. (I może jeszcze ultradźwiękowy pomiar siły i kierunku wiatru). Układ zasila impulsowy stabilizator napięcia LM2594, w prototypie zapakowany był LDO, ale jak zwykle okazało się to złym pomysłem, grzał się straszliwie. W końcu 12V sprowadzone do 3v3 daje 1,3W ciepła na ~4mm2. Wszystkie czujniki kupione w postaci modułów, moduły są fajne bo mają wyprowadzenia w rastrze 2,54mm - znaczy takie, które przylutuje przeciętny orangutan. Moduły są też złe, bo często (jak nie prawie zawsze) zawierają rezystory podciągające magistralę I2C do VDD, to jest złe, bo jeśli tych modułów podłączymy kilka, jak w tym wypadku, to przeciążymy prądowo albo czujniki albo kontroler. Dlatego te rezystory trzeba zlokalizować i dokonać ich eksterminacji. Jeśli kogoś to interesuje, to projekt górnej warstwy płytki można sobie dopaść w tym PDFie, to jest lustrzane odbicie górnej warstwy, jedynej warstwy. Także tylko wydrukować, przyprasować i do trawienia.

Oprogramowanie bazuje na projekcie avr-net, napisanym przez Paweła Lebiode, jestem zbyt leniwy aby napisać całkiem własne. Wniosłem jeno pare poprawek do sterownika ethernetu, dzięki czemu przestał się zawieszać po paru pingach, dodałem sterowniki urządzeń i własny protokół komunikacji. Całość działa po UDP/IP, jest bezstanowa, więc w sumie wiele urządzeń z czujnikami może rozmawiać (w planach wyświetlacz z eth). Generalnie jak Linux, zlepek różnych rzeczy, nie zawsze najpiękniejszy ale działa stabilnie i spełnia swoją funkcję. Ah i to jest soft napisany bez projektu na kolanie, tak aby najszybciej zaczął działać, nie jest najcudowniejsza rzeczą jaką można napisać, w wielu miejscach da się zrobić lepiej. Ale z drugiej strony działa, działa, działa... nie ruszaj jak działa. Poza tym:

Size after:
AVR Memory Usage
----------------
Device: atmega328p

Program:   14564 bytes (44.4% Full)
(.text + .data + .bootloader)

Data:       1740 bytes (85.0% Full)
(.data + .bss + .noinit)

Spokojnie mieści się w kontrolerze i ma jeszcze duuużo miejsca na nowe zabawki (jak kod chipu detekcji wyładowań). Ale w zasadzie nie tyle pamięć flash kontrolera jest problemem co pamięć SRAM, mało. Trzeba tam upchnąć dane, bufory ramek, i wszyyystko. Dlatego największym pakietem jaki może odebrać ten sprzęt jest 512B. Ale w sumie, 0,5kiB wystarczy nawet aby DHCP obsługiwać, a pakiety z danymi z czujników mieszczą się w ~130B, mniej wiecej, ich rozmiar zależy co się w nich upchnie.

541872

Układ przy pierwszym starcie losuje sobie adres MAC (wykorzystując watchdoga) i zapisuje sobie w EEPROMIE na później, każdy czujnik posiada swój 64bitowy adres, pozwalający go jednoznacznie zidentyfikować, w wypadku czujników I2C ten adres to 48bit adresu MAC + 16bit arbitralnie przypisanej liczby (+ typ). W wypadku DS18B20 to po prostu cały ich numer seryjny wraz z sumą kontrolną, jeśli czujnik temperatury przepnie się z jednego urządzenia do innego, to będzie w nim widniał pod identycznym adresem. Wszystkie obliczenia wykonywanie są jeno w arytmetyce całoliczbowej. Wysyłane są wartości uśrednione z 8 ostatnich odczytów, odczyny są wykonywane co około 10s, także dane, które odczytuje aplikacja:

541874

To w praktyce uśrednione wartości z ostatnich 80s.

541876

Poza tym windowsowa wersja pozwala na konfigurację protokołu IP urządzenia, a dostanie także opcję aktualizacji firmware przez ethernet.

Obudowa

No ale to cudo ma pracować na zewnątrz, czasem w ciężkich warunkach pogodowych (jak ostatnie wichury), trzeba je jakoś osłonić od: wiatru, śniegu, deszczu, słońca... a jednocześnie zapewniać względnie swobodny przepływ powietrza. Rozwiązaniem są - podstawki pod doniczki. Są prawie idealne, lepsze by były tylko jakby miały dłuższe brzegi nachylone bardziej pod kątem 45 stopni, ale i tak jest nieźle. Sprawiają początkowo pewne problemy (głównie przepuszczają światło), ale nic z czym nie dało by sobie poradzić.

Kupujemy zestaw podstawek, odpowiadającego nam rozmiaru, w dowolnym kolorze, byle tylko ich brzegi po odwróceniu nie wyglądały jak rynienki. Jeśli jak moje przepuszczają światło (a co za tym idzie i podczerwień), malujemy je na czarno, czy generalnie w dowolnym kolorze. Biała farba jak się niestety okazało kryje dobrze, ale słabo zmniejsza ilość promieniowania wpadającego do środka, przynajmniej moja. Jak już je pomalujemy na dowolny kolor (od spodu, od góry nie trzeba) to czekamy aż wyschnie.

541881

Jak już wyschnie, i upewnimy się, że nigdzie nie przepuszcza światła - malujemy ponownie, tym razem koniecznie na biało. Czarny podkład skutecznie mi zablokował przebijające się światło, a białe wykończenie skutecznie chroni przed grzaniem się od słońca.

541883

Idealnie na biało musi być pomalowana tylko pokrywka, która będzie na samej górze, reszta potrzebuje tylko białych brzegów. Jak już wszystko wyschnie, to bierzemy wiertarę. Jeśli mamy 120mm (albo i nawet dłuższe) śruby, to potrzebujemy 3 otwory, w każdej podstawce. Jeśli takich śrub nie mamy (ja nie mam) to robimy ich 6. Potem odkładamy 4 podstawi na bok, a w reszcie wycinamy środek, tak aby się nam PCB stacji zmieściła do środka:

541885

Wszystkie otwory można równie dobrze wykonać przed jak i po malowaniu. Dwie podstawki na górze będą lepiej chronić przed słońcem, dwie na dole stanowią podstawę i powinny być wycięte tak aby dostosować obudowę do zamontowania na czymkolwiek na czym ma być zamontowana. Dlaczego dwie na dole? Bo sztywność. Moja wersja pozwala na zamontowanie na szczycie rury za pomocą śruby używanej do mocowania rzeczy na płytach gipsowo-kartonowych. Na ostatniej warstwie (nie będącej jeszcze podstawą montujemy 40mm wentylator).

541887

Po co wentylator... z kilku powodów, głównie dlatego że ENC28J60 się trochę grzeje, z doświadczeń wynika, że podnosi temperaturę w swojej okolicy o około 1‑3 stopni (przy 21 stopniowej okolicy). Projekt tego nie uwzględnił, a prawie wszystkie czujniki znajdują się w górnej części obudowy. Poza tym powinien wymusić obieg powietrza kiedy jest goraco i "powietrze stoi" (albo gdyby obudowa jednak tak dobrze nie izolowała od słońca), nie wiem na ile ten aspekt ma znaczenie, ale nie zaszkodzi go wyeliminować przy okazji. Czujnik oświetlenia oryginalnie też był zamontowany na górze, bo proste założenie - znając różnicę natężenia oświetlenia między wnętrzem obudowy a światem zewnętrznym, będzie ona stała si? Więc poznanie ile lx jest wewnątrz pozwala ustalić przez proste mnożenie ile jest na zewnątrz. I jak to zwykle bywa, tak, ale nie. Nie doceniłem jak dobrze odizolowałem obudowę od światła, a zrobiłem to na tyle skutecznie, że wewnątrz, przy oświetlonym bezpośrednim światłem słonecznym świecie, ilość światła wynosiła około 10lx. Dlatego czujnik oświetlenia wylądował na dole obudowy, za otworami wentylacyjnymi i mierzy ilość światła odbitego od otoczenia. Proste mnożenie pozwala ustalić natężenie promieniowania słońca, a proste dzielenie (przez 685) liczbę W/m2. Nie doceniłem jednak zimy, a właściwie jakoś nie wpadło mi do głowy, że będzie śnieg, a ten odbija całkiem sporo więcej światła niż świat normalnie. Innymi słowy, czujnik oświetlenia powinien być na górze (i mierzyć bezpośrednio ilość światła), tylko wtedy znów pojawia się problem śniegu, w innej formie - zasypującego czujnik. Swoją drogą z czujnika RH i temperatury wyznaczamy punkt rosy i wilgotność bezwzględną.

Całość, zmontowana, uruchomiona i działająca poprawnie od jakiegoś czasu wygląda tak:

541890

A jakby kogoś interesowały całkowicie niedokładne, historyczne (bądź aktualne) dane meteo dotyczące Katowic, to strona www dla w/w:

541892
541893

Także... parę lat knucia, kombinowania, eksperymentów i "o jeżu nie chce mi się", i tadaaah.

PS, "anegdotka-time": kilka lat temu zrobiłem LEDowe oświetlenie w kuchni, takie co ma czujnik pasywnej podczerwieni (włącza się tylko jak ktoś jest w kuchni) i czujnik zewnętrznego oświetlenia (także musi być jeszcze na zewnątrz odpowiednio ciemno), pierwszym komentarzem przyjaciółki (Rynn) na moją realizację było: "a normalni ludzie po prostu używają włącznika".

Wybrane dla Ciebie
Komentarze (62)