もうすぐ12月。
寒くて乾燥が気になる季節になってきたので温湿度計をつくります。
今回使う温湿度センサーは DHT11 です。
必要なもの
- 適当なマイコン(今回はSeeeduino XIAOを使用)
- 温湿度センサーDHT11(Amazonや秋月電子などで300円くらいで購入できます)
- OLED
- 4.7kΩくらいの抵抗 1本
- ブレッドボード、ジャンプワイヤ 適量
ハードウェアの接続方法
温湿度センサーDHT11には4本の足がありますが
電源、GND、DATA、残りの1本はNC (Non-connection) です。
電源電圧は3.3~5.5Vなので今回は3.3Vで使います。
DHT11のデータシートにDATA線に4.7kΩのプルアップが必要と書いてあるので
DATA線と3.3V電源の間に4.7kΩくらいの抵抗を入れてください。
実際にブレッドボード上で繋ぐとこんな感じになりました。
Arduino IDEでプログラムをつくる
Adafruitのライブラリを使用します。
以下の2つのライブラリをインストールしていきます。
https://github.com/adafruit/Adafruit_Sensor/tree/master
https://github.com/adafruit/DHT-sensor-library/tree/master
それぞれの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にプログラムを書き込みます。
温度、湿度、ついでに熱指数が表示されました!
今は温度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)));
}
コメント