知識の枝

"All is well"

DHT11で温度計測 MicroPython

約97日前 2022年2月9日21:05
デジタル
Python ESP32

改訂履歴


2022/2/9 投稿

1. 温度計測してみたい


今回はDHT11というセンサーを使って温度と湿度の計測を行ってみます。

使うマイコンはESP32。言語はMicroPythonです。

以前Arduinoのセンサーキットを購入した際に同梱されていたモジュールを使います。



DHTは "Digital Humidity & Temperature" の略です。

Humidity = 湿度
Temperature = 温度 ですね。


DHT11以外にも数種類の機種があり、DHT22やDHT21(AM2301)等があります。

それぞれ "測定可能温度範囲""計測精度""配線手段" が異なります。

DHT11はこれらの温湿度センサーの中でも最も安価で単純なグレードです。


2. 組み立てる


2.1 - ハード


DHT11の電源電圧は3V~5.5Vですので、ESP32の5Vから電源を供給します。

モジュール化されたタイプのDHT11のピンは左から、DATA、VCC、GNDの順に並んでいます。

VCCピンとESP32の5Vピンを接続します。

DATAピンとESP32のIOピンを接続します。

GNDピンとESP32のGNDピンを接続します。







上記ではDATAピンをESP32のIO23ピンに接続しています。

ハードの準備は以上ですので、プログラムを作ります。


2.2 - プログラム


今回は2秒おきに温度と湿度を取得するプログラムを書き込みます。

出力イメージは下記のようになります。




完成形のプログラムは下記の通りです。
from machine import Pin
from time import sleep
import dht

sensor = dht.DHT11(Pin(23))

While True:
try:
sleep(2)
sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()
print('Temperature: %3.1f C' %temperature)
print('Humidity: %3.1f %%' %humidity)
except OSError as e:
print('Sensor Reading Failed')
Thonnyを起動し、このプログラムを書き込みましょう。

プログラムの書き込み方法は下記の記事で解説しています。

リンク
ESP32でMicroPythonを使う

MicroPythonでDHT11を扱うには "dht" というドライバをインポートする必要があります。

中身はGithubで確認できます。

リンク
DHT11/DHT22 driver for MicroPython on ESP8266


上記から一部引用します。
class DHTBase:
def __init__(self, pin):
self.pin = pin
self.buf = bytearray(5)

def measure(self):
buf = self.buf
dht_readinto(self.pin, buf)
if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xFF != buf[4]:
raise Exception("checksum error")


class DHT11(DHTBase):
def humidity(self):
return self.buf[0]

def temperature(self):
return self.buf[2]
self.buf = bytearray(5)とあるように 8bit × 5 のデータを読み取ります。

DHTBaseクラスを継承したDHT11クラスを見ると分かるように、5つのデータの中でも1つ目と3つ目しか使用していないことが確認できますね。

湿度データ(humidity)は1つ目から、

温度データ(temperature)は3つ目から読み取ります。


なぜこのデータを読み取るのかは、DHT11のデータシートを見ると答えが分かります。

リンク
DHT11 Humidity & Temperature Sensor
※pdfが開きます

データシートの中に下記の記載があります。


Data consists of decimal and integral parts. A complete data transmission is 40bit, and the sensor sends higher data bit first.
Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit check sum. If the data transmission is right, the check-sum should be the last 8bit of "8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data".


要約すると、

1つ目の8bitは "湿度(RH)の整数部(integral)"
2つ目の8bitは "湿度(RH)の小数部(decimal)"
3つ目の8bitは "温度(T)の整数部(integral)"
4つ目の8bitは "温度(T)の小数部(decimal)"
5つ目の8bitは "誤り検出(check sum)"

と書いてあります。

DHT11は計測分解能が1%RH、1℃のセンサーですので、小数部は使いません。

なので、1つ目の "湿度の整数部" と3つ目の "温度の整数部" だけをプログラムで使用しているのです。


ちなみに5つ目の "check sum" はデータに誤りが無いか確認する "誤り検出符号" です。

"sum" という名前の通り、1つ目~4つ目のデータを合計した数値が入ります。

8bit × 5 のデータを受け取った後、誤り検出を行うことでデータの正しさを確認します。


ESP32に書き込んだプログラムの中で
sensor.measure()
と書きましたが、このタイミングでデータの取得と誤り検出を内部で行っています。
def measure(self):
buf = self.buf
dht_readinto(self.pin, buf)
if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xFF != buf[4]: # 誤り検出
raise Exception("checksum error")



3. 温湿度を計測しよう


準備が整ったらプログラムをESP32で動かしてみましょう!

温度と湿度が下記の用に表示されればOKです。


実際の運用では、IoTデバイスとして計測データをクラウドサーバーに送信したりなんて使い方をするのだと思います。

アイデア一発!独創的な使い方をするのも面白いかもですね。