如何使用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板上:
# 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卡中创建新目录。