在本教程中,我们将学习如何使用Arduino板的SD卡模块。结合DS3231实时时钟模块,我们将制作一个数据日志示例,将温度传感器的数据存储到SD卡中,并导入到Excel中制作图表。你可以观看下面的视频或阅读下面的书面教程。
亚博88下载
首先让我们来看看SD卡模块。它适用于标准microSD卡,工作电压为3.3V。因此,该模块具有电压调节器和电平移位器,以便我们可以使用它的5 V引脚的Arduino板。
SD卡模块具有六个引脚,两个用于为模块,VCC和GND引脚供电,以及用于SPI通信的四个引脚。以下是我们如何将其连接到Arduino Board。
注意,每个Arduino板都有不同的SPI引脚,需要相应的连接。
你可以从下面的链接获得这个Arduino教程所需的组件:
- Micro - SD卡模块....................亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino电路板 .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/伯格多德/阿里巴巴全球速卖通
yaboAG娱乐城披露:这些是附属链接。作为一名亚马逊助理,我的收入来自符合条件的购买。
Arduino SD卡模块代码
接下来我们要给Arduino编程。下面是一个简单的代码:
/* * Arduino SD卡教程示例* * by Dejan Nedelkovski, www.HowToMechatronics.亚搏手机版官方下载com */ #include#include File myFile;int pinCS = 53;// Pin 10 on Arduino Uno 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(“写入文件…”);//写入文件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总线的芯片选择引脚,在我的案例中为Arduino Mega板。对于此示例,我们希望只有一次执行我们的代码,因此所有代码都将放在“设置”部分中,而“循环”部分将保持空。
因此,首先我们需要启动串行通信并将ChipSelect引脚定义为输出。我们必须这样做,因为ChipSelect pin需要是“低”的,以便模块和Arduino之间的SPI通信工作。
接下来,使用SD.begin()函数初始化SD卡,如果初始化成功,“if”语句将变为真,字符串“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卡已成功初始化,写入它的写作也取得了成功,并且还读取了书面数据或字符串“测试文本1,2,3 ...”已经成功阅读。如果我们在计算机上打开SD卡,我们可以看到创建的“test.txt”文件和其中的书面文本。
Arduino SD卡数据记录
现在让我们来做另一个更有趣的例子,它记录温度传感器的数据。为此,我们将使用DS3231实时时钟模块,它也有一个内置的温度传感器。您可以在my . com中找到关于如何连接和使用这个模块的更多细节前一教程。
因此,在将两个模块连接到Arduino之后,让我们看看这个示例的代码。
/ * * arduino温度数据记录* *由dejan nedelkovski,www.www.kuaixg.com *亚搏手机版官方下载 / #include#include #include 文件myfile;DS3231 RTC(SDA,SCL);int pinCS = 53;// Pin 10 on Arduino Uno void setup() {Serial.begin(9600);pinMode (pinCS、输出);// SD卡初始化if(sd.begin()){serial.println(“SD卡已准备好使用”);} else {serial.println(“SD卡初始化失败”);返回;} RTC.BEGIN();void循环(){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); }
代码说明:首先,我们需要包含两个模块所需的库,然后在安装部分中创建两个对象,并在安装部分初始化它们。
在loop部分使用serial .print()函数,我们将打印串行监视器上的时间和温度值,在时间和温度值之间使用“逗号”字符,并在温度值之后新建一行。我们需要这种形式的线,以便我们可以很容易地导入它们,并在Excel中制作图表。还要注意,温度值被转换为整数。
因此,这些相同的值也将写入新创建的“test.txt”文件,在最后,我们只需要添加一个延迟,这将表示记录温度数据的时间间隔。
上传代码后,Arduino将开始每3秒存储一次温度值。过一会儿,我们可以打开电脑上的SD卡,看看结果。
在Excel中创建图表,我们需要导入此文件,此处是我们将如何执行以下操作:
从数据菜单中,我们需要单击“从文本获取数据”按钮,然后选择文本文件。在这里,我们将选择“分隔”,然后单击下一步,然后在第二步中单击,选择逗号作为分隔符,然后完成向导。
因此,此过程将将时间和温度值插入单独的列中。现在我们只需要选择两个列,然后从插入菜单中选择“插入界图”。这将创建图表,我们每3秒都可以看到温度值。
这就是本教程的全部内容,欢迎在下面的评论部分提出任何问题。
你好,
伟大的教程,我如何创建txt文件的名字随机?喜欢日期“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) pin #50是MISO, #51是MOSI
必须更改原理化的绿线和蓝色。
谢谢
这是正确的。虽然它表示味噌去了Miso和MOSI,但我已经绘制了那条错了。谢谢你的评论。现在更新电路示意图。
这就跟你问声好!
伟大的教程!我是个小问题,但我解决了。我应得的pin分配和Mega的不一样。这里是连接:
CS-> Pin 10
接地- >接地
MISO,MOSI,SCK->SPI为SAM3X8E(板的中心)
谢谢,
Z。
谢谢!每个Arduino都有不同的SPI通信引脚。
请使用带有标签+钥匙链的MFRC522系统。
谢谢!我很喜欢你的教程。
谢谢。我在我的待办事项清单上有这个。我希望我能尽快努力。
能分享一下Arduino SD卡和数据记录教程下载SD.h和SPI.h的链接吗?
这些是常规的Arduino库,应该包含在Arduino安装中。当然,你总是可以使用管理库选项,素描>包括库>管理库…,以插入新的库。
伟大的教程!谢谢您的帮助!
是的,谢谢!
感谢Dejan的指导。我想知道你是否会把一个先进的教程,将你的许多老教程结合在一起:
—温湿度传感器
- LCD屏幕数据
——数据记录
-无线
使用额外的组件,如:
-CO2.
光电传感器
我真的很感激。有办法为这样的教程捐款吗?
谢谢,德州!
谢谢!是的,这是一个好主意,并将是一个有趣的项目。我会一定的一天肯定会让一个。