在本Arduino教程中,我们将学习如何在Arduino板上使用SD卡模块。此外,结合DS3231实时时钟模块,我们将制作一个数据记录示例,在该示例中,我们将温度传感器的数据存储到SD卡中,并将其导入Excel以制作图表。您可以观看以下视频或阅读下面的书面教程。
betway
首先让我们看一下SD卡模块。它与工作电压为3.3 V的标准MicroSD卡一起工作。因此,该模块具有一个电压调节器和一个电平移位器,因此我们可以将其与Arduino板的5 V引脚一起使用。
SD卡模块有6个引脚,2个用于模块供电,VCC和GND引脚,4个用于SPI通信。这是我们需要连接到Arduino板的方法。
注意,每个Arduino板有不同的SPI引脚,应该连接相应的。
您可以从以下链接获取本Arduino教程所需的组件:
- Micro SD卡模块………………。。亚马逊/Banggood/阿里巴巴全球速卖通
- Arduino董事会……………………………亚马逊/Banggood/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/Banggood/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一名亚马逊员工,我通过符合条件的购买赚取收入。
Arduino SD卡模块代码
接下来我们需要给Arduino编程。下面是一个简单的代码:
/* * Arduino SD卡教程示例* * by Dejan Nedelkovski, www.HowToMechatronics.bet188官方网站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板的引脚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卡已成功初始化,对SD卡的写入也已成功,并且读取写入的数据或字符串“Testing text 1,2,3…”已成功读取。如果我们打开计算机上的SD卡,我们可以看到创建的“test.txt”文件和其中的书面文本。
Arduino SD卡数据记录
现在让我们做另一个更有趣的数据记录温度传感器的例子。为此,我们将使用DS3231实时时钟模块,它也有一个内置的温度传感器。你可以在我的页面中找到更多关于如何连接和使用这个模块的细节前一教程.
因此,在将两个模块连接到Arduino之后,让我们看一下这个示例的代码。
/* * Arduino Temperature Data Logging * * by Dejan Nedelkovski, www.bet188官方网站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文件名随机?类似于ardu自动生成的日期“01102016.txt”。
谢谢。你可以尝试在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安装中。当然,您始终可以使用“管理库”选项“草图>包含库>管理库…”插入新库。
伟大的教程!谢谢你的帮助!
是的,谢谢!
感谢Dejan提供的教程。我想知道你是否可以把你的许多老教程结合在一起的高级教程:
–温度/湿度传感器
- LCD屏幕数据
——数据记录
-无线
与额外的组件,如:
二氧化碳
-光电传感器
我会非常感激的。有没有办法为这样的教程捐款?
谢谢你,德扬!
谢谢!是的,这是个好主意,而且会是一个有趣的项目。总有一天我会做出来的。