13. diel - Arduino a SD karta
V tomto diele si k Arduino pripojíme SD kartu. Na ukážku použijeme SD card module. Ak máte shield, ktorý v sebe má slot na SD kartu, tak ten možno tiež použiť, ale je tu pár detailov, tie spomeniem neskôr.
SD kartu môžeme použiť ktorúkoľvek, ktorá je formátovaná na FAT alebo FAT32. Ovšem nebudeme formátovať pomocou nástrojov v OS, ale použijeme SD Formatter (Viac tu). Takže, máme modul, máme SD kartu naformátovanú na FAT32 pomocou SDformatteru. Čo ďalej?
Pripojenie
Na module máme piny GND, 5V (snáď netreba vysvetľovať), MISO, SCK (/ CLK), Mosi, CS. Bohužiaľ je nemôžeme pripojiť ako sa nám zapáči. Ak vám piny MISO, SCK, Mosi pripomínajú piny z lekcie s programovaním ATmega, tak máte pravdu, musíme použiť tieto.
MEGA | ne-MEGA | |
Mosi | 51 | 11 |
SCK | 52 | 12 |
MISO | 50 | 15 |
SK | 53 | 4 |
Než začneme, overíme si funkčnosť SD karty. Pripojte ju, otvorte IDE a File -> Examples -> SD -> CardInfo. SD knižnica je už súčasťou IDE. V kóde hneď nad setupom nájdete riadok
const int chipSelect = 4;
Pokiaľ máte MEGA, prepíšte hodnotu na 53. Ak máte shield, použite pin, na ktorom je CS. Ostatných sa to netýka. Kód nahrajte do Arduino s pripojenou kartou, otvorte Serial Monitor (Ctrl + shift + M) a ak uvidíte niečo ako
Initializing SD card...Wiring is correct and a card is present. Card type: SD1 Volume type is FAT16 Volume size (bytes): 127041536 Volume size (Kbytes): 124064 Volume size (Mbytes): 121 Files found on the card (name, date and size in bytes): SYSTEM~1/ 2015-01-03 10:57:36 INDEXE~1 2015-01-03 10:57:36 76 MERENI.TXT 2015-01-03 15:11:00 30240 KECTENI.TXT 2015-01-03 15:21:24 1925
máte vyhraté. Ak niečo ako
Initializing SD card...initialization failed. Things to check: * is a card is inserted? * Is your wiring correct? * did you change the chipSelect pin to match your shield or module?
skontrolujte vedenie, kartu, ochranu proti prepisu. Potom vás môže prekvapiť treba ešte chyba typu
Initializing SD card...Wiring is correct and a card is present. Card type: SDHC Could not find FAT16/FAT32 partition. Make sure you've formatted the card
to sa vráťte na začiatok článku a prečítate si, čo som písal o formátovaní.
Ak vám bola vypísaná veľkosť, súborový systém, prípadne súbory, nič nám nebráni pokračovať.
Zápis
Čo si pripojiť k Arduino DHT11, ktoré už poznáme a ukladať dáta z neho na SD kartu?
Takže začneme tým, že importujete knižnice:
#include <dht11.h> #include <SD.h>
Vytvoríme ktorej známe DHT11:
dht11 cidlo; int dht11Pin = 7;
A teraz inicializujeme SD kartu:
const int chipSelect = 53; //nezapomeneme patřičně upravit void setup() { SD.begin(chipSelect); }
Pustíme sa do Loop. Začneme tým, že si vytvoríme string dát na uloženie:
void loop() { cidlo.read(dht11Pin); String teplota = String(cidlo.temperature); String vlhkost = String(cidlo.humidity); String cas = String(millis()); teplota += " "; vlhkost += " "; cas += " "; String data =cas.substring(0,16) + teplota.substring(0,3) + vlhkost.substring(0,3) ;
Uložíme teplotu, vlhkosť a do cas uložíme počet milisekúnd od spustenia. Možno vás prekvapí, prečo za string pridávam to veľké miesto a funkcie substring (). Ide o to, že funkcia substring () vezme zo stringu určitú časť, napr. Z času vezmeme len 0 až 16-tý znak (indexovanie od nuly). Zámer uvidíte za chvíľu. Teraz nám zostáva otvoriť súbor pre zápis:
File soubor = SD.open("mereni.txt", FILE_WRITE);
To urobíme pomocou funkcie SD.open. File je premenná, do ktorej sa súbor uloží, dáme jej meno súbor. Otvoríme súbor mereni.txt a budeme zapisovať. Ak súbor neexistuje, vytvorí ho. Ak existuje, pripíše do neho. A ak sa otvorenie podarí, tak do neho zapíšeme a zatvoríme.
if(soubor) { soubor.println(data); soubor.close(); } delay(1000); }
Je dôležité mať na pamäti súbor čo najrýchlejšie uzavrieť a že nikdy nemôžeme mať otvorených viac súborov naraz.
Do Arduino teda nahráme toto:
#include <dht11.h> #include <SD.h> dht11 cidlo; int dht11Pin = 7; const int chipSelect = 53; void setup() { SD.begin(chipSelect); } void loop() { cidlo.read(dht11Pin); String teplota = String(cidlo.temperature); String vlhkost = String(cidlo.humidity); String cas = String(millis()); teplota += " "; vlhkost += " "; cas += " "; String data =cas.substring(0,16) + teplota.substring(0,3) + vlhkost.substring(0,3) ; File soubor = SD.open("mereni.txt", FILE_WRITE); if(soubor) { soubor.println(data); soubor.close(); } delay(1000); }
Spustíme, necháme chvíľu bežať a potom kartu jednoducho vyberieme a otvoríme v počítači.
Toto bude zhruba výsledok. Pozrite sa, ako je rozdielna dĺžka času, ale teplota a vlhkosť sú stále v rovnakom stĺpčeku - preto tie medzery a substring. Všimnite si, že hoci sme Arduino povedali, že chceme mereni.txt, dostali sme MERENI.TXT.
Čítania
No dobrá, zapisovať vieme. Ale čo treba niečo prečítať? Vytvorme si na SD karte súbor KECTENI.TXT a zapíše do neho potrebné toto:
Test čtení Arduinem z SD karty Nový řádek itnetwork.cz
A text potom vypíšeme na sériový port. Kód bude vyzerať skoro rovnako, len zmažeme časť s DHT11, tvorenie stringu, upravíme otváraní súboru a prepíšeme kód zápisu
#include <SD.h> const int chipSelect = 53; void setup() { Serial.begin(9600); SD.begin(chipSelect); File soubor = SD.open("kecteni.txt"); if(soubor) { int znaky = 0; while(soubor.available()) {znaky++; Serial.write(soubor.read()); } Serial.println(""); Serial.println("Soubor ma " + String(znaky) + "znaku, vcetne mezer a newline znacek"); } else { Serial.println("nepodarilo se otevrit soubor"); } } void loop() { }
V kóde pripravíme SD kartu, otvoríme súbor, ale tentoraz bez parametra
FILE_WRITE
, pretože budeme len čítať. Arduino číta tak, že
prečíta jeden znak a prejde k ďalšiemu. A navyše nám dá len ASCII hodnotu
tohto znaku. Preto nepoužívame Serial.print (), ale write (). Možno ale
ľahko získať aj string, stačí nahradiť časť v IFU:
int znaky = 0; String precteno = ""; while(soubor.available()) { znaky++; precteno += char(soubor.read()); } Serial.print(precteno); Serial.println(""); Serial.println("Soubor ma " + String(znaky) + "znaku, vcetne mezer a newline znacek");
pomocou char () dostaneme z prečítané hodnoty znak, ktorý len pripojíme ku stringu. Program nahráme, otvoríme Serial Monitor a výstup by mal byť nasledujúce:
Ako vidíte, tak nie je zrovna ideálne používať háčiky a čiarky.
Ak vám niečo nefunguje, skontrolujte zapojenie, CS pin, ... ako predtým.
Zdrojové kódy sú opäť k dispozícii na stiahnutie v prílohe.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 248x (2.48 kB)
Aplikácia je vrátane zdrojových kódov