sdcard1

在Arduino的應用中,如果你有一些簡單的資料需要記錄,像是溫濕度、時間等等,可以透過SD模組,將資料寫進SD卡或micro SD卡中。

這部份其實不難,只要找到方便的函式庫,就能輕鬆做到。傑森最推薦SdFat函式庫,語法簡單,而且有Adafruit版本,如果你要用Adafruit的TFT函式庫,想讀圖檔,就必須和SdFat來配合。

在程式管理員中會找到2個SdFat函式庫,記得安裝Adafruit的版本,除了版本較新,也更適合和Adafruit的其它函式配合。

sdfat-1

我們這次要試的是最常見的一塊micro SD的模組,SPI介面。所以先準備一片micro SD卡,在Windows裡將它格式化為Fat32的格式就可以了。

以Arduino Uno為例,以下為SPI一般的接線方式

  • MOSI - pin 11
  • MISO - pin 12
  • CLK - pin 13
  • VCC - 5V
  • GND - GND

至於CS,以Uno來說預設就是腳位10,如果有多個SPI設備,請設不同的腳位,就能同時使用了,這點在配合TFT LCD時會用到。

程式部份,傑森以範例ReadWrite進行簡化,加上了中文說明,應該大家看了就能理解了。這支程式,一開始先打開一個test.txt的檔案。

myFile = SD.open("test.txt", FILE_WRITE);

模式為寫入(FILE_WRITE),若檔案不存在,就會自動建議一個新的檔案。接著就寫入一行簡單的文字。

第二部份就是讀取了,再打開剛才的test.txt檔案,把內容一一讀取出來,並顯示在監控視窗中,這樣就大功告成了,真的很簡單啦!

while (myFile.available()) {
  Serial.write(myFile.read()); //把讀到的內容顯示在監控視窗
}

sdfat-2

#include <SPI.h>
//#include <SD.h>
#include "SdFat.h"
SdFat SD;

//CS腳位,預設是SS,以Uno來說就是腳位10,如果有多個SPI設備,請設不同的腳位
#define SD_CS_PIN SS
File myFile;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");

  //判斷SD模組初始化是否成功
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  //打開一個檔名為test.txt的檔案,模式為寫入(FILE_WRITE)
  //若檔案不存在,就會自動建議一個新的檔案
  myFile = SD.open("test.txt", FILE_WRITE);

  // 如果成功打開,就寫入文字
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("www.jmaker.com.tw");
    // 關閉檔案
    myFile.close();
    Serial.println("done.");
  } else {
    // 如果無法開啟檔案,就在監控視窗顯示訊息
    Serial.println("error opening test.txt");
  }

  //以下是讀取的部份
  //再打開test.txt
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    //一直讀取檔案內容,直到沒有為止
    while (myFile.available()) {
      Serial.write(myFile.read()); //把讀到的內容顯示在監控視窗
    }
    // 關閉檔案
    myFile.close();
  } else {
    // 如果無法開啟檔案,就在監控視窗顯示訊息
    Serial.println("error opening test.txt");
  }
}

void loop() {
  
}