自製溫度濕度監測器

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

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 大功告成!