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