DHT11で温度計測 MicroPython
約183日前
2022年2月9日21:05
デジタル
Python ESP32
2022/2/9 投稿
今回はDHT11というセンサーを使って温度と湿度の計測を行ってみます。
使うマイコンはESP32。言語はMicroPythonです。
以前Arduinoのセンサーキットを購入した際に同梱されていたモジュールを使います。
![]()
DHTは "Digital Humidity & Temperature" の略です。
Humidity = 湿度
Temperature = 温度 ですね。
DHT11以外にも数種類の機種があり、DHT22やDHT21(AM2301)等があります。
それぞれ "測定可能温度範囲" や "計測精度" 、"配線手段" が異なります。
DHT11はこれらの温湿度センサーの中でも最も安価で単純なグレードです。
DHT11の電源電圧は3V~5.5Vですので、ESP32の5Vから電源を供給します。
モジュール化されたタイプのDHT11のピンは左から、DATA、VCC、GNDの順に並んでいます。
VCCピンとESP32の5Vピンを接続します。
DATAピンとESP32のIOピンを接続します。
GNDピンとESP32のGNDピンを接続します。
![]()
![]()
上記ではDATAピンをESP32のIO23ピンに接続しています。
ハードの準備は以上ですので、プログラムを作ります。
今回は2秒おきに温度と湿度を取得するプログラムを書き込みます。
出力イメージは下記のようになります。
![]()
完成形のプログラムは下記の通りです。
プログラムの書き込み方法は下記の記事で解説しています。
リンク
ESP32でMicroPythonを使う
MicroPythonでDHT11を扱うには "dht" というドライバをインポートする必要があります。
中身はGithubで確認できます。
リンク
DHT11/DHT22 driver for MicroPython on ESP8266
上記から一部引用します。
DHTBaseクラスを継承したDHT11クラスを見ると分かるように、5つのデータの中でも1つ目と3つ目しか使用していないことが確認できますね。
湿度データ(humidity)は1つ目から、
温度データ(temperature)は3つ目から読み取ります。
なぜこのデータを読み取るのかは、DHT11のデータシートを見ると答えが分かります。
リンク
DHT11 Humidity & Temperature Sensor
※pdfが開きます
データシートの中に下記の記載があります。
要約すると、
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に書き込んだプログラムの中で
準備が整ったらプログラムをESP32で動かしてみましょう!
温度と湿度が下記の用に表示されればOKです。
実際の運用では、IoTデバイスとして計測データをクラウドサーバーに送信したりなんて使い方をするのだと思います。
アイデア一発!独創的な使い方をするのも面白いかもですね。
デジタル
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 PinThonnyを起動し、このプログラムを書き込みましょう。
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')
プログラムの書き込み方法は下記の記事で解説しています。
リンク
ESP32でMicroPythonを使う
MicroPythonでDHT11を扱うには "dht" というドライバをインポートする必要があります。
中身はGithubで確認できます。
リンク
DHT11/DHT22 driver for MicroPython on ESP8266
上記から一部引用します。
class DHTBase:self.buf = bytearray(5)とあるように 8bit × 5 のデータを読み取ります。
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]
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デバイスとして計測データをクラウドサーバーに送信したりなんて使い方をするのだと思います。
アイデア一発!独創的な使い方をするのも面白いかもですね。