1. 程式人生 > >使用Arduino和SD卡模組記錄資料並匯出到Excel

使用Arduino和SD卡模組記錄資料並匯出到Excel

在本篇文章中,我們將學習如何基於Arduino開發板使用一個SD卡模組。同時結合DS3231實時時鐘模組,我們將製作一個數據記錄儀的示例,在示例中,我們將溫度感測器的資料儲存到SD卡中,並將這些資料匯入到Excel中以製作圖表。

 

Arduino SD卡模組

首先讓我們來看看SD卡模組。它適用於標準MicroSD卡,工作電壓為3.3 V。因此,該模組帶有穩壓器和電平轉換器,因此我們可以將其與Arduino電路板的5 V引腳配合使用。

 

SD卡模組有六個引腳,兩個用於為模組供電,VCC和GND引腳,以及另外四個用於SPI通訊的引腳。以下是我們將其連線到Arduino開發板的方法。

 

請注意,每個Arduino開發板都有不同的SPI引腳,應相應連線。

 

該示例所需的元件如下:

●    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卡已經成功初始化,對它的寫入也是成功的,並且讀取書面資料或字串“測試文字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卡檢視結果>

 

要在Excel中建立圖表,我們需要匯入此檔案,以下是我們將如何操作:

 

從資料選單中,我們需要單擊“從文字中獲取資料”按鈕並選擇文字檔案。在這裡,我們將選擇“Delimited”並單擊“next”,然後在第二步中,選擇逗號作為分隔符,然後完成嚮導。

 

因此,此過程會將時間和溫度值插入單獨的列中。現在我們只需要選擇兩列,然後從插入選單中選擇“插入折線圖”。這將建立圖表,我們可以每3秒看到溫度值。

 

有關Arduino開發板的更多文章,請參考以下連結:https://www.yiboard.com/thread-999-1-1.html