Arduino筆記(43):NodeMCU 使用 SD 卡紀錄AM2320溫濕度感測值

繼前幾篇實作將溫濕度感測值傳送到 Line、Gmail 及 Thingspeak,這幾種情況都是要在有網路的情況下才能將訊息傳送出去。如果沒有網路時,只能紀錄在 SD卡或資料庫內,接下來就來實作一下如何將資料存到 SD卡,下一篇再來看如何存到資料庫。

關於可以偵測溫度的感測器種類不少,如 DHT-11、DHT-22、DS18B20、AM2320 等,之前直接使用 ESP8266 的 DHT-11模組,直接用一個 GPIO 讀取溫度感測值,但是要使用 ESP-01S 連接 SD卡,發現這是不可行的,原因是 ESP-01S 只有兩個 GPIO,無法再接 SD卡,只能使用 NodeMCU 或 ESP32。當然也可以直接使用 Arduino 接 ESP-01、SD Card模組及溫度感測器,於是就實作使用 NodeMCU來將溫濕度感測值寫入 SD卡。




[AM2320溫濕度感測器]

這款小型傳感器看起來非常像流行的DHT11 / DHT22溫濕度傳感器,但不像傳統的那樣
DHT傳感器,它有一個I2C接口。它具有3%的濕度精度和0.5C的溫度精度,比起 DHT-11看起來比較精確些。規格及圖如下:
  • 電源電壓:3.1至5.5V
  • 工作範圍和精度(溫度):-40至80℃; +/- 0.5 C.
  • 工作範圍和精度(濕度):0-99%RH; +/- 3%RH
  • 輸出信號:I2C 透過單線

AM2320接線圖(來源:Instructables)

[材料]

• NodeMCU  ESP-12E x 1
• SD Card 模組 x 1
• AM2320 溫濕度感測器 x 1
• 連接線 x 10
• 麵包板 x 1

[線路圖]

NodeMCU
SD CARD
AM2320
3.3V
3.3V
Pin 1
GND
GND
Pin 3
D1
---
Pin 4
D2
---
Pin 2
D5
SCK
---
D6
MISO
---
D7
MOSI
---
D8
CS
---

[安裝AM2320 Library]

先到 Github 下載 hibikiledo/AM2320,按右邊綠色選項「Clone or download」,再選「Download ZIP」。

• 將下載的壓縮檔解壓縮,放在 Arduino 主程式下的 libraries目錄內,以我的電腦來說,Arduino安裝在 C:\User\[登入的帳號]\Documents\Arduino,點進目錄有一個 libraries的子目錄,下載後解壓縮的目錄,整個放進  libraries 目錄,重新啟動 Arduino即可。

[程式]

#include <SPI.h>
#include <SD.h>
#include <AM2320.h>

AM2320 sensor;

const int chipSelect = D8;

float temper, humidity;
File myFile;

void setup() {
  // 開啟串列通訊埠
  Serial.begin(9600);
  Serial.print("\r\nWaiting for SD card to initialise...");
  
  if (!SD.begin(chipSelect)) {         // CS接在D8
    Serial.println("Initialising failed!");
    return;
  }
  Serial.println("Initialisation completed");

  // 檢查檔案是否存在,如果存在就刪除
  if (SD.exists("example.txt"))
  {
    Serial.println("example.txt exists.");
    SD.remove("example.txt");
  } else {
    Serial.println("example.txt doesn't exist.");
  }

  // 開啟檔案,寫入標頭
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.println(F("  Humidity(%)     Temperature(*C)"));
  myFile.close();

}

void loop() {
  Serial.begin(9600);
  sensor.begin();
  if (sensor.measure()) {
      temper = sensor.getTemperature();
      humidity = sensor.getHumidity();
  }
    else {
         int errorCode = sensor.getErrorCode();
         switch (errorCode) {
           case 1: Serial.println("ERR: Sensor is offline"); break;
           case 2: Serial.println("ERR: CRC validation failed."); break;
         }    
    }

  // 開啟檔案,繼續寫入
  myFile = SD.open("example.txt", FILE_WRITE);

  myFile.print(F("    "));
  myFile.print(humidity);
  myFile.print(F("           "));
  myFile.println(temper);
  Serial.print(F("  Humidity = "));
  Serial.print(humidity);
  Serial.print(F("%"));
  Serial.print(F("  Temperature = "));
  Serial.print(temper);
  Serial.println(F("*C"));
  Serial.println();
  myFile.close();
 
  delay(2000);
}

[執行結果]

這是串列視窗執行的結果:

這是example.txt檔案開啟的結果:

[參考資料]

Github : esp8266/examples/sdcard/
Github : hibikiledo/AM2320


2 留言

  1. 請問版主const int chipSelect = D8;const int chipSelect = D8;有需要兩次嗎?另驗證的時候有錯誤

    回覆刪除
    回覆
    1. 您好, 看一下上方的程式只有一行執行const int chipSelect = D8; 不知是否是您在複製時多Copy一次?另外, 出現什麼驗證錯誤呢?

      刪除

張貼留言

較新的 較舊