Seeeduino XIAO | DHT11で温湿度計をつくる

もうすぐ12月。
寒くて乾燥が気になる季節になってきたので温湿度計をつくります。

今回使う温湿度センサーは DHT11 です。

Seeeduino XIAOのスペックやArduino IDE環境設定はこちら
スポンサーリンク

必要なもの

  • 適当なマイコン(今回はSeeeduino XIAOを使用)
  • 温湿度センサーDHT11(Amazonや秋月電子などで300円くらいで購入できます)
  • OLED
  • 4.7kΩくらいの抵抗 1本
  • ブレッドボード、ジャンプワイヤ 適量
OLEDの使い方はこちらの記事を参照してください

ハードウェアの接続方法

Seeeduino xiao, OLED, DHT11接続図
雑な接続図

温湿度センサーDHT11には4本の足がありますが
電源、GND、DATA、残りの1本はNC (Non-connection) です。
電源電圧は3.3~5.5Vなので今回は3.3Vで使います。

DHT11のデータシートにDATA線に4.7kΩのプルアップが必要と書いてあるので
DATA線と3.3V電源の間に4.7kΩくらいの抵抗を入れてください

Seeeduino xiao, OLED, DHT11 ブレッドボード

実際にブレッドボード上で繋ぐとこんな感じになりました。

Arduino IDEでプログラムをつくる

Adafruitのライブラリを使用します。
以下の2つのライブラリをインストールしていきます。
https://github.com/adafruit/Adafruit_Sensor/tree/master
https://github.com/adafruit/DHT-sensor-library/tree/master

Adafruit GitHub

それぞれのGitHubから Code > Download ZIP でZIPファイルをダウンロードします。
ダウンロードが完了したらArduino IDEを起動して
スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインクルード から
ダウンロードしたZIPファイルを選択します。
2つともできたらライブラリのインストールは完了です。

#include "DHT.h"

#define DHTPIN 3
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  dht.begin();
  delay(3000);
}

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);

  float hic = dht.computeHeatIndex(t, h, false);

  /* add below code to show value of "h", "t", "hic" */ 

}

DHT11に必要なコードはこんな感じ。
OLEDへの表示も追加したコードはこの記事の一番最後に載せています。
“h” が湿度、”t” が温度、”hic” が熱指数です。

#define DHTPIN 3 のところでSeeeduino XIAOの3ピンを使うと指定しています。
#define DHTTYPE DHT11 のところでDHT11を使うと指定しています。
(このライブラリはDHT11の型番違いも扱えるようです。)

注意点として、
DHT11は短い間隔でデータを読み出そうとするとエラーになってしまいます。
なので void loop() の中の delay(2000); で2秒間のWait timeを入れています。

実行してみる

Seeeduino XIAOにプログラムを書き込みます。

Seeeduino xiao温湿度計

温度、湿度、ついでに熱指数が表示されました!
今は温度21度、湿度43%のようです。

OLEDの表示の仕方はアレンジしてみてください

参考に今回のコードの完全版は以下です。

#include "DHT.h"
#include <Wire.h>
#include <ACROBOTIC_SSD1306.h>

#define DHTPIN 3
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Wire.begin();  
  oled.init();                      // Initialze SSD1306 OLED display
  oled.clearDisplay();              // Clear screen
  oled.setTextXY(3,3);              // Set cursor position, start of line 0
  oled.putString("Hello, World");
  dht.begin();
  delay(3000);
  oled.clearDisplay();
  oled.setTextXY(0,0);
  oled.putString("Tempreature");
  oled.setTextXY(1,13);
  oled.putString("xx");
  oled.setTextXY(2,0);
  oled.putString("Humidity");
  oled.setTextXY(3,13);
  oled.putString("xx");
  oled.setTextXY(4,0);
  oled.putString("Heat Index");
  oled.setTextXY(5,13);
  oled.putString("xx");
}

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    oled.setTextXY(7,0);
    oled.putString("Status : NG");
    return;
  } else {
    oled.setTextXY(7,0);
    oled.putString("Status : OK");
  }
  float hic = dht.computeHeatIndex(t, h, false);
  oled.setTextXY(1,13);
  oled.putString(String(int(t)));
  oled.setTextXY(3,13);
  oled.putString(String(int(h)));
  oled.setTextXY(5,13);
  oled.putString(String(int(hic)));
}

コメント

タイトルとURLをコピーしました