繼前幾篇實作將溫濕度感測值傳送到 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卡。
DHT傳感器,它有一個I2C接口。它具有3%的濕度精度和0.5C的溫度精度,比起 DHT-11看起來比較精確些。規格及圖如下:
• SD Card 模組 x 1
• AM2320 溫濕度感測器 x 1
• 連接線 x 10
• 麵包板 x 1
• 將下載的壓縮檔解壓縮,放在 Arduino 主程式下的 libraries目錄內,以我的電腦來說,Arduino安裝在 C:\User\[登入的帳號]\Documents\Arduino,點進目錄有一個 libraries的子目錄,下載後解壓縮的目錄,整個放進 libraries 目錄,重新啟動 Arduino即可。
這是example.txt檔案開啟的結果:
Github : hibikiledo/AM2320
關於可以偵測溫度的感測器種類不少,如 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
請問版主const int chipSelect = D8;const int chipSelect = D8;有需要兩次嗎?另驗證的時候有錯誤
回覆刪除您好, 看一下上方的程式只有一行執行const int chipSelect = D8; 不知是否是您在複製時多Copy一次?另外, 出現什麼驗證錯誤呢?
刪除張貼留言