如何使用Arduino IDE与ESP32接口MicroSD卡模块

ESP32是一种先进的微控制器板,可以与各种外设接口。与其他传感器一样,您也可以将MicroSD卡模块与ESP32连接起来。您可以将MicroSD卡传感器用于数据记录应用程序或增加微控制器板的存储容量。

本文将解释使用Arduino IDE将MicroSD卡与ESP32板连接的步骤。

目录:

1. MicroSD卡模块

  • 1.1. 引出线

2. 如何将ESP32与MicroSD卡模块连接

  • 2.2. 准备好SD卡
  • 2.3. 原理图

3. 硬件

4. 代码

  • 4.1. 代码的解释

5. 输出

6. 利用ESP32实现MicroSD卡的不同功能

  • 6.1. 创建MicroSD卡目录
  • 6.2. 列出MicroSD卡中的目录
  • 6.3. 删除目录
  • 6.4. 获取MicroSD卡类型
  • 6.5. 获取SD卡大小

结论

1. MicroSD卡模块

MicroSD卡模块是一个ESP32传感器,可以将SD卡连接到微控制器板上。它通过SPI通信协议工作。它允许ESP32或任何其他微控制器板如Arduino通过SPI协议访问存储在SD卡上的数据。

SD卡模块的工作电压为3.3V,因此不能直接连接到ESP32或任何其他微控制器板。为此,我们需要使用工作在5V以上的SD卡模块或传感器。

1.1. 引出线

MicroSD卡共有6个引脚。其中两个是电源引脚:VCC和GND。而读取的四个引脚则用于SPI通信协议。以下是所有这六个引脚的详细信息:

权力针:

  • VCC:连接ESP32 5V引脚。
  • GND:接ESP32接地脚。

SPI针:

  • MISO:(Master In Slave Out)连接ESP32 MOSI (Master Out Slave In)引脚。
  • MOSI:连接ESP32 MISO (Master In Slave Out)引脚。
  • SCK:连接ESP32 SCK (Serial Clock)引脚。
  • SS:(Slave Select)连接到Arduino代码中指定的引脚,作为SS (Slave Select)引脚。

2. 如何将ESP32与MicroSD卡模块连接

要将ESP32与MicroSD卡模块连接,您需要为SD卡传感器设置电源引脚。接下来设置SPI引脚。这里您有两个选择,您可以设置默认SPI引脚或定义自己的自定义SPI引脚。

当使用默认SPI引脚时,我们将添加SD.h和SD_MMC.h库。默认情况下,这些库采用VSPI SPI引脚(23、19、18、5)进行SPI通信。但是,您也可以为SPI通信设置其他引脚。

ESP32包含两个SPI接口HSPI和VSPI,其引脚细节如下:

SPI 莫西人 味噌 CLK CS
VSPI c15 D19 D18 D5
HSPI D13 D12 D14 D15

相关:ESP32引脚参考-完整指南

2.2. 准备好SD卡

接下来,在您可以继续向MicroSD卡读写数据之前,首先,您必须通过格式化其中的任何先前的数据来设置它。

使用任何读卡器打开SD卡并格式化它。

为您的卡文件系统选择FAT32,然后单击Start。

格式化卡片后,选择OK。

现在,您的SD卡已经准备好使用SD卡模块与ESP32进行接口。

2.3. 原理图

要将MicroSD卡传感器与ESP32连接,请遵循以下给定的配置:

连接线引脚配置表如下:

MicroSD卡 ESP32
接地 接地
VCC
CS D5
莫西人 c15
SCK D18
味噌 D19

3. 硬件

对于硬件,您只需要一些跳线,面包板以及ESP32和SD卡模块。

4. 代码

现在我们将编写一段代码,它将在MicroSD卡中创建一个文本文件,之后,它将向该文件写入一些文本字符串。完成后,我们将在Arduino IDE串行监视器上读取文本文件的内容。

启动Arduino IDE并编译给定的代码。然后将其刻录到ESP32板上:

  1. include



  1. include



文件myFile;


const int CS = 5;



//将给定的消息写入指定路径的文件


void WriteFile(const char path, const char message) {


//打开文件。它支持一次打开一个文件


//打开一个新文件前先关闭另一个文件


myFile = SD。打开(路径,FILE_WRITE);



if (myFile) {


系列。printf("写入%s ",路径);


myFile.println(消息);


myFile.close ();//关闭文件


以“。”);


} else {


系列。Println("打开文件错误");


以(路径);


}


}



//打印指定路径下的文件内容


void ReadFile(const char * path) {


//打开文件


myFile = SD.open(path);


if (myFile) {


系列。printf("从%sn读取文件",path);


//读取整个文件直到最后一个


while (myFile.available()) {


            Serial.write (myFile.read ());


}


myFile.close ();//关闭文件


} else {


//如果文件打开失败,打印错误:


系列。Println("打开test.txt出错");


}


}



无效设置(){


Serial.begin (9600);


延迟(500);


while (!Serial) {;}



系列。println(“初始化SD卡…”);


if (!SD.begin(CS)) {


系列。println(“初始化失败!”);


返回;


}


系列。println(“初始化完成。”);



WriteFile(" /用法”,“Linuxhint.com”);


ReadFile(“/用法”);


}



Void loop() {


   


}

4.1. 代码的解释

为了更好地理解,我们将这段代码分成几个子部分。

初始化和设置:首先,代码首先包含一些与SD卡模块相关的重要库。增加了用于与SD卡通信的SPI.h库和用于处理SD卡操作的SD.h库。接下来,它定义了一个文件类型的全局变量myFile来管理文件操作。CS常数设置为引脚5,这将用作SD卡的芯片选择(CS)引脚。

Setup()函数:在Setup函数内部,启动串行通信。之后,我们使用SD.begin(CS)函数初始化SD卡模块。此外,我们还定义了两个不同的函数,用于向文本文件读取和写入文本。

写入SD卡:WriteFile()函数打开test.txt文件,以便使用SD写入。打开(路径,FILE_WRITE)。之后,它使用myFile.println(message)将字符串Linuxhint.com写入文件。

从SD卡读取:为了读取文件内容,我们使用了ReadFile()函数。如果读取成功,数据将被发送到Arduino串口,并显示在Arduino IDE串行监视器上。

5. 输出

在输出中,您可以看到我们在Arduino IDE代码中定义的相同字符串显示在Arduino IDE串行监视器上。

6. 利用ESP32实现MicroSD卡的不同功能

我们可以直接通过Arduino IDE代码在MicroSD卡中执行各种操作,如创建、删除或添加目录。

6.1. 创建MicroSD卡目录

下面的代码将在MicroSD卡内创建一个新目录。它定义了一个名为createDir的函数,该函数接受一个文件系统对象(fs:: fs)和一个路径作为输入。这个函数尝试用指定的路径创建目录,并打印成功或失败的消息。

  1. include“FS.h”



  1. include“SD.h”



  1. include“SPI.h”



void createDir(fs:: fs &fs, const char * path){



系列。printf("创建目录:%sn", path);



如果(fs.mkdir(路径)){



系列。println(“Dir”);



} else {



系列。println(“mkdir失败”);



}



}



无效的设置(){



 



Serial.begin (115200);



//初始化SD卡



如果(! SD.begin ()) {



系列。println("挂载卡失败");



返回;



}



//创建一个名为mydir的目录



createDir (SD / mydir”);



}



无效循环(){



 



}

在输出中,您可以看到创建了一个名为/mydir的新目录。

6.2. 列出MicroSD卡中的目录

在下面的代码中,我们将列出MicroSD卡中存在的所有目录。listDir函数递归地列出SD卡上目录的内容。它打印关于目录(以“DIR”为前缀)和文件(以“FILE”为前缀)的信息,包括它们的名称和大小。

  1. include“FS.h”


  1. include“SD.h”


  1. include“SPI.h”



void listDir(fs:: fs &fs, const char * dirname, uint8_t级别){


系列。printf("清单目录:%sn",目录名);


文件root = fs.open(dirname);


if (!root) {


系列。println("打开目录失败");


返回;


}


if (!root.isDirectory()) {


系列。println("非目录");


返回;


}


文件File = root.openNextFile();


while (file) {


if (file.isDirectory()) {


            系列。print(" DIR: ");


            以file.name ());


if (levels) {


                listDir (fs file.name(), - 1)水平;


            }


} else {


            系列。print(" FILE: ");


            并同时file.name ());


            系列。print(" SIZE: ");


            以file.size ());


}


file = root.openNextFile();


}


}



无效设置(){


Serial.begin (115200);


if (!SD.begin()) {


系列。println("挂载卡失败");


返回;


}


listDir(SD, "/", 0);


}



Void loop() {


   


}

在输出中,您可以看到两个不同的文件。一个是文本文件,另一个是我们在前面的代码中创建的目录。

6.3. 删除目录

现在我们将删除之前创建的目录和文本文件。为此,我们将使用removeDir函数,它将尝试删除由路径指定的目录。如果成功,它打印Dir removed;否则,它打印rmdir失败。

  1. include“FS.h”


  1. include“SD.h”


  1. include“SPI.h”



void removeDir(fs:: fs &fs, const char *path) {


系列。printf("删除目录:%sn", path);


if (fs.rmdir(path)) {


系列。println(“Dir删除”);


} else {


系列。println(“删除文件夹失败”);


}


}



无效设置(){


Serial.begin (115200);



if (!SD.begin()) {


系列。println("挂载卡失败");


返回;


}



   


}



Void loop() {


   


}

6.4. 获取MicroSD卡类型

MicroSD卡或安全数字卡最初是由SD卡协会设计的,用于智能手机和相机等便携式设备。SD卡主要有四种家庭类型:

  • SDSC(标准容量SD):这些存储卡提供2GB的适度存储容量,并使用FAT-12和FAT-16文件系统。
  • SDHC(高容量SD):这些卡的范围从2GB到32GB,使用FAT-32文件系统。
  • SDXC (eXtended Capacity SD):这些存储卡使用exFAT文件系统,从32GB到高达2TB。
  • SDIO: SDIO卡具有数据存储和输入/输出功能的双重功能。

要检查卡片类型,请运行以下代码:

  1. include“FS.h”


  1. include“SD.h”


  1. include“SPI.h”



无效设置(){


Serial.begin (115200);



if (!SD.begin()) {


系列。println("挂载卡失败");


返回;


}



uint8_t cardType = SD.cardType();


if (cardType == CARD_NONE) {


系列。println(“未连接SD卡”);


返回;


}



系列。打印(“SD卡类型:”);


if (cardType == CARD_MMC) {


以(MMC);


}如果(cardType == CARD_SD) {


以“SDSC”);


}如果(cardType == CARD_SDHC) {


以“SDHC”);


} else {


以“未知”);


}



uint64_t cardSize = SD.cardSize() / (1024 * 1024);


系列。printf("SD卡大小:%lluMBn", cardSize);


}



Void loop() {


}

因为我有一个32GB的卡,你可以看到它属于SDHC卡的范围。

6.5. 获取MicroSD卡大小

您也可以通过上传以下代码到ESP32板来获取SD卡的大小。

  1. include“FS.h”


  1. include“SD.h”


  1. include“SPI.h”



无效设置(){


Serial.begin (115200);



if (!SD.begin()) {


系列。println("挂载卡失败");


返回;


}



uint8_t cardType = SD.cardType();


if (cardType == CARD_NONE) {


系列。println(“未连接SD卡”);


返回;


}



uint64_t cardSize = SD.cardSize() / (1024 * 1024);


系列。printf("SD卡大小:%lluMBn", cardSize);



//其他函数(listDir, createDir, removeDir等)可以在这里调用


}



Void loop() {


 


}

从输出中,您可以看到我有一个大约30GB的SD卡。

结论

MicroSD卡模块通过ESP32单板实现SD卡的数据读写。MicroSD卡模块通过SPI接口与单片机进行通信。因此,您既可以使用SPI库,也可以在代码中定义自己的SPI引脚。一旦连接上,您就可以读写文本文件,或者在SD卡中创建新目录。