6-3 离线工作

如果您的数据更敏感,并且您不希望通过Wi-Fi网络共享数据,或者您没有Wi-Fi连接,则解决方案是将数据存储在SD卡上。
让我们看看如何将数据存储在SD卡上。
将使用的必要硬件:

  • Wemos D1 mini:

  •  microSD card shield(microSD 卡槽):

  • microSD 卡:

由于microSD卡是Wemos D1 mini的盖子,因此很容易堆叠它们;你只需要焊接进入包装的引脚:

让我们用下面包含 SPI.h SD.h 库的工程代码确定SD卡的大小

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

使用 SD 实用程序库函数设置变量:

Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = D8; 

在 setup 函数中,我们将确定是否插入了卡,并且将通过SPI读取卡的详细信息:


void setup()
{
  Serial.begin(115200);
  Serial.print("nInitializing SD card. ..");

使用实用程序库中的初始化代码:

扫描二维码关注公众号,回复: 5551517 查看本文章

  if (!card.init(SPI_HALF_SPEED, chipSelect) )
  {
    Serial.println( "initialization failed Things to check:") ;
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.") ;
  }
  // 打印卡的类型
  Serial.print("nCard 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. nMake sure you've formatted the card");
    return;
  }
  //打印第一个FAT类型卷的类型和大小uint32 t volumesize;
  Serial.print("nVolume type is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();
  volumesize = volume.blocksPerCluster(); //集群是块的集合。
  volumesize *= volume.clusterCount(); // 我们有很多集群
  volumesize *= 512; // SD卡块总是512字节
  Serial.print("Volume size (bytes):");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes):");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print( "Volume size (Mbytes):");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.println("nFiles found on the card (name,dateandsizeinbytes):");
  root.openRoot(volume);
  //列出卡中包含日期和大小的所有文件
  root.ls(LS_R | LS_DATEI | LS_SIZE);
}

在 loop 函数中没啥需要干的,因为在 setup 函数中确定了卡类型及其属性:

void loop( )
  //setup 后没有任何反应
}

串行控制台的输出将显示卡类型,卡大小(字节,千字节和兆字节),如果卡上有一些文件,它们的名称和大小:

您还可以使用更大的 SDHC 卡或 FAT32 卡:

猜你喜欢

转载自blog.csdn.net/countofdane/article/details/88591951
6-3