自製溫度濕度監測器

最近因為需要對工作場所進行持續的溫度及濕度監測,
不如就來製作一台實時監測器以及相關的數據記錄圖表生成系統吧。

Let’s Go!


材料

  1. WeMos D1 mini 開發板 x 1
    (端子可能需要自行焊接,如果不太擅長可請店家代焊或直接購買已焊的版本)
      
  2. DHT11 溫度濕度感應器 (連 FF 杜邦線) x 1

也可以到 Jason Workshop 的 Online Shop 選購套件哦!


運作原理

  1. 溫度及濕度的數值會由 DHT11 感應並傳到 D1 mini 開發板。
      
  2. WeMos D1 mini 是一塊能連接 WiFi 的開發板,
    會將數據透過互聯網傳送到 ThingSpeak 平台。
      
  3. ThingSpeak 能將數據收集並自動生成圖表。

製作硬件

請將 DHT11 的端子連到 WeMos D1 mini 的對應端子上,硬件部份便完成了!

DHT11D1 mini
+5V
outD4
G

預備軟件開發環境

  1. 請到 https://www.arduino.cc/en/software
    下載並安裝最新版本的 Arduino IDE。
      
  2. 開啟 Arduino IDE 並在 Arduino \ Preferences \ Additional Boards Manager URLs 框框輸入 “http://arduino.esp8266.com/stable/package_esp8266com_index.json”
  1. 在 Arduino \ Board \ Boards Manager
    搜尋 “esp8266” 然後按 Install
    這樣 Arduio IDE 便支援 WeMos D1 mini 開發板了!
  1. 在需要使用 WeMos D1 mini 時,只要在 Arduino \ Tools \ Board 選擇 ESP8266 Boards \ LOLIN(WEMOS) D1 mini (clone) 便可。

加入需要到的 Library

由於這個 Project 中使用到 DHT11 感應器,這就需要安裝額外的 Library 讓編寫程式更方便。

  1. 在 Arduino \ Sketch \ Include Library 選擇 Manage Libraries。
    搜尋 “DHT11” 然後選擇 “DHT sensor library by Adafruit” 再按 Install。
  1. 由於 DHT sensor library 會用到 Adafruit Unified Sensor 這個 library,所以系統會問是否順道安裝,可以在這裏按 Install all。

申請 ThingSpeak 並建立一個 Channel

由於篇幅比較長,所以將這篇獨立了出來,大家可以先申請帳戶、建立 Channel、記下 Write API Key 以及將 Channel 發佈。

https://jasonworkshop.com/b20210930


編寫程式

請將以下程式碼複製到 Arduino IDE,注意修改 apiKey, ssid, password 需要修改成適合自己的。

#include <DHT.h>
#include <ESP8266WiFi.h>

#define DHTPIN 2 // D4 = GPIO 2
#define DHTTYPE DHT11

// your thingspeak channel API key and your WiFi SSID and password
String apiKey = "Your Write API Key from ThingSpeak";
const char* ssid = "Your WiFi SSID";
const char* password = "Your WiFi Password";
const char* server = "api.thingspeak.com";

DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;


void setup() {
  Serial.begin(115200);
  delay(50);

  dht.begin();

  WiFi.begin(ssid, password);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}


void loop() {

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  if (client.connect(server,80)) {
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(t);
    postStr +="&field2=";
    postStr += String(h);
    postStr += "\r\n\r\n";

    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);

    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.print(" degrees Celsius, Humidity: ");
    Serial.print(h);
    Serial.println(", Sending data to Thingspeak");
  }

  client.stop();

  Serial.println("Waiting 20 sec"); // thingspeak needs at least a 15 sec delay between updates

  delay(20000); // 20 sec
}

執行並測試成果

  1. 用 USB 線連接 WeMos D1 mini,再在 Arduino \ Tools \ Port 選擇能連上 WeMos D1 mini 的 Port。
    如果無法找到可連接的 Port,可能是 USB Driver 的問題,
    請到 https://www.wemos.cc/en/latest/ch340_driver.html 下載並安裝 WeMos D1 mini 的 USB Driver。

      
  2. 選好 Port 後按 Upload,當上載完成後溫度濕度監測器便會啟動。
  1. 大家可以按 Arduino \ Tools \ Serial Monitor 觀察運作情況。
  1. 一齊正常的話,便可以在你的 Channel 看到已收集的數據所生成的圖表。

整個 Project 大功告成!