在Arduino的應用中,如果你有一些簡單的資料需要記錄,像是溫濕度、時間等等,可以透過SD模組,將資料寫進SD卡或micro SD卡中。
這部份其實不難,只要找到方便的函式庫,就能輕鬆做到。傑森最推薦SdFat函式庫,語法簡單,而且有Adafruit版本,如果你要用Adafruit的TFT函式庫,想讀圖檔,就必須和SdFat來配合。
在程式管理員中會找到2個SdFat函式庫,記得安裝Adafruit的版本,除了版本較新,也更適合和Adafruit的其它函式配合。
我們這次要試的是最常見的一塊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()); //把讀到的內容顯示在監控視窗
}
#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() {
}