Początki z Arduino, czyli własna stacja pogodowa

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.

Gotowy prototyp

Gotowy prototyp

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.

1
2
3
4
5
6
Serial.print(F("Initializing SD card..."));
if (!SD.begin(CS_PIN)) {
    Serial.println(F(" failed, or not present."));
    while (1);
}
Serial.println(F(" card initialized."));

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.

1
2
3
4
if(!RTC.isrunning()) {
    Serial.println(F("RTC is NOT running!"));
    RTC.adjust(DateTime(__DATE__,__TIME__));
}

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ć.

Przykładowy render, pomarańczowe znaczniki określają właściwe punkty pomiaru.

Przykładowy render, pomarańczowe znaczniki określają właściwe punkty pomiaru.

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.