Chciałbym Wam przedstawić mój nowy projekt zrobiony z okazji zakupu pierwszego Arduino, a mianowicie prostą do bólu stację logującą temperaturę z czujnika DS18b20 do pliku oraz dalszą możliwość obróbki takiego pliku w celu ciekawej reprezentacji.
Stacja składa się z:
- Arduino Pro Mini, lub dowolnej innej wersji — np. chińskiej
- DS18b20 — właściwy termometr
- DS1307 — RTC używany do dokładniejszego pomiaru czasu
- Dowolna karta SD/microSD
Szczegółów wykonania urządzenia opisywać nie będę, nie jest ono zbyt skomplikowane.
Program
Do napisania programu użyłem gotowych bibliotek dostępnych w repozytorium Arduino:
- OneWire oraz DallasTemperature do obsługi DS18b20
- RTClib dla DS1307
Kod źródłowy projektu dostępny jest tutaj.
Bazując na wersji działającej w momencie publikacji tego posta opiszę pokrótce działanie kodu.
|
|
Przed właściwym startem mikrokontroler inicjalizuje kartę pamięci, a w przypadku błędu komunikacji lub braku karty program wchodzi w pętlę nieskończoną aby zapobiec nieprawidłowemu działaniu reszty kodu.
|
|
W przypadku gdy RTC nie był wcześniej uruchomiony i skonfigurowany — na przykład po całkowitym braku zasilania zegar ustawiony zostaje na datę kompilacji kodu. Metoda ta jest wystarczająca do naszego zastosowania i nie wymaga żadnej komunikacji z działającym urządzeniem.
Następnie kod uruchamia i konfiguruje sensor DS18b20 i zaczyna w pętli zczytywać pomiary do pliku CSV z jednominutowymi odstępami. Tak, to całość zadania postawionego przed Arduino. Można by jeszcze dodać wyświetlanie temperatury na jakimś LCD, czy nawet wyświetlaczu segmentowym, a zamiast karty SD użyć transmisji radiowej na serwer, co umożliwiłoby nawet zbieranie danych z wielu lokacji, ale nie jest to celem tworzonego przeze mnie urządzenia.
Interpretacja danych
Stworzone urządzenie nie miałoby większego sensu, gdyby dane zostawić w formie pliku CSV. Co prawda pliki tego typu bez problemu zaimportujemy do dowolnego pakietu biurowego i możemy na ich podstawie generować różne magiczne sztuczki, ale jest to rozwiązanie mało praktyczne, gdyż wymagałoby powtarzania większości pracy co zgranie pliku z karty. Dlatego też napisałem bardzo toporny skrypt renderujący wykres graficzny.
Do jego użycia niezbędny będzie Python w wersji 3.x oraz biblioteki:
- NumPy
- SciPy
- Matplotlib
Kod skryptu zamieściłem wraz z kodem dla Arduino w repozytorium linkowanym wcześniej. Patrząc na poniższy rysunek można zauważyć, że dane są interpolowane w celu wyrysowania ładnych krzywych. Niedokładności powstałe w ten sposób są na tyle znikome, że możemy je zignorować.
Podsumowanie
Czujnik temperatury umiejscowiony bezpośrednio w urządzeniu, lub tak jak na prototypie na płytce stykowej nie ma większego sensu — chyba, że komuś zależy na pomiarze temperatury w domu. Dlatego w moim przypadku DS18b20 został przylutowany do cienkiego kabla koncentrycznego, a następnie zaizolowany rurkami termokurczliwymi i klejem na gorąco. Ten zaś zamocowałem w aluminiowej puszce na parapecie. Puszka chroni go przed błędami pomiaru spowodowanymi podmuchami wiatru, a przy okazji stanowi dodatkową warstwę zabezpieczenia przed wilgocią. Czujka została skonfigurowana do pracy w trybie pasożytniczym, przez co do jej podłączenia wystarczają dwa przewody (czy raczej oplot i przewód właściwy kabla koncentrycznego). Jak wspomniałem wcześniej istnieje wiele miejsc w których takie urządzenie mogło by być ulepszone, zaczynając od większej ilości podłączonych czujników, a kończąc na dodatkowych układach umożliwiających pobieranie innych danych, takich jak wilgotność czy prędkość i kierunek wiatru. Zachęcam każdego do budowy bardziej zaawansowanych wersji takiej stacji.