Arduino SD 卡和数据记录教程
在本 Arduino 教程中,我们将学习如何将 SD 卡模块与 Arduino 板一起使用。此外,结合 DS3231 实时时钟模块,我们将制作一个数据记录示例,将温度传感器的数据存储到 SD 卡中,并将其导入 Excel 以制作图表。您可以观看以下视频或阅读下面的书面教程。
首先让我们看一下 SD 卡模块。它适用于工作电压为 3.3 V 的标准 MicroSD 卡。因此,该模块具有稳压器和电平转换器,以便我们可以将其与 Arduino Board 的 5 V 引脚一起使用。
SD 卡模块有六个引脚,两个用于为模块供电、VCC 和 GND 引脚,还有四个用于 SPI 通信的引脚。这是我们需要将它连接到 Arduino 板的方法。
请注意,每个 Arduino Board 都有不同的 SPI 引脚,应相应连接。
您可以从以下链接获取本 Arduino 教程所需的组件:
接下来我们需要对 Arduino 进行编程。这是一个简单的代码:
代码说明: 所以首先我们需要包含标准 SD 和 SPI 库,创建一个“文件”对象并定义 SPI 总线的 ChipSelect 引脚,在我的例子中是 Arduino Mega Board 的引脚 53。对于这个例子,我们希望我们的代码只执行一次,所以所有代码都将放在“setup”部分,而“loop”部分将保持为空。
所以首先我们需要启动串行通信并将 ChipSelect 引脚定义为输出。我们必须这样做,因为 ChipSelect 引脚需要为“低”,以便模块和 Arduino 之间的 SPI 通信正常工作。
接下来,使用 SD.begin() 函数我们将初始化 SD 卡,如果初始化成功,“if”语句将变为真,字符串“SD card is ready to use”。将打印在串口监视器上,否则打印字符串“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”文件和其中的文字。
现在让我们再做一个更有趣的数据记录温度传感器的例子。为此,我们将使用具有内置温度传感器的 DS3231 实时时钟模块。您可以在我之前的教程中找到有关如何连接和使用此模块的更多详细信息。
所以在将这两个模块连接到 Arduino 之后,我们来看看这个例子的代码。
代码说明: 首先我们需要包含两个模块所需的库,然后创建两个对象并在设置部分初始化它们。
在使用 Serial.print() 函数的循环部分,我们将在串行监视器上打印时间和温度值,它们之间有一个“逗号”字符,温度值后有一个新行。我们需要这种形式的线条,以便我们可以轻松地导入它们并在 Excel 中制作图表。另请注意,温度值会转换为整数。
所以这些相同的值也会被写入新创建的“test.txt”文件中,最后我们只需要添加一个延迟来表示记录温度数据的间隔。
上传代码后,Arduino 将开始每 3 秒存储一次温度值。稍后我们可以打开电脑上的 SD 卡查看结果。
为了在 Excel 中创建图表,我们需要导入这个文件,我们将这样做:
从数据菜单中,我们需要单击“从文本中获取数据”按钮并选择文本文件。这里我们选择“Delimited”并点击next,在第二步中选择逗号作为分隔符,然后完成向导。
因此,此过程会将时间和温度值插入单独的列中。现在我们只需要选择两列并从插入菜单中选择“插入折线图”。这将创建一个图表,我们可以在其中每 3 秒查看一次温度值。
这就是本教程的全部内容,请随时在下面的评论部分提出任何问题。工作原理
Arduino SD卡模块代码
/*
* Arduino SD Card Tutorial Example
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SD.h>
#include <SPI.h>
File myFile;
int pinCS = 53; // Pin 10 on Arduino Uno
void setup() {
Serial.begin(9600);
pinMode(pinCS, OUTPUT);
// SD Card Initialization
if (SD.begin())
{
Serial.println("SD card is ready to use.");
} else
{
Serial.println("SD card initialization failed");
return;
}
// Create/Open file
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.println("Writing to file...");
// 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
}
Code language: Arduino (arduino)Arduino SD 卡数据记录
/*
* Arduino Temperature Data Logging
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SD.h>
#include <SPI.h>
#include <DS3231.h>
File myFile;
DS3231 rtc(SDA, SCL);
int pinCS = 53; // Pin 10 on Arduino Uno
void setup() {
Serial.begin(9600);
pinMode(pinCS, OUTPUT);
// SD Card Initialization
if (SD.begin())
{
Serial.println("SD card is ready to use.");
} else
{
Serial.println("SD card initialization failed");
return;
}
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);
}
Code language: Arduino (arduino)
制造工艺