Dzisiaj uruchamiamy najnowsze Arduino R4 WiFi wraz z nakładką Data Logger Shield, która pozwala wygodnie zapisywać dane na kartę SD. Najpierw uruchomimy najprostszys zapis do pliku na karcie, a potem spróbujemy go rozbudować i wykonamy prosty termometr na bazie DHT11 wraz z historią pomiarów w pliku.
Adafruit Data Logger Shield
Do tematu użyłem nakładki DataLogger produkcji Adafruit. Kupiłem ją w Chinach za około 10 zł, ale w naszym kraju też ją można dostać za odpowiednio większą cenę:
Karta SD nie jest dostępna w zestawie!
Sam shield oferuje nieco więcej niż slot na kartę SD. Mamy tutaj:
- DS1307 wraz z osprzętem i slotem na bateryjkę CR1220 (ale R4 ma już RTC na pokładzie, więc nie wiem, czy nam się to w dużym stopniu przyda)
- przestrzeń prototypową do wykorzystania wedle uznania
- wyprowadzony przycisk RESET
- stabilizator napięcia 3.3V wraz z buforem dla karty SD
- diody LED L1 i L2 które możemy podpiąć do wybranego GPIO
Szczegółową dokumentację płytki, wersja C, udostępnia Adafruit:
Dostępna jest też starsza wersja, wersja B:
W praktyce shield prezentuje się tak:
Oczywiście pasuje na R4:
Prosty przykład zapisu na kartę SD
Przykładowy kod od Adafruit wymaga uruchomienia też RTC, z tego też powodu postanowiłem go dla Was uprościć. Poniżej umieszczam moją wersję sketchu:
Kod: C / C++
Do zapisu na kartę SD potrzeba załączyć nagłówek SD.h. Następnie tworzymy obiekt klasy File. W setup uruchamiamy kartę SD poprzez:
Kod: C / C++
a następniemy dobieramy nazwę naszego pliku z logiem, gdyż nie chcemy nadpisywać poprzednich logów:
Kod: C / C++
W pętli kolejno badamy kolejne nazwy plików, LOGGER00.CSV, LOGGER01.CSV i tak dalej. Dopóki dana nazwa istnieje, to ją pomijamy. W przeciwnym razie tworzymy plik o takiej nazwie i przerywamy pętlę.
Potem wystarczy tylko wykonywać do niego zapis w głównej pętli:
Kod: C / C++
Tu, dla przykładu, zapisuję licznik pętli (moja zmienna g_loops) oraz wartość bieżącego czasu z funkcji milis().
Wsad bez problemu się kompiluje na R4, wgrywamy:
Sprawdziłem działanie sketchu. Po chwili wyjąłem kartę SD, by się przekonać, czy coś się zapisało:
Sukces - dane są poprawnie zapisywane na kartę:
Czyli podstawa działa, ale pora uruchomić zegar.
RTC z Arduino R4
Arduino R4 posiada wbudowany zegar RTC, który możemy łatwo uruchomić kilkoma linijkami kodu:
https://docs.arduino.cc/tutorials/uno-r4-minima/rtc
Kod: C / C++
Odpalmy na próbę powyższy kod:
Wszystko działa, bez zarzutów.
Konfiguracja czasu RTC z poziomu UART
Poprzedni przykład ma startową datę wpisaną na sztywno. Trzeba go zmodyfikować tak, aby można ją było wysłać przez UART. Tym razem zrobimy prostą wersję, bez sumy kontrolnej, bez weryfikacji przesyłanych danych.
Załóżmy, że wysyłamy datę w formacie:
2023-08-14-15:37
Po niej następnuje znak następnej linii. Najpierw wczytajmy całość do obiektu klasy string:
Kod: C / C++
A potem wczytamy z niej dane:
Kod: C / C++
Odpuściłem sobie poprawne ustawienie dnia tygodnia oraz konfiguracji SaveLight. Mimo to, powyższa metoda powinna zapewnić nam możliwość ustawienia bieżącego czasu i daty przez terminal. Sprawdźmy:
Działa! Zatem konfigurację czasu już mamy, teraz pora znaleźć jakiś czujnik...
Uruchamiamy DHT11
Teraz uruchomimy popularny czujnik temperatury i wilgotności DHT11.
DHT11 można kupić już za jedyne 2 zł:
DHT11 wystarczy podłączyć do Arduino. Mamy trzy piny - zasilanie, masa i sygnał:
Podłączony do czwartego pinu:
Teraz potrzebna będzie biblioteka. Nie ma jej wbudowanej. Trzeba coś pobrać z Githuba. Wybrałem:
https://github.com/adidax/dht11
Pobrałem zipa, a potem dodałemgo przez Sketch->Include Library->Add .zip library
Oto przykładowy sketch z dokumentacji tej biblioteki:
Kod: C / C++
Odpalamy i... działa! Działa też na R4, super:
Z ciekawości rzuciłem okiem do źródeł tej biblioteki:
https://github.com/adidax/dht11/blob/master/dht11.cpp
Kod był pisany bardzo dawno temu, ale korzysta tylko z Arduino API, więc i tak działa na nowej platformie. Nikt nic nie musiał portować.
Łączymy wszystko w całość...
Teraz możemy połączyć nasze trzy omawiane przykłady w jeden, funkcjonalny logger:
- do demka karty SD podpinamy zegar RTC wraz z możliwością ustawienia czasu
- do demka karty SD podpinamy kod obsługi DHT11
- dopisujemy samodzielnie wydruk zmiennych do UART oraz do pliku CSV:
Pełny kod:
Kod: C / C++
Odpalamy. Tak wygląda bez skonfigurowanego czasu:
Teraz wysyłamy:
2023-08-14-15:37
by ustawić datę i czas.
Działa, chociaż jeszcze przydałoby się poprawić zamianę miesiąca (liczenie od 0 vs od 1):
Jeszcze sprawdźmy zawartość karty SD:
Końcowe uwagi i poprawki
Kod korzysta z RTC od Arduino R4, więc musimy podłączyć bateryjkę do podtrzymania go w razie zaniku normalnego zasilania:
Kod wysyłania danych na UART/kartę SD nie zawiera poprawki dopisującej zero przed pojedynczą liczbą minut i godzin, można to łatwo dopisać.
Można by też to ładniej zorganizować, formatować tekst raz do bufora a potem go drukować i na UART, i do pliku.
Podsumowanie
Adafruit Data Logger shield przetrwało próbę czasu i okazało się być bezproblemowe do użycia z Arduino R4 WiFi. Dodatkowo też pozytywnie zaskoczyła mnie biblioteka od sensora DHT11, która mimo iż nie była aktualizowana od lat, to jest napisana tak, że i tak z R4 (jak i z innymi platformami) działa. Prosty logger temperatury do karty SD udało się w pełni bezproblematycznie uruchomić.
Jedyne co mogę jeszcze dodać, że projekt wymaga podpięcia bateryjki do zasilania RTC od R4 a shield niestety zasłania te piny, ale na szczęście można dolutować się do nich od spodu PCB, więc zasadniczo nie ma problemu.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.
