昨今のIoT・データ分析ブーム()を受けて、継続的に室内環境のモニタリングをしている。BME280で温度/湿度/気圧を取るところから始め、最近は在宅勤務で知らぬ間に部屋の空気が悪化しがちなこともあり、CO2濃度や暑さ指数(WBGT)も測って見えるようにしている。今回はその中で温度に関する話、計6種の温度センサー(BME280, DS18B20+, DHT11, DHT22, TMP36, LM35D)を測ってみたのでその結果をシェアしてみたい。
目次
背景
BME280とその問題点
BME280というのはホビー電子工作界では超メジャーなセンサーで、温度/湿度/気圧センサーと銘打って売られていることが多い。製造元はBoschで、精度も信頼性も文句なしと言える。ところがこれ、ひとつ欠点があり、自分の発する熱も測ってしまい環境温度を測るのに必ずしも適さないのである。確かにデータシートを見ても温度センサーとは書いていない(!!)。ネット上でも「BME280の温度って不正確じゃね?」「あれそもそも温度センサーじゃねーし」「えっ(゚Д゚)マジ?」という会話はよく起こっているようである。
というわけで、BME280に加えて環境温度を正確に測れる温度センサーを別に付けたい、せっかくなのでいろいろ取り寄せて試してみよう、というわけだ。
Disclaimer
この測定は完全に趣味のものである。測りたいから測ってみる、それだけである。
- 当初の課題を真面目に解くならば、「BME280の測定頻度を下げて発熱を最小にし、オフセットを+0.5℃程度に抑えられたならあとは誤差の範囲と納得する」のがエンジニアリング的正答ではないかと思う。わざわざ別のセンサーを使ってもそれより正確な値が得られるとは限らないし、その程度の誤差があったところで部屋の環境測定において困ることは特にないからである。つまり、別の温度センサーを使うところに合理性は特になく、単に使ってみたいからに他ならない。
- 実際に各種センサーを測ってみると、当然のことながら「どれもデータシートに示された誤差範囲内でしっかり動作する」のである。 高々2個や3個のセンサーを測って、仕様の範囲内の誤差を取り上げて一般的な良し悪しを論じたりするのはエンジニアリング的態度ではない。ただ、私はネット上に自分の測定結果を公開してくれている人たちから大いにインサイトを得ることができたので、この「測定結果サンプル」を公開することにも一定の意味はあると考えている。
- エンジニアリング的な良し悪しは議論できないとしても、趣味の測定なのだから、趣味に基づく判断基準は持ってよい。ここでは「BME280は機構的には信頼に値するが、ただ温度にオフセットがかかってしまっているのを補正したい」という出発点に従い、「BME280の測定結果のちょっと下を一定の規則でフォローしてくれるのが私にとっての(・∀・)イイ!!センサー」ということにする。
測定対象センサーの仕様比較
下記のように、基準となるBME280に対して5種類のセンサーを入手・測定した。部品の入手はAmazonやMouserから。
BME280 | DS18B20+ | DHT11 | DHT22 (AM2302) | LM35D | TMP36GT9Z | |
---|---|---|---|---|---|---|
機能 | 湿度/気圧(/温度) | 温度 | 温度/湿度 | 温度/湿度 | 温度(アナログ) | 温度(アナログ) |
精度(℃) @25℃ | ±0.5 | ±0.5 | ±2 | ±0.5 (最大±1) | ±0.6 (±1.5) | ±2 (±3) |
電源電圧(V) | 1.8-3.6 | 3.0-5.5 | 3.3-5.5 | 3.3-5.5 | 4.0-30 | 2.7-5.5 |
価格例($) | 4.33 | 1.00 | 2.00 | 6.00 | 1.99 | 1.96 |
データシート | ここ | ここ | ここ | ここ | ここ | ここ |
測定個数 | 1 | 2 | 3 | 2 | 2 | 2 |
測定結果
全体
基準のBME280と、比較対象の種類ごとにそれぞれ2個ないしは3個の個体を測定した。数秒に一回データを取り、毎分平均したものを記録している。DHT系とそれ以外とで計測時期は別であり、グラフも別になっている。
黒線が基準のBME280である。ぱっと見、DS18B20+が2個体とも(・∀・)イイ!!条件をよく満たしている様子で、LM35Dもなかなか健闘している。DHT系は(誤差の範囲とはいえ)いまひとつconsistencyに欠ける印象である。
ではセンサーの種類ごとに詳しく見て行こう。
1. DS18B20+
Dallas Semiconductorという会社のいかにも質実剛健な感じのデジタル温度センサー。防水パッケージされたものも売られている。
信号線に4.7kのプルアップが必要。一本の信号線をバスとして複数のセンサーをぶら下げられる、電源ピンを接地すると信号線を電源として動く「パラサイトモード」になる、などの特徴がある。
Arduino用ライブラリは幾つか存在するが、簡単に使えてしっかり作られていそうなこれを使用:
GitHub - matmunk/DS18B20: Arduino library for the Maxim Integrated DS18B20 1-Wire temperature sensor.
BME280を基準に差をプロットしたグラフがこれ。0.5~1℃下をきれいにフォローしており、さらに2個体の出力値がよく揃っている。これは先に示した基準に照らせば(・∀・)イイ!!センサーと言える。
2. DHT11/DHT22(AM2302)
温度と湿度の両方測れるデジタルセンサーで、DHT11が低性能版、DHT22が高性能版である。精度や信頼性に関して世の評判は芳しくないようで、しばらく使ってると値がおかしくなる、壊れる、といった話もよく聞く。少なくとも湿度については評判的にも経験的にもまったく信頼できず、ましてやBME280があるのにこちらを使う動機はまずない。
Arduino用ライブラリはいつもお世話になっているAdafruitのものでOK:
GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors
ただし、Particle 3rd-gen ボードでは、Adafruitのものも、それに手を加えたと思しきParticle製のものもうまく動かず、これを使うことになった:
GitHub - piettetech/PietteTech_DHT: DHT Sensor Library for Spark Core
同じくBME280を基準に差をプロットしたグラフがこれ。概ね仕様の範囲内で動いているが、個体差が大きい、再現性に欠けるという印象。DHT22は値段が高い割に全然素晴らしい感じがしないし、しかも1個体(薄い紫)は時折値がジャンプするハズレ個体のようだ。BME280の補正に役立つかという観点では、まあ(・A ・)イクナイ判定と言うべきだろう。
3. LM35D/TMP36GT9Z
これらはアナログセンサーである。アナログセンサーは、出力を読み取るボードのADCの参照電圧が正確でないと信頼できる値が取れないが、私は怪しい中華ボードにセンサーごてごて付けて使うことが多いので、あまり実用にする気はなく純粋に測定目的である。仮に使うとしたら精度の高いLM35Dだが、3.3Vで駆動できないのが欠点。一方TMP36は精度が低く、実のところ今回の目的で欲しい精度に達していないが、3.3Vで駆動可能というメリットがある。
両センサーとも、1℃あたり10mVが出力される。LM35Dは0℃=0Vだが、TMP36は0℃=500mVのオフセットがかかっていることに注意。ADCの精度に不安さえなければ使うのは非常に簡単である。(今回の測定用ボードにはハード的に信頼できそうなParticle Xenonを使い、3.3V端子に出てる電圧が正確で安定していることを確認したので、まあ大丈夫だと思う。)
さて他のセンサーと同様、BME280基準のグラフを見てみよう。本命はLM35Dの方だが、1個体(暗い黄色)は仕様から期待される通りDS18B20並に(・∀・)イイ!!と言える。もう1個体(明るい黄色)は最初は少々調子が悪く上にオフセットしているが、3日目からやっと本領発揮となった感じである。
TMP36は、仕様上は「精度が悪い」にも関わらず、意外にも再現性や相対的な精度はLM35Dに引けを取らないようである(青と水色)。今回の場合オフセットが大きいのは困るのでそれでも使いにくいが、電圧3.3Vで駆動したい・オフセットに目をつぶれるといった場合には、DHT系よりよほど信頼できる選択肢かもしれない。
まとめ
今回の測定からは、最も(・∀・)イイ!!温度センサーはDS18B20+と言えるだろう。BE280と組み合わせて、信頼性の高い、数字を見てニヤニヤできる趣味の環境モニターが作れるのではないかと思う。他のセンサーも仕様に従って動作するが、ただDHT11/DHT22は ゴミ おもちゃだと考えた方がいいかもしれない。