将 SD 卡与 Arduino 连接并获取卡信息

arduinoarduino boardsarduino idearduino programming language

在本教程中,我们将 Arduino Uno 连接到 SD 卡并提取卡信息。

电路图

电路图如下所示 −

如您所见,您需要进行以下连接 −

SD 卡座Arduino Uno
Vcc5V
GNDGND
MISO12
MOSI11
SCK13
CS10

仅对于 Vcc,请确保您的 SD 卡座以 5V 作为输入。如果它采用 3.3V,请将其连接到 Arduino Uno 上的 3.3V 引脚。

代码演练

我们将演练内置 SD 库附带的示例代码。您可以从文件 → 示例 → SD → 访问它CardInfo

或者,您可以在 GitHub 上访问它 −https://github.com/arduinolibraries/SD/blob/master/examples/CardInfo/CardInfo.ino

我们从包含 SPI 和 SD 库开始 −

#include <SPI.h>
#include <SD.h>

接下来,我们根据 SD 库中定义的对象定义一些变量。

Sd2Card card;
SdVolume volume;
SdFile root;

接下来,我们定义 chipSelect 引脚。示例代码将 chipSelect 设置为引脚 4。但是,我们已将 CS 引脚连接到 Arduino Uno 的引脚 10。因此,我们将对其进行更改。

const int chipSelect = 10;

在设置中,我们首先初始化串行,然后初始化 SD 卡(使用 chipSelect 引脚和 SPI 协议,SPI 协议的其他引脚 MISO、MOSI、SCK 在 SPI 库中默认定义)。

void setup() {
   // 打开串行通信并等待端口打开:
   Serial.begin(9600);
   while (!Serial) {
      ; // 等待串行端口连接。仅适用于原生 USB 端口
   }

   Serial.print("
正在初始化 SD 卡...");    // 我们将使用实用程序库中的初始化代码    // 因为我们只是在测试卡是否正常工作!    if (!card.init(SPI_HALF_SPEED, chipSelect)) {       Serial.println("初始化失败。需要检查的事项:");       Serial.println("* 是否插入了卡?");       Serial.println("* 您的接线正确吗?");       Serial.println("* 您是否更改了 chipSelect 引脚以匹配您的       屏蔽或模块?");       while (1);    } else {       Serial.println("接线正确,卡存在。"); }

接下来,我们使用 .type() 函数获取并打印卡的类型。

   // 打印卡的类型
   Serial.println();
   Serial.print("Card type: ");
   switch (card.type()) {
      case SD_CARD_TYPE_SD1:
         Serial.println("SD1");
         break;
      case SD_CARD_TYPE_SD2:
         Serial.println("SD2");
         break;
      case SD_CARD_TYPE_SDHC:
         Serial.println("SDHC");
         break;
      default:
         Serial.println("Unknown");
}

接下来,我们初始化卡的卷,获取卡中的簇总数以及每个簇的块数,从而获取卡中的块总数。

// 现在我们将尝试打开"volume"/"partition" - 它应该是
FAT16 或 FAT32
   if (!volume.init(card)) {
      Serial.println("Could not find FAT16/FAT32 partition.
Make sure you've formatted the card");       while (1);    }    Serial.print("Clusters: ");    Serial.println(volume.clusterCount());    Serial.print("Blocks x Cluster: ");    Serial.println(volume.blocksPerCluster());    Serial.print("Total Blocks: ");    Serial.println(volume.blocksPerCluster() * volume.clusterCount());    Serial.println();

稍后,我们打印卷的类型是 FAT 16 还是 FAT 32。此外,我们计算总卷(以 kB 为单位),因为一个块始终为 512 字节或 0.5 kB。

   // 打印第一个 FAT 类型卷的类型和大小
   uint32_t volumesize;
   Serial.print("Volume type is: FAT");
   Serial.println(volume.fatType(), DEC);
   volumesize = volume.blocksPerCluster(); // 簇是块的集合
   volumesize *= volume.clusterCount(); // 我们将拥有很多集群
   volumesize /= 2; // SD 卡块始终为 512 字节(2 个块为 1KB)
   Serial.print("卷大小 (Kb): ");
   Serial.println(volumesize);
   Serial.print("卷大小 (Mb): ");
   volumesize /= 1024;
   Serial.println(volumesize);
   Serial.print("卷大小 (Gb): ");
   Serial.println((float)volumesize / 1024.0);

最后,我们使用 openRoot() 函数列出卡上找到的所有文件,并打印日期和大小以及文件名

Serial.println("
在卡上找到的文件(名称、日期和大小(以字节为单位):");    root.openRoot(volume); // 列出卡上的所有文件以及日期和大小 root.ls(LS_R | LS_DATE | LS_SIZE);

相关文章