Data logger shield je přídavný modul pro Arduino, který obsahuje slot na SD paměťové karty, obvod reálného času DS1307 a velké pole prokovených otvorů. Jak tedy vyplývá z jeho názvu, hodí se do projektů, kde by jsme rádi snímali měnící se analogové či digitální hodnoty z různých senzorů a tyto hodnoty ukládali na SD kartu pro budoucí vyhodnocení s časem měření. A pokud vložíme baterii CR1220 do připraveného slotu, máme zároveň zajištěno, že v případě výpadku napájení nepřijdeme o nastavený čas. Pole prokovených otvorů pak slouží právě pro zapájení například dalších měřících modulů či senzorů či zobrazovacích prvků.
Pro úspěšné propojení s Arduinem pak stačí tento Data logger shield jednoduše připojit do kompatibilní Arduino desky, tedy například Uno či Leonardo. Avšak je nutné dodržet zvolený pin CS v programu, protože je na shieldu pevně zapojen právě na pin D10.
Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu RTClib, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení knihoven a dále vytvoření instance DS1307 z knihovny RTClib. Jako další se zde nachází nastavení pinu pro CS pin SD karty, který však nelze měnit a po něm pro ukázku analogový pin A0 pro demonstraci měření ze senzoru. Poté je ještě vytvořeno pole se seznamem dní v týdnu. V podprogramu setup se jako první nachází nastavení komunikace po sériové lince a dále kontrola připojení a spuštění obvodu reálného času. Po nich je ještě zkontrolována přítomnost paměťové karty typu SD a na konci podprogramu je uveden příkaz pro první nastavení času. Je tedy nutné poprvé nastavit aktuální čas, nahrát program do Arduino desky a následně tento řádek zakomentovat, abychom si čas znovu nepřepsali. V nekonečné smyčce loop se pak nachází načtení aktuálního času a data do proměnné a poté vypsání těchto údajů po sériové lince. Po výpisu pak obdobným způsobem vytvoříme a zapíšeme do stringu dataString údaje o analogové hodnotě z nastaveného pinu společně s časovým údajem. Po vytvoření zprávy pak otevřeme soubor „mereni.txt“ na SD kartě (v případě, že neexistuje, je soubor vytvořen) a po jeho kontrole do něj zapíšeme připravený dataString. Po zápisu už jen soubor uzavřeme a vyčkáme 5000 ms do dalšího měření a zápisu. Soubor je uzavřen kvůli té skutečnosti, že není možné zapisovat do více souborů najednou, je tedy nutné vždy otevřít pouze jeden soubor, pracovat s ním a poté ho uzavřít. V případě, že se nám nepovede otevřít uvedený soubor na kartě, vypíšeme po sériové lince varovnou zprávu.
// Data Logger Shield // Hodiny reálného času DS1307 + čtečka SD karet // připojení knihoven #include <Wire.h> #include <SPI.h> #include <SD.h> #include "RTClib.h" // vytvoření instance DS1307 z knihovny RTClib RTC_DS1307 DS1307; // nastavení pinu CS pro SD kartu - pevně dané shieldem // a pinu pro čtení analogové hodnoty const int sd_CS = 10; const int analogPin = A0; // vytvoření pole seznamDni s názvy jednotlivých dní char seznamDni[7][8] = {"nedele", "pondeli", "utery", "streda", "ctvrtek", "patek", "sobota"}; void setup () { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); // kontrola připojeného obvodu reálného času if (! DS1307.begin()) { Serial.println("Hodiny nejsou pripojeny!"); while (1); } // kontrolu spuštění obvodu reálného času if (! DS1307.isrunning()) { Serial.println("Hodiny nejsou spusteny! Spoustim nyni.."); } // kontrola připojené SD karty if (!SD.begin(sd_CS)) { Serial.println("SD karta neni pripojena nebo je vadna!"); return; } // pro nastavení času v obvodu reálného času použijte jednorázově(!) // následující příkaz v pořadí rok, měsíc, den, hodina, minuta, vteřina // příklad: 20.9.2016 9:10:11 DS1307.adjust(DateTime(2016, 9, 20, 9, 10, 11)); } void loop () { // načtení aktuálního času a data do proměnné datumCas DateTime datumCas = DS1307.now(); // vypsání informací o aktuálním času a datu po sériové lince Serial.print("Aktualni cas "); Serial.print(datumCas.hour()); Serial.print(':'); Serial.print(datumCas.minute()); Serial.print(':'); Serial.print(datumCas.second()); Serial.print(", "); Serial.print(seznamDni[datumCas.dayOfTheWeek()]); Serial.print(" "); Serial.print(datumCas.day()); Serial.print('.'); Serial.print(datumCas.month()); Serial.print('.'); Serial.print(datumCas.year()); Serial.println(); // vytvoření proměnné dataString pro uložení // zprávy, která bude zapsána na SD kartu String dataString = "Analog pin: "; // načtení analogové hodnoty z nastaveného pinu int sensor = analogRead(analogPin); // připsání hodnoty z pinu do zprávy dataString dataString += String(sensor); dataString += ", cas: "; // připsání aktuálního času do zprávy dataString, // jako oddělovač slouží + dataString += String(datumCas.hour()) + ":" + String(datumCas.minute()) + ":" + String(datumCas.second()); // otevření souboru na SD kartě s názvem mereni.txt File zapisDat = SD.open("mereni.txt", FILE_WRITE); // v případě, že je soubor bez problémů vytvořen (pokud neexistuje), // nebo otevřen (pokud existuje), zapiš do něj dataString a ukonči zápis if (zapisDat) { zapisDat.println(dataString); zapisDat.close(); Serial.println("Zapis na kartu uspesny."); } // v případě chyby při otevírání souboru vypiš chybu else { Serial.println("Chyba pri otevreni souboru mereni.txt !"); } // pauza mezi výpisy delay(5000); }
Po nahrání programu do Arduino desky dostaneme například tento výpis ze souboru "mereni.txt":
Analog pin: 342, cas: 9:10:11 Analog pin: 203, cas: 9:10:16 Analog pin: 201, cas: 9:10:21 Analog pin: 197, cas: 9:10:26 Analog pin: 195, cas: 9:10:31 Analog pin: 194, cas: 9:10:36 Analog pin: 192, cas: 9:10:41 Analog pin: 188, cas: 9:10:46 Analog pin: 187, cas: 9:10:51
Data logger shield pro Arduino je velice zajímavý základ do projektů, které se zabývají právě sběrem dat z různých senzorů a jejich uchováváním pro pozdější zpracování, v tomto případě ukládáním na SD kartu. Pro vlastní projekt tedy stačí pouze propojit Arduino desku s data logger shieldem, zapojit záložní baterii, paměťovou kartu, vlastní senzor a máme hotový šikovný sběrač dat.
Seznam použitých komponent:
http://dratek.cz/arduino/908-arduino-data-logger-shield-1420987444.html
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html