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