在本教程中,我们将学习如何使用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 */ #includeh > # include < SPI。h >文件myFile;int pinCS = 53;// Pin 10 on Arduino Uno void setup() {Serial.begin(9600);pinMode (pinCS、输出);// SD卡初始化if (SD.begin()) {Serial. begin();println("SD卡可以使用了");} else{连续的。SD卡初始化失败;返回;} //创建/打开文件myFile = SD.open("测试。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库,创建一个“File”对象并定义SPI总线的ChipSelect引脚,在我的例子中是Arduino Mega板的引脚53。在这个例子中,我们希望我们的代码只被执行一次,所以所有的代码将被放置在“设置”部分,而“循环”部分将保持空。
因此,首先我们需要启动串行通信并将ChipSelect引脚定义为输出。我们必须这样做,因为ChipSelect pin需要是“低”的,以便模块和Arduino之间的SPI通信工作。
接下来,使用SD.BEGIN()函数,我们将初始化SD卡,如果初始化是成功的“如果”语句将变为真,则字符串“SD卡即可使用”。将打印在串行监视器上,否则将打印字符串“SD卡初始化失败”,并且还将终止程序。
接下来,使用SD.open()函数,我们将创建一个名为“test”的新文件。,包括FILE_WRITE参数,这意味着我们既可以读也可以写文件。如果文件已经存在,则SD.open()函数将直接打开它。
因此,如果文件已经成功创建,首先我们将在串行监视器上打印字符串“Writing to file”,然后使用myFile.println()函数将文本“Testing text 1,2,3…”打印到文件中。之后,我们需要使用close()函数来确保之前写入文件的数据被物理地保存到SD卡中。
接下来,我们将看到如何从文件中读取。因此,我们将再次使用相同的函数SD.open(),但这次是文件“test”。,函数只会打开文件。然后使用myFile.read()函数读取文件并在串行监视器上打印出来。read()函数实际上一次只读取一个字符,因此我们需要使用“while”循环和myFile.available()函数来读取所有字符或之前写入的全部数据。最后,我们需要关闭该文件。
现在将代码上传到Arduino之后,如果一切正常,串行监视器上将出现以下内容。
正如我们所看到的,SD卡已经成功初始化,对它的写入也已经成功,并且读取写入的数据或字符串“Testing text 1, 2,3…”已经成功读取。如果我们打开电脑上的SD卡,我们可以看到创建的“test”。txt”文件和其中的书面文本。
Arduino SD卡数据记录
现在让我们来做另一个更有趣的例子,它记录温度传感器的数据。为此,我们将使用DS3231实时时钟模块,它也有一个内置的温度传感器。您可以在my . com中找到关于如何连接和使用这个模块的更多细节前一教程。
因此,在将两个模块连接到Arduino之后,让我们看看这个示例的代码。
/* * Arduino温度数据记录* * by Dejan Nedelkovski, www.HowToMechatronics.cobet188官方网站m */ #include# include < SPI。h > # include < DS3231。h >文件myFile;sci DS3231 rtc (SDA);int pinCS = 53;// Pin 10 on Arduino Uno void setup() {Serial.begin(9600);pinMode (pinCS、输出);// SD卡初始化if (SD.begin()) {Serial. begin();println("SD卡可以使用了");} else{连续的。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); }
代码说明:首先,我们需要包含两个模块所需的库,然后创建两个对象,并在setup部分对它们进行初始化。
在loop部分使用serial .print()函数,我们将打印串行监视器上的时间和温度值,在时间和温度值之间使用“逗号”字符,并在温度值之后新建一行。我们需要这种形式的线,以便我们可以很容易地导入它们,并在Excel中制作图表。还要注意,温度值被转换为整数。
因此,这些相同的值也将写入新创建的“test”中。在最后,我们只需要添加一个延迟,这将表示记录温度数据的时间间隔。
上传代码后,Arduino将开始每3秒存储一次温度值。过一会儿,我们可以打开电脑上的SD卡,看看结果。
为了在Excel中创建一个图表,我们需要导入这个文件,下面是我们的操作方法:
在数据菜单中,我们需要点击“Get data From Text”按钮并选择文本文件。在这里,我们将选择“Delimited”并单击next,在第二步中,选择逗号作为分隔符,然后完成向导。
所以这个过程会把时间和温度值插入到单独的列中。现在我们只需要选择这两个列,并从插入菜单中选择“插入折线图”。这将创建一个图表,我们可以看到每3秒的温度值。
这就是本教程的全部内容,欢迎在下面的评论部分提出任何问题。
你好,
伟大的教程,我如何创建txt文件的名字随机?像日期”01102016。自动通过ardu。
谢谢。您可以尝试在myFile = SD.open(" test. open ")中使用一个字符串变量。函数,而不是“text. txt”,FILE_WRITE)。例如,文件名fileName = " 01102016.txt "。我不确定这是否有效,你应该试着告诉我们。
好主意!它可以使用字符串加法操作符。从RTC获取值后,我们可以自动分配“mmddyyyy”。然后整理出文件列表。
这就跟你问声好!伟大的教程!
我设法找到了创建文件名的解决方案,我决定将它分享给任何需要它的人。通过这种方式,您可以根据字符串(y)的名称保存文件:
字符串x;
字符串y;
y =“测试”;
x = String(y + " .txt ");
myFile = SD.open(x.c_str(), FILE_WRITE);
谢谢你的评论!
嗨
在Arduino mega2560(R3) pin #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.
这就跟你问声好!
伟大的教程!我是个小问题,但我解决了。我应得的pin分配和Mega的不一样。这里是连接:
CS - >销10
接地- >接地
MISO,MOSI,SCK->SPI为SAM3X8E(板的中心)
谢谢,
Z。
谢谢!每个Arduino都有不同的SPI通信引脚。
请使用带有标签+钥匙链的MFRC522系统。
谢谢!我很喜欢你的教程。
谢谢。我的待办事项清单上有这个。我希望我能快点来。
能分享一下Arduino SD卡和数据记录教程下载SD.h和SPI.h的链接吗?
这些是常规的Arduino库,应该包含在Arduino安装中。当然,你总是可以使用管理库选项,素描>包括库>管理库…,以插入新的库。
伟大的教程!谢谢你的帮助!
是的,谢谢!
感谢Dejan的指导。我想知道你是否会把一个先进的教程,将你的许多老教程结合在一起:
—温湿度传感器
- LCD屏幕数据
——数据记录
-无线
使用额外的组件,如:
二氧化碳
光电传感器
我真的很感激。有办法为这样的教程捐款吗?
谢谢你,德扬!
谢谢!是的,这是个好主意,也是个有趣的项目。我总有一天会做一个的。