Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

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
Pokiaľ máte MEGA, zapojte podľa prvého stĺpčeku. Ak nie (napr. UNO), použite druhý. Ak máte shield so slotom, tak pravdepodobne s Arduino MEGA fungovať nebude (ak má vývody k pinom 50-53 a je na nich slot, tak bude). Zistite si, na ktorý pin je privedený CS.

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.

Ukladanie na SD kartu v Arduino - Arduino

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:

Čítanie z SD karty Arduino - Arduino

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

 

Predchádzajúci článok
Arduino - Jazyk 2
Všetky články v sekcii
Arduino
Preskočiť článok
(neodporúčame)
Arduino - Komunikácia cez Bluetooth
Článok pre vás napísal Adam Ježek
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se převážně věnuje Arduinu a psaní tutoriálů z této oblasti, občas napíše příležitostně nějakou tu zprávičku. Většinu svého volného času momentálně věnuje Linuxu a/nebo Raspberry Pi. Také umí C#, HTML, CSS, PHP a Python.
Aktivity