在这个Arduino教程中,我们将学习如何使用Arduino板的SD卡模块。此外,结合DS3231实时时钟模块,我们将做一个数据记录示例,我们将存储温度传感器的数据到SD卡,并将其导入Excel,以制作图表。你可以观看下面的视频或阅读下面的书面教程。
亚博88下载
首先让我们看看SD卡模块。兼容标准MicroSD卡,工作电压为3.3 V。所以这个模块有一个稳压器和一个液位转换器,我们可以和Arduino Board的5个V引脚一起使用。

SD卡模块有6个引脚,2个用于模块供电,VCC和GND引脚,4个用于SPI通信。这是我们需要连接到Arduino板的方法。

注意,每个Arduino板有不同的SPI引脚,应该连接相应的。

你可以从下面的链接获得这个Arduino教程所需的组件:
- Micro SD卡模块....................亚马逊/Banggood/阿里巴巴全球速卖通
- Arduino电路板 .................................亚马逊/Banggood/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/Banggood/阿里巴巴全球速卖通
yaboAG娱乐城披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。
Arduino SD卡模块代码
接下来我们需要给Arduino编程。下面是一个简单的代码:
/* * Arduino SD卡教程示例* * by Dejan Nedelkovski, www.HowToMechatronics.亚搏手机版官方下载com */ #include#include File myFile;int pcs = 53;//在Arduino Uno上的Pin 10 void setup() {Serial.begin(9600);pinMode (pinCS、输出);// SD卡初始化if (SD.begin()) {Serial。println("SD卡已准备好使用");} else {Serial。println("SD卡初始化失败");返回;} //创建/打开文件myFile = SD.open("test.txt", FILE_WRITE);//如果文件打开了,写入它:println(“写入文件…”); // Write to file myFile.println("Testing text 1, 2 ,3..."); myFile.close(); // close the file Serial.println("Done."); } // if the file didn't open, print an error: else { Serial.println("error opening test.txt"); } // Reading the file myFile = SD.open("test.txt"); if (myFile) { Serial.println("Read:"); // Reading the whole file while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } else { Serial.println("error opening test.txt"); } } void loop() { // empty }
代码说明:因此,首先我们需要包括标准的SD和SPI库,创建一个“文件”对象,并定义SPI总线的ChipSelect引脚,在我的情况下,Arduino Mega Board的引脚53。对于这个例子,我们希望我们的代码只执行一次,所以所有的代码将被放置在“setup”部分,而“loop”部分将保持空。
因此,首先我们需要启动串行通信,并定义ChipSelect引脚作为输出。我们必须这样做,因为ChipSelect引脚需要是“低”,以便模块和Arduino之间的SPI通信工作。
接下来,使用SD.begin()函数初始化SD卡,如果初始化成功," if "语句将变为true, String " SD卡已准备好使用。,否则将打印字符串“SD卡初始化失败”,程序也将终止。
接下来,使用SD.open()函数,我们将创建一个名为“test.txt”的新文件,包括FILE_WRITE参数,这意味着我们可以读取和写入文件。如果文件已经存在,则SD.open()函数将直接打开它。
因此,如果文件已经成功创建,首先我们将在串行监视器上打印字符串“Writing to file”,然后使用myFile.println()函数,我们将打印文本“Testing text 1,2,3…”到文件中。之后,我们需要使用close()函数来确保之前写入文件的数据被物理保存到SD卡。
接下来,我们将看到如何从文件中读取数据。因此,我们再次使用相同的函数,SD.open(),但这一次,由于文件test.txt已经创建,该函数将打开文件。然后使用myFile.read()函数,我们将从文件中读取并在串行监视器上打印它。read()函数实际上每次只读取一个字符,因此我们需要使用" while "循环和函数myFile.available()来读取所有字符或之前写入的全部数据。最后,我们需要关闭文件。
现在把代码上传到Arduino后,如果一切正常,串口显示器上会出现如下图

正如我们所看到的,SD卡已经成功初始化,对它的写入已经成功,也已经读取写入的数据或字符串“Testing text 1,2,3…”已经成功读取。如果我们打开电脑上的SD卡,我们可以看到创建的“test.txt”文件和其中的书面文本。
Arduino SD卡数据记录
现在让我们做另一个更有趣的数据记录温度传感器的例子。为此,我们将使用DS3231实时时钟模块,它也有一个内置的温度传感器。你可以在我的页面中找到更多关于如何连接和使用这个模块的细节前一教程.
因此,在将两个模块连接到Arduino之后,让我们看一下这个示例的代码。
/* * Arduino Temperature Data Logging * * by Dejan Nedelkovski, www.亚搏手机版官方下载HowToMechatronics.com */ #include#include #include File myFile;sci DS3231 rtc (SDA);int pcs = 53;//在Arduino Uno上的Pin 10 void setup() {Serial.begin(9600);pinMode (pinCS、输出);// SD卡初始化if (SD.begin()) {Serial。println("SD卡已准备好使用");} else {Serial。println("SD卡初始化失败");返回;} rtc.begin (); } void loop() { Serial.print(rtc.getTimeStr()); Serial.print(","); Serial.println(int(rtc.getTemp())); myFile = SD.open("test.txt", FILE_WRITE); if (myFile) { myFile.print(rtc.getTimeStr()); myFile.print(","); myFile.println(int(rtc.getTemp())); myFile.close(); // close the file } // if the file didn't open, print an error: else { Serial.println("error opening test.txt"); } delay(3000); }
代码说明:首先,我们需要包含两个模块所需的库,然后创建两个对象,并在设置部分初始化它们。
在使用serial .print()函数的循环部分中,我们将在串行监视器上打印时间和温度值,在它们之间用一个“逗号”字符隔开,温度值之后再换行。我们需要这种形式的线,以便我们可以轻松地导入它们,并在Excel中制作图表。还要注意,温度值被转换成整数。
因此,这些相同的值也将被写入新创建的“test.txt”文件,在最后,我们只需要添加一个延迟,它将表示记录温度数据的间隔。
上传代码后,Arduino将开始每3秒存储一次温度值。过一会儿,我们可以打开电脑上的SD卡,看看结果。

为了在Excel中创建图表,我们需要导入这个文件,下面是我们要做的:
从数据菜单中,我们需要点击“从文本获取数据”按钮,并选择文本文件。在这里,我们将选择“Delimited”,然后单击next,在第二步中,选择逗号作为分隔符,然后完成向导。
这个过程将把时间值和温度值插入到不同的列中。现在我们只需要选择这两列,并从插入菜单中选择“插入折线图”。这将创建一个图表,我们可以看到每3秒的温度值。

这就是本教程的全部内容,请在下面的评论部分提出任何问题。
你好,
伟大的教程,我如何创建TXT文件名称随机?喜欢日期“01102016.txt”自动由ardu。
谢谢。你可以尝试在myFile = SD.open(" test.txt ", FILE_WRITE)函数中使用一个字符串变量,而不是" text.txt ",例如一个名为fileName = " 01102016.txt "的字符串。不确定它是否有效,你应该试着告诉我们。
好主意!它可以使用字符串加法操作符。从RTC获取值,我们可以自动分配“mmddyyyy.txt”,并提出和组织的文件列表。
这就跟你问声好!伟大的教程!
我设法找到了创建文件名的解决方案,并决定将其分享给任何需要它的人。这样,你就可以根据字符串的名称(y)来保存文件:
字符串x;
字符串y;
y =“测试”;
x = String(y + " .txt ");
myFile = SD.open(x.c_str(), FILE_WRITE); / /打开文件
谢谢你的评论!
嗨
在Arduino mega2560(R3)引脚#50是MISO, #51是MOSI
图中的绿线和蓝线必须更换。
谢谢
这是正确的。Although it’s stated that MISO goes to MISO and MOSI to MOSI, I have drawn those line wrong. Thanks for the remark. The circuit schematic is now updated.
这就跟你问声好!
伟大的教程!我是个小问题,但我解决了。我的DUE的pin分配和Mega的不一样。这里是联系:
CS - >销10
接地- >接地
MISO,MOSI,SCK-> SAM3X8E的SPI(板的中心)
谢谢,
Z。
谢谢!是的,每个Arduino都有不同的SPI通信引脚。
请给出关于RFID 13.56MHz的教程,请使用带有标签+钥匙链的MFRC522系统。
谢谢!我很喜欢你的辅导课。
谢谢。我的任务清单上有这个。我希望我能很快做到。
请问Arduino SD Card and Data Logging tutorial可以分享下载SD.h和SPI.h的链接吗?
这些都是常规的Arduino库,应该包含在您的Arduino安装中。当然,你也可以使用管理库选项,Sketch > Include Library > Manage Libraries…来插入新的库。
伟大的教程!谢谢你的帮助!
是的,谢谢!
感谢Dejan提供的教程。我想知道你是否可以把你的许多老教程结合在一起的高级教程:
—温湿度传感器
- LCD屏幕数据
——数据记录
-无线
与额外的组件,如:
二氧化碳
光电传感器
我真的很感激。有办法为这样的教程捐款吗?
谢谢你,德扬!
谢谢!是的,这是个好主意,而且会是一个有趣的项目。总有一天我会做出来的。