Arduino-SD库资料制作:Dapenson
SD库
SD库简介
Arduino向SD卡读写数据
Arduino读取SD卡根目录内容
Arduino在SD卡上创建和删除文件
SD库函数
SD库简介
SD库实现了Arduino对SD卡的读取和写入。它基于William Greiman的SdFat 库进行开发。SD库在标准SD卡和SDHC卡上支持FAT16
和FAT32
文件系统模式。
使用SD库中函数里参数可以包含以正斜杠/
分隔的路径,例如" directory / filename.txt"
。由于工作目录始终是SD卡的根目录,因此无论文件名是否包含斜杠,其名称都指向同一文件(例如," / file.txt"
等同于" file.txt"
)。从1.0版开始,SD库支持打开多个文件。
开发板与SD卡之间的通信使用SPI
,注意:
必须连接SS
引脚来选择SD卡。在UNO上,SS默认是为引脚D10
,在MEGA2560上SS默认为引脚53
,
或着您也可以在SD.begin()
函数中指定一个SS引脚并与之连接。请注意,在您自定义了SS引脚之后,请设置该引脚为输出模式,否则SD库无法正常工作(建议初学者根据太极创客提供的电路连线图进行连接)
1 硬件需求
SD卡读写模块(SPI)
常用的SD卡读写模块根据SD卡和TF卡可分为以上两种,
一种是上图左边的模块( MicroSD Card Adapter), 它是 Micro sd卡读写模块,通过文件系统及SPI接口驱动
程序单片机系统即可完成 Microsd卡内的文件进行读写。 Arduino用户可直接使用 Arduino IDE自带的SD卡程序库即可完成卡的初始化和读写
模块特点:
1. 支持 Micro sd卡、 Micro soho卡(高速卡)
2. 板载电平转换电路,即接口电平可为5V或3.3V
3. 供电电源为45V~5.5V,板载3.3V稳压电路
4. 通信接口为标准SPI接口
5. 4个M2螺丝定位孔,便于安装
控制接口:共6个引脚(GND、VCC、MOSI、MISO、SCK、CS)
GND为地,VCC为供电电源,MOSI、MISO、SCK为SPI总线
CS为片选信号脚;
详细参数:
另外一种是上图右边的模块( SD Card Module), 它是 SD卡读写模块,同样的也是通过文件系统及SPI接口驱动
程序单片机系统即可完成SD卡内的文件进行读写。 因此左右两个版本的模块虽然尺寸和支持的卡大小不同, 但是功能和性能是一样的 , 您可以根据自己的需求进行选购, 在某宝搜索 “SD卡模块” 即可找到这两种Sd卡模块.
2 电路连接
读写模块多采用SPI进行电路连接的,为了方便大家参考,下表列出了不同Arduino板上的SPI的连线:
您可以根据自己的开发板类型进行连线
下面以UNO和MEGA 2560为例,将SD卡读写模块连接在开发板对应的SPI引脚上
1 2 3 4 5 6 |
(SD) - (UNO) - (2560) MOSI - 11 - 51 MISO - 12 - 50 SCK - 13 - 52 CS - 10 - 53 |
Arduino向SD卡读写数据
为了演示,我们这里使用开发板默认的SS引脚,电路示意图见上.太极创客(www.taichi-maker.com)
如果您需要使用自定义CS引脚,则需要在setup()中,使用SD.begin()
将指定引脚定义为CS
引脚,
定义之后一定要设置该引脚为输出模式,否则无法正常工作,具体参考SD.begin()
函数页面.
在本示例,将在setup()中使用函数SD.open()
创建一个名为" test.txt"
的新文件。其中参数FILE_WRITE
意为将从结尾开始启用对文件的读写。如果卡上已经有文件" test.txt"
,则打开该文件。
将打开的文件的实例化对象命名为" myFile"
。
打开后,用myFile.println()
函数将字符串写入SD卡。内容写入后,关闭文件。
为了验证是否写入成功,我们再次使用打开文件,使用SD.open()
。打开以后,使用SD.read()
读取信息然后通过串行监视器打印里面的数据。读取文件的所有内容后,请使用SD.close()
关闭文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
/********************************************************************** 程序名称/Program name : 使用SD库读写文件 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/18 程序目的/Purpose : 演示如何使用UNO和SD卡读写模块进行文件的读写 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: ***********************************************************************/ #include <SPI.h> #include <SD.h> // 创建File实例化对象 File myFile; void setup() { // 初始化硬件串口并设置波特率为9600 Serial.begin(9600); while (!Serial) { ; //等待串口打开 } Serial.print("Initializing SD card..."); //注意,必须将CS引脚设置为输出模式,否则SD库功能将不起作用。 //此处将10引脚作为CS并设置为输出OUTPUT模式 // pinMode(cs, OUTPUT); if (!SD.begin()) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); //打开文件。 请注意,一次只能打开一个文件 //您必须先关闭该文件再打开另一个文件。 myFile = SD.open("test.txt", FILE_WRITE); // 如果文件打开,则进行写入 if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // 关闭文件打开状态 myFile.close(); Serial.println("done."); } else { //如果文件没有打开,则向串口输出文件打开错误 Serial.println("error opening test.txt"); } // 重新读取该文件<span style="color: #ffffff;">太极创客(www.taichi-maker.com)</span> myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); //从文件里读取数据并打印到串口,直到读取完成 while (myFile.available()) { Serial.write(myFile.read()); } // 关闭文件打开状态 myFile.close(); } else { //如果文件没有打开,则向串口输出文件打开错误 Serial.println("error opening test.txt"); } } void loop() { } |
效果演示
通过串口反馈的信息太极创客(www.taichi-maker.com)
Arduino读取SD卡根目录内容
本示例说明如何列出SD卡目录中的有效的文件(文件名不可含中文字符)。
使用自定义的printDirectory
函数扫描SD卡根目录,并通过串口监视器反馈的形式打印根目录下存在的每个文件和文件夹。对于单独文件,还将打印文件的大小。太极创客(www.taichi-maker.com)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
/********************************************************************** 程序名称/Program name : 使用SD库读取根目录内容 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/18 程序目的/Purpose : 演示如何使用UNO和SD卡读取SD卡根目录的内容 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本程序来源于以下链接,由Dapenson进行整理和注释, 目的是为了让初学者更好的理解和学习相关内容 https://www.arduino.cc/en/Reference/SD ***********************************************************************/ #include <SPI.h> #include <SD.h> // 创建File实例化对象 File myFile; void setup() { // 初始化硬件串口并设置波特率为9600 Serial.begin(9600); while (!Serial) { ; //等待串口打开 } Serial.print("Initializing SD card..."); if (!SD.begin()) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); //打开文件。 请注意,一次只能打开一个文件 //您必须先关闭该文件再打开另一个文件。 myFile = SD.open("/"); printDirectory(myFile, 0); Serial.println("done!"); } void loop() { } void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (!entry) { // 如果没有文件则跳出循环 break; } for (uint8_t i = 0; i < numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { // 文件会大小,文件夹则不打印大小 Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); } } |
效果演示
为了更好地读取根目录下的内容,我们事前在根目录下创建多个类型的文件以展示本程序的功能
串口打印演示
可以看到Arduino串口监视器打印出了SD卡内所有的文件及其文件大小,如果是文件夹则打印文件夹中的内容.
Arduino在SD卡上创建和删除文件
本示例说明如何在SD卡上新建和删除文件
在本示例,将在setup()中使用函数SD.open()
创建一个名为" test.txt"
的新文件。使用FILE_WRITE
模式启用对文件的读写。注意,读写完成后请通过myFile.close()
函数关闭文件。
读写完成以后,请使用SD.exists()
检查文件是否存在。
最后,使用SD.remove()
从SD卡中删除文件。太极创客(www.taichi-maker.com)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
/********************************************************************** 程序名称/Program name : 使用SD库新建和删除文件 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/18 程序目的/Purpose : 演示如何使用Arduino开发板在SD卡中新建文件和删除文件 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本程序来源于以下链接,由Dapenson进行整理和注释, 目的是为了让初学者更好的理解和学习相关内容 https://www.arduino.cc/en/Reference/SD ***********************************************************************/ #include <SPI.h> #include <SD.h> // 创建File实例化对象 File myFile; void setup() { // 初始化硬件串口并设置波特率为9600 Serial.begin(9600); while (!Serial) { ; //等待串口打开 } Serial.print("Initializing SD card..."); // 检测是否初始化完成 if (!SD.begin()) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); // 查看是否存在"example.txt"文件 if (SD.exists("example.txt")) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } // 打开一个新文件,然后立即将其关闭(创建文件) Serial.println("Creating example.txt..."); myFile = SD.open("example.txt", FILE_WRITE); myFile.close(); // 检查该文件是否新建成功 if (SD.exists("example.txt")) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } //删除该文件 Serial.println("Removing example.txt..."); SD.remove("example.txt"); if (SD.exists("example.txt")) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } } void loop() { } |
效果演示太极创客(www.taichi-maker.com)
SD库函数
SD类的函数提供用户用于访问SD卡并处理其中文件和目录的功能。太极创客(www.taichi-maker.com)
begin()
exists()
mkdir()
open()
remove()
rmdir()
FILE类函数
File类的函数允许读取和写入SD卡上的单个文件。
注意:SD库中FILE类属于Stream类的子类。因此用法与Serial、WiFiClient等是一致的,
详情可查看太极创客Stream教程
name()
available()
close()
flush()太极创客(www.taichi-maker.com)
peek()
position()
print()
println()
seek()
size()
read()
write()
isDirectory()
openNextFile()
rewindDirectory()