风筝
发表于: 2018-11-17 21:22:10 | 显示全部楼层

在本篇文章中,我们将学习如何基于Arduino开发板使用一个SD卡模块。同时结合DS3231实时时钟模块,我们将制作一个数据记录仪的示例,在示例中,我们将温度传感器的数据存储到SD卡中,并将这些数据导入到Excel中以制作图表。


Arduino SD卡模块

首先让我们来看看SD卡模块。它适用于标准MicroSD卡,工作电压为3.3 V。因此,该模块带有稳压器和电平转换器,因此我们可以将其与Arduino电路板的5 V引脚配合使用。

Arduino-SD-Card-Module.jpg

SD卡模块有六个引脚,两个用于为模块供电,VCC和GND引脚,以及另外四个用于SPI通信的引脚。以下是我们将其连接到Arduino开发板的方法。

Arduino-SD-Card-Module-Circuit-Schematics-Tutorial.png

请注意,每个Arduino开发板都有不同的SPI引脚,应相应连接。

Arduino-SPI-Pins-List.png

该示例所需的组件如下:

●    Micro SD卡模块

●    Arduino开发板

●    面包板和跳线


编程Arduino SD卡模块

接下来我们需要对Arduino进行编程。以下是这个简单的代码:

  1. /*
  2. *  Arduino SD Card Tutorial Example
  3. *  
  4. *  by Dejan Nedelkovski, www.HowToMechatronics.com
  5. */
  6. #include <SD.h>
  7. #include <SPI.h>
  8. File myFile;
  9. int pinCS = 53; // Pin 10 on Arduino Uno
  10. void setup() {
  11.    
  12.   Serial.begin(9600);
  13.   pinMode(pinCS, OUTPUT);
  14.   
  15.   // SD Card Initialization
  16.   if (SD.begin())
  17.   {
  18.     Serial.println("SD card is ready to use.");
  19.   } else
  20.   {
  21.     Serial.println("SD card initialization failed");
  22.     return;
  23.   }
  24.   
  25.   // Create/Open file
  26.   myFile = SD.open("test.txt", FILE_WRITE);
  27.   
  28.   // if the file opened okay, write to it:
  29.   if (myFile) {
  30.     Serial.println("Writing to file...");
  31.     // Write to file
  32.     myFile.println("Testing text 1, 2 ,3...");
  33.     myFile.close(); // close the file
  34.     Serial.println("Done.");
  35.   }
  36.   // if the file didn't open, print an error:
  37.   else {
  38.     Serial.println("error opening test.txt");
  39.   }
  40.   // Reading the file
  41.   myFile = SD.open("test.txt");
  42.   if (myFile) {
  43.     Serial.println("Read:");
  44.     // Reading the whole file
  45.     while (myFile.available()) {
  46.       Serial.write(myFile.read());
  47.    }
  48.     myFile.close();
  49.   }
  50.   else {
  51.     Serial.println("error opening test.txt");
  52.   }
  53.   
  54. }
  55. void loop() {
  56.   // empty
  57. }
复制代码

代码描述:首先我们需要包括标准的SD和SPI库,创建一个“File”对象并定义SPI总线的ChipSelect片选引脚,本例中为Arduino Mega开发板的引脚53。对于本示例,我们希望代码只执行一次,因此所有代码都将放在“setup函数”部分,而“loop”部分将保持为空。


首先,我们需要启动串行通信并将ChipSelect引脚定义为输出。我们必须这样做,因为ChipSelect引脚需要为“低”,以便模块和Arduino之间的SPI通信工作。


接下来,使用SD.begin()函数,我们将初始化SD卡,如果初始化成功,“if”语句将变为true,并且字符串“SD card is ready to use.”将打印在串口监视器上,否则将打印字符串“SD卡初始化失败”,程序也将终止。


接下来,使用SD.open()函数,我们将创建一个名为“test.txt”的新文件,包括FILE_WRITE参数,这意味着我们可以读取和写入文件。如果文件已经存在,SD.open()函数将只打开它。


因此,如果文件已成功创建,我们将在串行监视器上打印字符串“正在写入文件”,然后使用myFile.println()函数,我们将打印文本“Testing text 1, 2 ,3…”到文件。之后我们需要使用close()函数来确保写入文件的先前数据被物理保存到SD卡。


接下来,我们将看到如何从文件中读取。所以我们将再次使用相同的函数SD.open(),但这次由于已经创建了文件“test.txt”,该函数将只打开该文件。然后使用myFile.read()函数,我们将从文件中读取并在串行监视器上打印它。 read()函数实际上一次只读取一个字符,因此我们需要使用“while”循环和函数myFile.available()来读取所有字符或整个先前写入的数据。最后我们需要关闭文件。


现在将代码上传到Arduino后,如果一切正常,串行监视器上将显示以下内容。

SD-Card-Serial-Monitor-Results.png

正如我们所看到的,SD卡已经成功初始化,对它的写入也是成功的,并且读取书面数据或字符串“测试文本1,2,3 ......”已成功读取。如果我们在计算机上打开SD卡,我们可以看到创建的“test.txt”文件和其中的书面文本。


Arduino数据记录

现在让我们再创一个更有趣的温度传感器数据记录示例。为此,我们将使用DS3231实时时钟模块,该模块还具有内置温度传感器。您可以在我之前的教程中找到有关如何连接和使用此模块的更多详细信息。


因此,在将两个模块连接到Arduino后,让我们看看这个例子的代码。

  1. /*
  2. *  Arduino Temperature Data Logging
  3. *  
  4. *  by Dejan Nedelkovski, www.HowToMechatronics.com
  5. */
  6. #include <SD.h>
  7. #include <SPI.h>
  8. #include <DS3231.h>
  9. File myFile;
  10. DS3231  rtc(SDA, SCL);
  11. int pinCS = 53; // Pin 10 on Arduino Uno
  12. void setup() {
  13.    
  14.   Serial.begin(9600);
  15.   pinMode(pinCS, OUTPUT);
  16.   
  17.   // SD Card Initialization
  18.   if (SD.begin())
  19.   {
  20.     Serial.println("SD card is ready to use.");
  21.   } else
  22.   {
  23.     Serial.println("SD card initialization failed");
  24.     return;
  25.   }
  26.   rtc.begin();   
  27. }
  28. void loop() {
  29.   Serial.print(rtc.getTimeStr());
  30.   Serial.print(",");
  31.   Serial.println(int(rtc.getTemp()));

  32.   myFile = SD.open("test.txt", FILE_WRITE);
  33.   if (myFile) {   
  34.     myFile.print(rtc.getTimeStr());
  35.     myFile.print(",");   
  36.     myFile.println(int(rtc.getTemp()));
  37.     myFile.close(); // close the file
  38.   }
  39.   // if the file didn't open, print an error:
  40.   else {
  41.     Serial.println("error opening test.txt");
  42.   }
  43.   delay(3000);
  44. }
复制代码

代码描述:首先我们需要包含两个模块所需的库,然后创建两个对象,并在设置部分初始化它们。


在使用Serial.print()函数的循环部分中,我们将在串行监视器上打印时间和温度值,它们之间带有“逗号”字符,温度值后面有一个新行。我们需要这种形式的线条,以便我们可以轻松导入它们并在Excel中创建图表。另请注意,温度值将转换为整数。


因此,这些相同的值也将写入新创建的“test.txt”文件中,最后我们只需要添加一个延迟,它将代表记录温度数据的间隔。


上传代码后,Arduino将每隔3秒开始存储温度值。过了一会儿,我们可以在计算机上打开SD卡查看结果。

SD-Card-File-Text-txt.png

要在Excel中创建图表,我们需要导入此文件,以下是我们将如何操作:


从数据菜单中,我们需要单击“从文本中获取数据”按钮并选择文本文件。在这里,我们将选择“Delimited”并单击“next”,然后在第二步中,选择逗号作为分隔符,然后完成向导。


因此,此过程会将时间和温度值插入单独的列中。现在我们只需要选择两列,然后从插入菜单中选择“插入折线图”。这将创建图表,我们可以每3秒看到温度值。

Arduino-Data-Logging-to-Excel.png


以上就是本篇文章的全部内容,如果有什么问题请随时进行回复。

跳转到指定楼层
liangyz
发表于: 2019-7-20 13:48:30 | 显示全部楼层

能加一下qq吗?能加一下qq吗?
能加一下qq吗?
能加一下qq吗?
能加一下qq吗?

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 01:46 , Processed in 0.040367 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表