我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195
假設你有一個ESP32-CAM,但是你可能暫時用不到CAM的部份,而要用內建的SDcard (以下簡稱TF)來紀錄溫濕度等資訊,可以參考本篇文章
另外使用本公司所開發的Matrix板,其TF卡一樣使用SPI,完全可以相通。
首先準備一張TF卡,測試過可讀取32G以下的記憶卡,64G讀不到,放入卡槽之後,執行以下原始檔,進行讀寫測試
本原始檔包含以下幾個副程式,功能列表如下,請注意的是「/」代表根目錄,不可省略:
函數 | 功能 |
listDir(SD_MMC, "/", 0); | 列出SD卡中的所有目錄 |
createDir(SD_MMC, "/mydir"); | 建立一個名稱為mydir的目錄 |
removeDir(SD_MMC, "/mydir"); | 刪除一個名稱為mydir的目錄 |
writeFile(SD_MMC, "/hello.txt", "Hello "); | 在hello.txt中寫入"Hello" |
appendFile(SD_MMC, "/hello.txt", "World!\n"); | 在hello.txt中附加"World!\n" |
readFile(SD_MMC, "/hello.txt"); | 讀取hello.txt並顯示 |
renameFile(SD_MMC, "/hello.txt", "/foo.txt"); | 更名hello.txt->foo.txt檔案 |
deleteFile(SD_MMC, "/foo.txt"); | 刪除foo.txt |
testFileIO(SD_MMC, "/test.txt"); | 測試執行效率 |
原始碼如下
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This post referred to this git. I just trimmed cam and wifi part. | |
// https://github.com/v12345vtm/CameraWebserver2SD/blob/master/CameraWebserver2SD/CameraWebserver2SD.ino | |
#include "FS.h" | |
#include "SD_MMC.h" | |
//List dir in SD card | |
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ | |
Serial.printf("Listing directory: %s\n", dirname); | |
File root = fs.open(dirname); | |
if(!root){ | |
Serial.println("Failed to open directory"); | |
return; | |
} | |
if(!root.isDirectory()){ | |
Serial.println("Not a directory"); | |
return; | |
} | |
File file = root.openNextFile(); | |
while(file){ | |
if(file.isDirectory()){ | |
Serial.print(" DIR : "); | |
Serial.println(file.name()); | |
if(levels){ | |
listDir(fs, file.name(), levels -1); | |
} | |
} else { | |
Serial.print(" FILE: "); | |
Serial.print(file.name()); | |
Serial.print(" SIZE: "); | |
Serial.println(file.size()); | |
} | |
file = root.openNextFile(); | |
} | |
} | |
//Create a dir in SD card | |
void createDir(fs::FS &fs, const char * path){ | |
Serial.printf("Creating Dir: %s\n", path); | |
if(fs.mkdir(path)){ | |
Serial.println("Dir created"); | |
} else { | |
Serial.println("mkdir failed"); | |
} | |
} | |
//delete a dir in SD card | |
void removeDir(fs::FS &fs, const char * path){ | |
Serial.printf("Removing Dir: %s\n", path); | |
if(fs.rmdir(path)){ | |
Serial.println("Dir removed"); | |
} else { | |
Serial.println("rmdir failed"); | |
} | |
} | |
//Read a file in SD card | |
void readFile(fs::FS &fs, const char * path){ | |
Serial.printf("Reading file: %s\n", path); | |
File file = fs.open(path); | |
if(!file){ | |
Serial.println("Failed to open file for reading"); | |
return; | |
} | |
Serial.print("Read from file: "); | |
while(file.available()){ | |
Serial.write(file.read()); | |
} | |
} | |
//Write a file in SD card | |
void writeFile(fs::FS &fs, const char * path, const char * message){ | |
Serial.printf("Writing file: %s\n", path); | |
File file = fs.open(path, FILE_WRITE); | |
if(!file){ | |
Serial.println("Failed to open file for writing"); | |
return; | |
} | |
//fwrite(fb->buf, 1, fb->len, file); | |
if(file.print(message)){ | |
Serial.println("File written"); | |
} else { | |
Serial.println("Write failed"); | |
} | |
} | |
//Append to the end of file in SD card | |
void appendFile(fs::FS &fs, const char * path, const char * message){ | |
Serial.printf("Appending to file: %s\n", path); | |
File file = fs.open(path, FILE_APPEND); | |
if(!file){ | |
Serial.println("Failed to open file for appending"); | |
return; | |
} | |
if(file.print(message)){ | |
Serial.println("Message appended"); | |
} else { | |
Serial.println("Append failed"); | |
} | |
} | |
//Rename a file in SD card | |
void renameFile(fs::FS &fs, const char * path1, const char * path2){ | |
Serial.printf("Renaming file %s to %s\n", path1, path2); | |
if (fs.rename(path1, path2)) { | |
Serial.println("File renamed"); | |
} else { | |
Serial.println("Rename failed"); | |
} | |
} | |
//Delete a file in SD card | |
void deleteFile(fs::FS &fs, const char * path){ | |
Serial.printf("Deleting file: %s\n", path); | |
if(fs.remove(path)){ | |
Serial.println("File deleted"); | |
} else { | |
Serial.println("Delete failed"); | |
} | |
} | |
//Test read and write speed using test.txt file | |
void testFileIO(fs::FS &fs, const char * path){ | |
File file = fs.open(path); | |
static uint8_t buf[512]; | |
size_t len = 0; | |
uint32_t start = millis(); | |
uint32_t end = start; | |
if(file){ | |
len = file.size(); | |
size_t flen = len; | |
start = millis(); | |
while(len){ | |
size_t toRead = len; | |
if(toRead > 512){ | |
toRead = 512; | |
} | |
file.read(buf, toRead); | |
len -= toRead; | |
} | |
end = millis() - start; | |
Serial.printf("%u bytes read for %u ms\n", flen, end); | |
file.close(); | |
} else { | |
Serial.println("Failed to open file for reading"); | |
} | |
file = fs.open(path, FILE_WRITE); | |
if(!file){ | |
Serial.println("Failed to open file for writing"); | |
return; | |
} | |
size_t i; | |
start = millis(); | |
for(i=0; i<2048; i++){ | |
file.write(buf, 512); | |
} | |
end = millis() - start; | |
Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); | |
file.close(); | |
} | |
void setup() { | |
Serial.begin(115200); | |
Serial.println("SDcard Testing...."); | |
if(!SD_MMC.begin()){ | |
Serial.println("Card Mount Failed"); | |
return; | |
} | |
uint8_t cardType = SD_MMC.cardType(); | |
if(cardType == CARD_NONE){ | |
Serial.println("No SD_MMC card attached"); | |
return; | |
} | |
Serial.print("SD_MMC Card Type: "); | |
if(cardType == CARD_MMC){ | |
Serial.println("MMC"); | |
} else if(cardType == CARD_SD){ | |
Serial.println("SDSC"); | |
} else if(cardType == CARD_SDHC){ | |
Serial.println("SDHC"); | |
} else { | |
Serial.println("UNKNOWN"); | |
} | |
uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024); | |
Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize); | |
listDir(SD_MMC, "/", 0); | |
createDir(SD_MMC, "/mydir"); | |
listDir(SD_MMC, "/", 0); | |
removeDir(SD_MMC, "/mydir"); | |
listDir(SD_MMC, "/", 2); | |
writeFile(SD_MMC, "/hello.txt", "Hello "); | |
appendFile(SD_MMC, "/hello.txt", "World!\n"); | |
readFile(SD_MMC, "/hello.txt"); | |
deleteFile(SD_MMC, "/foo.txt"); | |
renameFile(SD_MMC, "/hello.txt", "/foo.txt"); | |
readFile(SD_MMC, "/foo.txt"); | |
testFileIO(SD_MMC, "/test.txt"); | |
Serial.printf("Total space: %lluMB\n", SD_MMC.totalBytes() / (1024 * 1024)); | |
Serial.printf("Used space: %lluMB\n", SD_MMC.usedBytes() / (1024 * 1024)); | |
} | |
void loop() { | |
// put your main code here, to run repeatedly: | |
delay(10000); | |
} |
關於ESP32-CAM可以參考本文: http://youyouyou.pixnet.net/blog/post/119383183
ESP32-CAM露天搜尋: https://goods.ruten.com.tw/item/show?21910115309507
https://github.com/v12345vtm/CameraWebserver2SD/blob/master/CameraWebserver2SD/CameraWebserver2SD.ino
This post referred to this git. I just trimed cam and wifi part.
本文參考
文章標籤
全站熱搜