sobota, 31 października 2015

[15] Arduino - Zapis na kartę SD

Tym razem przedstawię zapis danych na kartę SD.

[Źródło: https://botland.com.pl/akcesoria-do-kart-pamieci/1507-modul-czytnika-kart-sd-5903351241342.html]

Wstęp


Wykorzystywanie karty SD ma wiele zastosowań pozwalających na zapisywanie i prowadzenie rejestru odczytanych danych. Często taki sposób akwizycji danych stosowany jest w projektach zawierających min. takie elementy jak:
  • moduł GPS, do zbierania danych o położeniu;
  • stacji pogodowej, do zapisywania danych odnośnie temperatury, ciśnienia, opadów itp.
  • systemach pomiarowych, zbierających dane odnośnie odległości, odchyleń itp. 
Zapis danych na kartę SD można dokonać poprzez zastosowanie biblioteki wbudowanej SD.h oraz odpowiedniej bibliotece do komunikacji z modułem. W moim przypadku będzie to SPI.h.

Oprogramowanie Arduino IDE ma wiele przykładów min. dla karty SD,

Podczas wykorzystywania karty SD należy pamiętać aby była ona sformatowana w formacie FAT32.

Podłączenie


Układ podłączany jest do następujących wyprowadzeń:

  • MOSI - pin 11
  • MISO - pin 12
  • CLK - pin 13
  • CS - pin 10

Programowanie


W celu poprawnej inicjalizacji karty SD należy w programie wprowadzić następujące komendy. Instrukcja warunkowa if sprawdza czy karta jest wykrywana. Jeśli nie jest to następuje wyświetlenie informacji poprzez port szeregowy i przerwanie wykonywania programu. Jeśli karta zostanie rozpoznana program nie wejdzie do instrukcji i wyświetli napis o błędnej inicjalizacji karty.

  1. if(!SD.begin(CSPin))
  2. {
  3.    Serial.println("Blad inicjalizacji karty");
  4.    return;
  5. }
  6. Serial.println("Karta zostala poprawnie zainicjalizowana");

Jeśli chcemy wpisać jakąś linijkę tekstu do kary SD, wtedy należy użyć postępować następująco:

  1.   myFile = SD.open("test.txt", FILE_WRITE);
  2.  
  3.   //Sprawdza czy plik otwarty
  4.   if (myFile){
  5.     Serial.print("Wpisanie tekstu");
  6.     myFile.println("123 Dziala");
  7.     //Zamkniecie pliku
  8.     myFile.close();
  9.   }
  10.   else {
  11.     //Jeśli plik się nie otworzył
  12.     Serial.println("Blad otwarcia pliku");
  13.   }

SD.open otwiera plik o podanej nazwie, lub tworzy go jeśli nie istnieje. Jeśli plik zostanie stworzony lub/i otwarty wtedy program wejdzie do instrukcji warunkowej if gdzie nastąpi wpisanie podanej składki do pliku. Natomiast w przypadku zwrócenia wartości false wykonana zostanie instrukcja else.
Plik po otwarciu musi zostać zamknięty inaczej dane nie zostaną poprawnie wprowadzone.

Poniżej wklejam cały kod programu razem z komentarzem.

  1. //Biblioteki
  2. #include <SD.h>
  3. #include <SPI.h>
  4.  
  5. const int CSPin = 10;
  6. int czas = 0;
  7.  
  8. void setup(){
  9.   Serial.begin(9600);
  10.   //Ustawienie CS jako wyjście
  11.   pinMode(CSPin, OUTPUT);
  12.  
  13.   if (!SD.begin(CSPin))
  14.   {
  15.     Serial.println("Blad inicjalizacji karty");
  16.     return;
  17.   }
  18.     Serial.println("Karta zostala poprawnie zainicjalizowana");
  19. }
  20.  
  21. void loop(){
  22.   File myFile = SD.open("test.txt", FILE_WRITE);
  23.  
  24.   if (myFile){
  25.   myFile.print("Dziala ");
  26.   myFile.println(czas);
  27.   myFile.close();
  28.  
  29.   Serial.print("Dane zapisane");
  30.   }
  31.   else{
  32.   Serial.println("Blad otwarcia pliku");
  33.   }
  34. delay(3000);
  35. }