#2 Logger temperatury [Arduino + czytnik microSD + DS18B20]
W poprzednim artykule dowiedzieliśmy się jak korzystać z DS18B20 i odczytywać z niego temperaturę. W tym artykule postaram się przedstawić Wam proces zapisywania tych danych na karcie microSD, a następnie zmontujemy wszystko w całość i zamkniemy w obudowie tak, aby nasza stacja mogła nam służyć.
Obsługa karty MicroSD
Przy zapisywaniu danych na naszym nośniku przydadzą nam się dwie rzeczy. Jedna dotyczy oprogramowania, a druga kwestii elektroniki. Jest to: biblioteka SD (nie musimy jej pobierać – jest domyślnie wgrana) oraz moduł czytnika microSD wraz ze stabilizatorem napięcia oraz buforem.
Zacznijmy od połączenia całości. Komunikacja z kartami pamięci odbywa się za pomocą magistrali SPI. Stwierdziłem, że najłatwiej będzie jak przygotuję zgrabną tabelkę, w której przedstawię wszystkie informacje:
GND | Podłączamy do GND w Arduino |
VCC | Podłączamy do +5V w Arduino |
MISO | Dane wyjściowe magistrali SPI. Pin 12 |
MOSI | Dane wejściowe magistrali SPI. Pin 11 |
SCK | Linia zegarowa. Pin 13 |
CS | Wybór urządzenia. Pin 10 |
Jeżeli podłączyłeś już wszystko według powyższej tabelki możesz przejść do kolejnego etapu – programowania.
Programowanie
Tak jak już przed chwilą wspomniałem podczas programowania skorzystamy z wgranej domyślnie biblioteki SD. Wystarczy tylko wspomnieć o niej na początku kodu.
Zaczniemy od przetestowania całego układu – wgramy poniższy sketch, który utworzy plik tekstowy i wypisze do niego “Odczyt testowy”.
#include <SPI.h> #include <SD.h> File plik; void setup() { SD.begin(4); plik = SD.open("test.txt", FILE_WRITE); plik.println("Odczyt testowy"); plik.close(); } void loop() { }
Sprawdź czy wszystko poszło dobrze i jeżeli rzeczywiście na karcie znajduje się plik test.txt wraz z odpowiednią zawartością przejdź do dalszego etapu.
Zapisywanie odczytów z termometru
Umiemy już obsługiwać i kartę microSD i termometr DS18B20, nie pozostało nam więc nic innego jak połączyć obydwie umiejętności i stworzyć prosty logger temperatury dzięki któremu sprawdzimy jak zmieniały się odczyty na osi czasu.
Zadanie jest banalnie proste – wystarczy połączyć oba programy i układy. Końcowy kod będzie wyglądał tak jak poniżej natomiast jeśli chodzi o układ to myślę, że każdy da sobie radę.
#include <OneWire.h> // dodajemy potrzebne biblioteki #include <DS18B20.h> #include <SPI.h> #include <SD.h> File plik; float temperature; byte address[8] = {0x28, 0xAB, 0xAF, 0x1E, 0x0, 0x0, 0x80, 0x47}; // podajemy odczytany wcześniej adres #define ONEWIRE_PIN 2 // definiujemy pin do które podłączony jest czujnik, w naszym wypadku pin 2 OneWire onewire(ONEWIRE_PIN); DS18B20 sensors(&onewire); void setup() { sensors.begin(); // uruchamiamy sensor sensors.request(address); SD.begin(10); //ustawiamy pin CS na 10 plik = SD.open("odczyty.txt", FILE_WRITE); } void loop() { if (sensors.available()) { temperature = sensors.readTemperature(address); // odczytujemy temperaturę sensors.request(address); delay(50); } plik.print(temperature); // wpisujemy odczyt do pliku plik.println(" 'C"); // dodajemy znak 'C plik.close(); // zamykamy plik (bardzo ważne!) delay(20000); // czekamy 20s }
Tak w moim przypadku prezentuje się całe zmontowane urządzenie.
To już koniec tego króciutkiego poradnika. Chciałbym jeszcze przypomnieć, że jest to przykład zastosowania kart microSD w połączeniu z czujnikami i myślę, że warto zainteresować się połączeniem większej ilości urządzeń i stworzeniu prawdziwej bazy informacji, np. poprzez dodanie innych czujników, takich jak barometr, higrometr itd.