Data Logger Shield

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

Další podobné články