Autor: Samir Gutić
Pročitano: 3537 puta

Rezultate proračuna ili mjerenja je poželjno sačuvati u neki file tako da ih je moguće po želji i potrebi pročitati.

Arduino može, rezultate proračuna ili vrijednosti pročitane sa raznih senzora snimati na SD (ili microSD) karticu.

Na slici ispod je spoj Arduino Uno i SD Card module koji je zaseban modul sa SD slotom za korištenje SD kartica ili microSD kartice u SD adapteru..

Upis i čitanje sa SD kartice

Budući da je na slici iznad korišten zasebani SD card modul koji se spaja preko breadboard-a, posebnu pažnju treba obratiti na spajanje pojedinih pinova SD card modula. Naglašavam da se radi o SD card modulu, jer postoje i microSD slotovi koji dolaze zajedno sa LAN shield-om (mrežna kartica sa RJ45 konektorom). Takav shield se postavi direktno na Arduino zbog čega postoji vrlo mala vjerovatnoća greške pri spajanju.

SD modulNa slici lijevo je SD card module (pogled odozgo) na kome su označeni pinovi.

Za pristup podacima na SD kartici je, u sketch, potrebno uključiti biblioteke SPI.h i SD.h

U tabeli ispod je raspored spajanja pinova samostalnog SD card modula na Arduino Uno ploču.

SD card pin

Arduino pin

GND

GND

5V

5V

SDCS

pin4

MOSI

pin11

MISO

pin12

SCK

pin13

 

Ispod je kôd sketch-a koji, u svakom ciklusu, vrši upis varijable (dadavanje na postojeće podatke) u file tmp.log na SD kartici te čitanje svih do sada upisanih podataka i prikaz na Serial Monitor (kopirajte kompletan kôd ispod u Arduino IDE prozor i upload-ujte ga na Arduino) :

/*
 * TEST UPISA I ČITANJA PODATAKA
 * NA SD KARTICU U SD CARD MODULU
 *
 * Autor: Samir Gutić
 * URL: http://amicus.ba
 * Datum: 15. II 2017.
 *
 * GND      GND
 * 5V       5V
 * SDCS pin 4
 * MOSI pin 11
 * MISO pin 12
 * SCK  pin 13
 *
 */

#include <SPI.h>
#include <SD.h>

//Deklaracija dokumenta
File sdDokument;

//Deklaracija varijable za upis u dokument na SD kartici
int intUpis=0;

//Deklaracija varijable za čitanje iz dokumenta na SD kartici
int intCitanje=0;

void setup()
{
  //Otvaranje serijske komunikacije i čekanje na otvaranje porta
  Serial.begin(9600);
  while (!Serial)
  {
    ; //Čekanje na konekciju na serijski port. Potrebno samo za native USB port.
  }

  //Prikaz informacija na serijski port
  Serial.println("Inicijalizacija SD kartice.");

  if (!SD.begin(4))
  {
    Serial.println("Inicijalizacija SD kartice nije uspjela!");
    return;
  }
  Serial.println("Izvrsena je inicijalizacija SD kartice.");

    //Brisanje file-a ako postoji
    if(SD.exists("temp.log"))
        {
            SD.remove("temp.log");
        }
        else
        {
            Serial.println("Nema dokumenta za brisanje");
        }
}

void loop()
{
  //Generisanje testnih podataka za upis (10, 20, 30,...)
  intUpis=intUpis+10;
 
  //Otvaranje dokumenta.
  //Dozvoljeno je imati samo jedan otvoren dokument
  //Prije otvaranja drugog dokumenta treba zatvoriti prethodno otvoreni
  sdDokument = SD.open("temp.log", FILE_WRITE);

  //Ako je otvaranje uspjelo, upisati podatke
  if (sdDokument)
  {
    //Prikaz informacija na serijski port
    Serial.println("Upis u temp.log");

    //Upis vrijednosti varijable intUpis u file temp.log na SD kartici
    
    sdDokument.print(intUpis);
    sdDokument.print(",");
     
    //Zatvoriti otvoreni file
    sdDokument.close();

    //Prikaz informacija na serijski port
    Serial.println("Uspjesno upisano.");
  }
  else
  {
    //Ako nije uspjelo otvaranje file-a na SD kartici
    Serial.println("Greska pri otvaranju temp.log");
  }

  //Otvaranje istog dokumenta zbog čitanja upisanih podataka
  sdDokument = SD.open("temp.log");
  if (sdDokument)
  {
    Serial.println("Citanje iz dokumenta temp.log");

    //Citanje cijelog sadržaja dokumenta temp.log
    while (sdDokument.available())
    {
      //intCitanje=sdDokument.read();

      //Prikaz pročitanih podataka u prozoru serial monitora
      Serial.write(sdDokument.read());
      
    }
    Serial.println("");
    //Zatvaranje dokumenta temp.log
    sdDokument.close();
  }
  else
  {
    //Ako nije uspjelo otvaranje dokumenta temp.log, ispisati grešku
    Serial.println("Greska pri otvaranju temp.log");
  }

  //Odogoda od 3 sekunde i ponavljanje upisa nove stavke i čitanja svih stavki
  delay(3000);
}

Sketch-u iznad, pri prvom pokretanju provjeri da li na SD kartici postoji file sa imenom temp.log i izbriše ga ako postoji. Nakon toga, u svakom ciklusu otvara file temp.log i to u modusu za upis, u njega upiše vrijednost varijable intUpis i zatvori file. Varijabla se u ovom primjeru kreira tako da se jednostavno prethodnoj vrijednosti doda vrijednost 10 (primjer nekog računanja u stvarnom programu).

Nakon upisa nove vrijednosti (dodavanja na postojeće podatke), sketch otvara isti file u modusu za čtanje te pročita sve upisane i ispiše ih na Serial Monitor. Nakon 3 sekunde pauze, proces računanja nove vrijednosti, upisa i čitanja se ponavlja.

Šema spoja elemenata kreirana u Fritzing programu je na slici ispod.

Upis i čitanje sa SD kartice - breadboard

Na šemi iznad su pinovi SD modula označeni svojim imenima (sa donje strane pločice modula).

Kao što se vidi sa šeme iznad, pin GND SD modula je povezan na Arduino GND, 5V pin SD modula je povezan na 5V Arduino pin, SDCS pin SD modula je povezan na Arduino pin4, MOSI modula SD modula j epovezan na Arduino pin11, MISO pin SD modula je povezan na Arduino pin12 i SCK pin SD modula je povezan na Arduino pin13..

Električna šema spoja je na sljedećoj slici.

Upis i čitanje sa SD kartice - električna šema

Ispod je prikaz Serial Monitora koji prikazuje kako funkcioniše upis i čitanje podataka sa SD kartice.

Upis i čitanje sa SD kartice - serial monitor

Potrebne komponente:

1 x Arduino UNO

1 x Breadboard (mala)

1 x SD card module

1 x SD kartica (ili μSD kartica u adapteru formatirana u FAT file sistemu)

Žice za spajanje

9V napajanje