Občas si říkáte, že by se hodilo ukládat nějaké informace z Arduina (např. údaje ze senzorů a čidel) a následně je zpracovávat. Ale jak to udělat?
Nebo chcete vytvořit meteostatnici a využít v ní funkci Datalogger? Já vám nyní ukáži, jak si tu hlavní část Dataloggeru zbastlit pomocí modulu čtečky SD karet pro ukládání dat. Celý dnešní projekt se dá také jednoduše použít v ostatních Arduino projektech pro ukládání dat. Čtečku pro SD karty Najdeme často také na různých shieldech nebo displejích.
Zapojení modulu SD karty
Na začátek si osvěžíme trochu teorii. K celkové funkčnosti není třeba ji dokonale ovládat, ale je dobré rozumět tomu, na čem je to postavené a jak to funguje.
Modul čtečky SD karet je k řídící desce Arduino připojen pomocí sběrnice SPI. Ta vyžaduje celkem 4 signálové vodiče a napájení. Zapojíme tedy modul SD karty. Piny MISO, MOSI, SCK představují komunikační rozhraní SPI mezi Arduinem a modulem čtečky, CS je signál pro výběr obvodu. Napájení +5 V využijeme přímo z Arduino desky. Pokud použijete například jiné Arduino a nevíte, kde se na desce nachází SPI piny, podívejte se do dokumentace (datasheetu) Arduino desky.
Pro vlastní Datalogger potřebujeme tyto Arduino věcičky
- Řídící deska (například Arduino UNO Rev3)
- Modul čtečka Micro SD/SDHC karet nebo Modul čtečka SD karet
- Propojovací vodiče M/F
Poznámka: Schéma zapojení pro modul čtečky SD karet vychází ze stejného zapojení. Pozor, pro komunikaci v 5V logice musíte zajistit vhodnou konverzi napěťových úrovní na 3,3 V.
Příprava SD karty
Než se pustíme do psaní programu, musíme si SD kartu připravit. V našem případě to zahrnuje formátování. Vložte SD kartu do čtečky počítače a pot zobrazí, klikněte na ni pravým tlačítkem myši a pak dejte "Formátovat“. Klíčové při formátování je nastavit kolonku "Systém souborů“, kde musí být nastavené FAT nebo FAT32. Díky tomuto nastavení budeme moci použít knihovnu z Arduina IDE. Zaškrtněte položku rychlé formátování a do prázdné kolonky, která je na obrázku pojmenovaná jako "Jmenovka svazku“ si můžete nastavit název vaší karty.
Pozor! Formátováním zmizí všechny soubory a data, která na kartě byla uložena předtím.
Program pro SD kartu
Karta je nyní připravená, ale ještě jsou tu další věci, které musíme projít nebo brát v potaz.
1) V programu najdeme 2 knihovny ale obě jsou defaultně v Arduino IDE, tudíž je nemusíme hledat a stahovat.
2) Pin SS (Slave Select) musí být nastavený jako OUTPUT i když se nepoužívá.
3) Název souboru na SD kartě (v našem případě test.txt) nesmí obsahovat speciální znaky (vyvarujte se české diakritice a mezerám (použijte podtržítko)).
A když jsme u pojmenovávání souboru, je dobré vědět, že Arduino IDE knihovna používá 8.3 formát. To znamená, že název souboru může mít maximálně 8 znaků a přípona souboru maximálně 3 znaky.
Před samotným psaním programu si stanovíme, co bude program dělat.
Následující Arduino program má za úkol:
- Otestovat, zda je SD karta správně připojena a výsledek poslat po sériové lince do serial monitoru.
- Otevřít nebo případně vytvořit soubor „test.txt“.
- Pokud se soubor otevře, zapíše se do něj „dneska sviti slunce“ a soubor se zavře. Pokud se soubor neotevře, nebo zápis selže, dozvíme se to v serial monitoru.
- Poté se celý proces opakuje bez bodu 1 s tím, že se do souboru nic nezapisuje, ale ze souboru se čte.
Proč se soubor musí zavřít, když z něj chci hned znova číst? Není to zbytečné zdržování? Není. Je to z důvodu, že při každém zavření, se soubor také uloží.
Arduino program pak vypadá takto:
#include <SPI.h> #include <SD.h> File myFile; int const pinSS = 10; int const pinCS = 4; void setup() { // i když se pin nepoužívá, musí být definován jako výstup! pinMode(pinSS, OUTPUT); // začátek sériové komunikace Serial.begin(9600); Serial.print("inicializace SD karty..."); // pokud není karta dostupná, tak: if (!SD.begin(pinCS)) { Serial.println(" inicializace selhala!"); while (1); } Serial.println(" inicializace uspesna!"); // soubor, který chceme otevřít a psát do něj (FILE_WRITE) // se jmenuje test.txt (popřípadě vložte celou cestu k souboru) myFile = SD.open("test.txt", FILE_WRITE); // pokud se soubor načte a otevře, tak: if (myFile) { Serial.println("Zapisuji do test.txt"); // zapiš do souboru myFile.println("dneska sviti slunce"); // zavři soubor myFile.close(); Serial.println("uspesne zapsano"); } // pokud se nepodaří soubor načíst a otevřít, tak: else { Serial.println("soubor se nepodarilo otevrit"); } // přečtění souboru: Serial.println("\ncteni ze souboru\n"); // otevři soubor test.txt pro čtení, mód je defaultně nastavený na FILE_READ myFile = SD.open("test.txt"); // pokud se soubor načte a otevře, tak: if (myFile) { Serial.println("soubor obsahuje: "); // čti ze souboru, dokud je co while (myFile.available()) { Serial.write(myFile.read()); } // zavři soubor myFile.close(); } // pokud se nepodaří soubor načíst a otevřít, tak: else { Serial.println("soubor se nepodarilo otevrit"); } } void loop() { // jelikož chceme, aby kód proběhl jenom jednou, tak zde nic nebude }
Po spuštění Arduino programu se nám dostane na serial monitoru následující výpis. Teď už stačí jen místo věty "dneska sviti slunce" použít data z analogových nebo digitálních vstupů. Princip zápisu bude stejný. V Dataloggeru se také často používá modul reálného času pro vytvoření časových značek.
Další možnosti programování
Tento program vám ukázal naprosté základy práce s SD kartou. Možná je také práce s adresáři, nebo mazání souborů. Pokud by vás zajímalo více, podívejte se do dokumentace knihovny k SD kartě. Nebo si rovnou zdarma stáhněte Arduino e-book na stránce www.arduino.cz, kde najdete o SD kartě samostatnou kapitolu.
Pokud narazíte na něco, co vám není v návodu jasné, zeptejte v sekci komentářů nebo se podívejte na další Arduino návody na stránce www.hwkitchen.cz/arduino-navody/.
Bastlení ZDAR!