如何使用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莫西人味噌CLKCS
VSPIc15D19D18D5
HSPID13D12D14D15

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

2.2. 准备好SD卡

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

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

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

格式化卡片后,选择OK。

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

2.3. 原理图

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

连接线引脚配置表如下:

MicroSD卡ESP32
接地接地
VCC
CSD5
莫西人c15
SCKD18
味噌D19

3. 硬件

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

4. 代码

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

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

# include

# 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)和一个路径作为输入。这个函数尝试用指定的路径创建目录,并打印成功或失败的消息。

# include“FS.h”

# include“SD.h”

# 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”为前缀)的信息,包括它们的名称和大小。

# include“FS.h”

# include“SD.h”

# 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失败。

# include“FS.h”

# include“SD.h”

# 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卡具有数据存储和输入/输出功能的双重功能。

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

# include“FS.h”

# include“SD.h”

# 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卡的大小。

# include“FS.h”

# include“SD.h”

# 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卡中创建新目录。