PR

ESP32(Bluetooth)無線でDHT-11の湿度を取得してみる。【精度比較】

dht11v2-eyecatch

今回はESP32を使用した実験です。

以前ご紹介したDHT11の精度比較ですが、室温計がショボかったので

大した精度比較になっていませんでした。基準がはっきりしていなかったので….

というわけでもう少しちゃんと湿度の精度を調べるために今回の実験を思いつきました。

使うのは、カメラやレンズを保管する防湿庫です。

防湿庫なら、湿度を一定に保つことができるため、基準にはもってこいです。

この記事を読むことでわかること

防湿庫の湿度とDHT-11で測定した湿度の精度比較結果がわかる。

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

2022年5月に転職。現役バリバリの技術者です。
現在は超大手企業の新規事業分野で装置の研究・開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

今回やったことの概要

今回はDHT11の精度検証です。

前回やった検証よりももう少し精度を詳しく見るための実験です。

前回はちょっと精度の怪しい温湿度計を使用しての検証でした。

今回具体的にやったことはこちら↓

防湿庫の中にDHT11をマイコンボードごとぶち込んで防湿庫の中の湿度を取得する。

 防湿庫とは、カメラやその他湿気に弱いものをしまっておくケースです。この防湿庫は、湿度を保つために設定した湿度以上になると自動で除湿してくれる機能があります。

 つまり、湿度管理されている防湿庫の中の湿度を取得することによって、DHT11の湿度の測定精度がわかるのではないか?というのが今回の目的です。

ただ、問題がありました。

それが、「防湿庫を開けっ放しでケーブルを出すことができない。」

防湿庫の特性上、気密性が必要なのでちょっと開けておくと湿度がガンガンあがります。

なので今回は有線でマイコンボードをつなげることはできないのです。

というわけで今回選んだのは、Bluetooth接続可能なESP32搭載のマイコンボードです。

このマイコンボードを使用することで、

Bluetooth接続するので、防湿庫をきっちり閉めて測定可能という算段。

もちろん防湿庫に入れたESP32に給電もしないといけないので、

そこはモバイルバッテリーを使用しました。

使ったもの

今回の検証に使用したものはこちら↓↓

今回使用した道具
  • ESP32搭載のマイコンボード
  • USBケーブル
  • モバイルバッテリー
  • DHT11x3
  • 防湿庫

ESP32搭載のマイコンボード

ESP32搭載のマイコンボードであればなんでもいいです。

わたしは、Lolinという会社が作っているESP32搭載のマイコンボードを使用しました。

Amazonのような通販でも購入可能なので、入手性は良好です。今回はLolinD32を使用しましたが、無線が使えるマイコンボードであれば目的は達成可能です。

 ですから、ESP32が乗っているマイコンボードであればなんでもOKです。

 ちなみにESP32搭載のマイコンボードと言われて馴染みが無いこともあるかもしれませんが、使い方はほとんどArduinoと一緒です。何だったらArduinoIDEでそのままコードも書けます。

 ただし、ほとんどとは言っていますが、もちろんArduinoとの違いはあります。2つほどArduinoとの違いを挙げるとすると、1つ目は無線機能の有り無しでちょっと扱いが異なること。2つ目はArduinoの入出力電圧は全ピン5Vですが、ESP32のマイコンボードは3.3Vであることがほとんどです。

 理解していればそこまで大した差ではないですね。たまにDC5V専用のモジュールや、DC3.3V専用のモジュールがあったりするのでその時に少し気を付ければ大丈夫です。

 つまり、Arduinoを触ったことがあるなら、ESP32搭載のマイコンボードもすぐに使えるということですね。

USBケーブル

モバイルバッテリーとESP32搭載マイコンボードとの接続に使用します。通常パソコンとESP32搭載マイコンボードをつなぐケーブルがあれば流用可能です。microBの先になっていれば大丈夫です。

 今回使用するLolinD32に合わせてmicroB⇔USBAのケーブルを紹介しますが、LolinD32以外のESP32搭載マイコンボードをご使用の場合はそれに合わせてケーブルを調達しておきましょう。

モバイルバッテリー

 そんなに大出力・大容量のモバイルバッテリーは必要ありません。ほぼ1日つなぎっぱなしでも4目盛り中1目盛りも減っていなかったので、消費電力は相当少ないです。

 一応私が普段から使用しているモバイルバッテリーを紹介しておきます。

Anker製です。

 実際につかうときは、まずESP32のマイコンボードとPCをつないでコードを書き込みます。そのあとPCからマイコンボードを取り外してからUSBケーブルをモバイルバッテリーとつなぐことで、書き込んだコードが自動的に実行されます。

DHT11x3

前々からセンサー類のキットをセットで購入していたので、

手元に3こありました。

あらたにそろえる場合でもAmazonや秋月なんかでも入手可能です。

まあ、普通の人は3個もいらないと思います….

秋月ではNCを省いた3本線になっているタイプがないので、

スペースに余裕があるのであればこちらを買ったほうが良いかもしれません。

防湿庫

今回使用したのはわたしが普段カメラやレンズを収納している防湿庫です。

こちらの防湿庫ですね。

電源につないで湿度を一定に保つというちょっと高級な防湿庫です。

ESP32とDHT11の配線図

今回3個DHT11を並べて一気に接続しています。

DHT11の接続先はESP32の18,19,21ピンとしています。

ちょっと疑問に思うところもあるかもしれないです。

DHT11はDataピンにプルアップ抵抗が必要。」ということです。

 今回に関してはESP32のプルアップピンを設定することで内蔵プルアップを使用して、外部の抵抗を省いています。

 DHT11の推奨プルアップ抵抗が51kΩに対して、ESP32のデータシートから45kΩのプルアップとのことなのでそのまま気にせずやっています。

 この差の6kΩが影響するかについては????ですが、少なくても今回は3つとも同じ条件でやっているので、純粋に個体差については観察できるのではないかと思っています。

ESP32に書いたスケッチ

それではESP32に書き込んだスケッチですが、

こんな感じになっています。

#include <BluetoothSerial.h>
#include <DHT.h>
#define DHTTYPE  DHT11

BluetoothSerial btSerial;

int dht1pin=18;
int dht2pin=19;
int dht3pin=21;
DHT dht1(dht1pin,DHTTYPE);
DHT dht2(dht2pin,DHTTYPE);
DHT dht3(dht3pin,DHTTYPE);

void setup() {
  // put your setup code here, to run once:
  btSerial.begin("ESP32DHT11");
  pinMode(dht1pin,INPUT_PULLUP);
  pinMode(dht2pin,INPUT_PULLUP);
  pinMode(dht3pin,INPUT_PULLUP);
  dht1.begin();
  dht2.begin();
  dht3.begin();
  
}

void loop() {
 getTemp();
}

void getTemp(){
   
 float temp1=dht1.readTemperature();
 delay(2000);
 float temp2=dht2.readTemperature();
 delay(2000);
 float temp3=dht3.readTemperature();
 delay(2000);
 float humid1=dht1.readHumidity();
 delay(2000);
 float humid2=dht2.readHumidity();
 delay(2000);
 float humid3=dht3.readHumidity();
 delay(2000);
 
  btSerial.print("dht1:");
  btSerial.print(temp1);
  btSerial.print(",");
  btSerial.println(humid1);
  
  btSerial.print("dht2:");
  btSerial.print(temp2);
  btSerial.print(",");
  btSerial.println(humid2);
  
  btSerial.print("dht3:");
  btSerial.print(temp3);
  btSerial.print(",");
  btSerial.println(humid3);
  delay(2000);
  }

内容としては、dht11というライブラリを使って、

温度取得していく。という感じです。

delay(2000)ですが、2秒くらいは通信の間隔をあけないと

エラーになるのでそれくらい入れています。

結果発表

それではお待ちかねの結果発表です。

DHT11の湿度の取得精度を比較

防湿庫は40%で固定です。

もちろん多少の上下はあってもそれを制御するように防湿庫側でコントロールしているので、

今回は40%固定ということでグラフにしています。

こちらの結果からわかるのは以下のことです。

結果からわかること
  • DHT11 の3個でそれぞれ湿度がバラバラ….
  • 時系列(横軸)22番~36番近辺で2%程度の上昇がすべてのDHT11で見られた。
  • 防湿庫が40%なのに対して、一番高く出るDHT11だと10%以上の乖離が見られた。

上記結果から言えることは….

わかったことから言えること
  • DHT11の取得湿度の結果には個体差がある。
  • 最大10%くらいの誤差があることを知ったうえで使用するべき。
  • 湿度変化はどの個体も反応しているようなので、
    個体ごとにオフセットすればそこそこ使えそう。

という感じですかね。

まとめ

ということで、今回はDHT11の湿度を正確に検証するお話でした。

10%以上乖離があるってのはなかなか興味深いですね。

個体によって差がありそうなので、厳密な湿度を取得するにはちょっと心もとない..

まあDHT11にどこまで精度を要求するか?という話でもあるのですが。

もし正確にやりたいのであれば、例えば防湿庫に対して10%差があるから、

最初から10%マイナスした値が正しい。みたいな使い方になるんでしょうかね。

回路図のところで少し説明(言い訳)しましたが、

今回はESP32のプルアップ設定を使用することにより、

プルアップ抵抗を抜いています。

本来は51kΩに最も近い抵抗を用意して計測するのがスジだと思うので、

今後51kΩに近い抵抗と±10kΩくらいの抵抗を用意して、

温度と湿度がどのように取得されるかについて実験してみたいと考えています。

コメント

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