ESP32-C3M-TRYでAHT20(温度・湿度センサ)を使う
はじめに
ESP32-C3M-TRY開発ボード上にある温度・湿度センサ(AHT20)を使用して温度、湿度のデータを取得する方法について解説します。
下図の赤丸で囲まれたものがAHT20です。(ボードのロットによってはAHT21が使われている場合がありますが同様のプログラムで動作します。)

https://www.microfan.jp/wp-content/uploads/2023/06/ESP32-C3M-TRY-2.jpg を引用加筆修正
AHT20について
AHT20は、主にAosong(ASAIR)社によって製造されています。
このメーカーは、温度および湿度センサーの分野で広く知られています。(このサイトのウェブページはありますが、httpsを使用していないのでここでは紹介しないことにします。)
AHT20はI2Cインターフェースを介して接続することができ、家庭用電子機器の温湿度測定や自動車内の環境モニタリングなど、さまざまな用途に利用されています。
測定範囲と精度
- 温度範囲: -40℃から+85℃ (AHT21は -40°C から +120°C)
- 温度精度: ±0.3℃
- 湿度範囲: 0%から100% RH
- 湿度精度: ±2% RH(25℃において)
AHT20 Datasheet (PDFファイルでAdafruitによるもの)
I2Cについて
- Inter-Integrated Circuit
- オランダのフィリップス社が開発した2線式シリアル通信規格
- I2Cとも表記される。アイ・スクエア・シー、アイ・ツー・シーと発音される
- 同じ基板内のように近距離で直結したデバイス同士で100Kbps、400Kbps(ファーストモード)、3.4Mbps(ハイスピードモード)でシリアル通信を行う
- 信号線はシリアルデータライン(SDA)とシリアルクロックライン(SCL)の2本のみ
- 実装ではSDA、SCLに加えて電源ラインとグランドラインの4本が使われる
- 接続されているデバイスを7ビットのアドレスで指定できる。
実際は16個のアドレスが予約されているので、128−16=112個のデバイスが識別できる。2^7=128 - 接続されたデバイスはマスタとスレーブからなり、マスタからアドレスを指定することで1対1の通信を行う

画像引用元: https://ja.wikipedia.org/wiki/I2C
サンプルプログラム1
ESP32-C3M-TRY開発ボードのI2Cバス0番に接続されているI2Cデバイスのアドレスをスキャンして表示するプルグラムです。
i2c.scan() は0x08から0x77までのすべてのI2Cアドレスをスキャンし、応答したアドレスをリストで返します。
# I2C address scan on ESP32-C3M-TRY
# Jul. 15th 2015
from machine import Pin, I2C
from aht21 import AHT21
from time import sleep
# Use hardware I2C bus 0
i2c = I2C(0)
for addr in i2c.scan():
# Display addr in hexadecimal
print("{:#x}".format(addr))
実行結果
この例ではI2Cに0x0e、0x38、0x3cのアドレスを持ったデバイスが接続されていることが分かります。
0xe
0x38
0x3c
これらのアドレスを使用するデバイスは以下のようになっています。
| アドレス | デバイス |
|---|---|
| 0x0E | KXTJ3加速度センサー |
| 0x38 | AHT20温湿度センサー |
| 0x3c | カラーLED(LED10、LED11、LED12) |
サンプルプログラム2
1秒ごとに温度、湿度を測定して表示するプログラムです。
aht21モジュールはマイクロファン配布のファームウェアを使用している場合はすでに組み込まれています。
# AHT-21 on ESP32-C3M-TRY
# Jul. 15th 2015
from machine import Pin, I2C
from aht21 import AHT21
from time import sleep
# Use hardware I2C bus 0
i2c = I2C(0)
# Make instance
aht21 = AHT21(i2c)
while True:
temp = aht21.temperature
humi = aht21.relative_humidity
print(f"温度: {temp:.1f}°C, 湿度: {humi:.1f}%")
sleep(1)
Thonnyを使用している場合、メニューバー → 表示 → プロッター の順に選択していくと、グラフを描画させることが可能です。
AHT21に息を吹きかけたり、指で温めるとグラフが変化するのが分かります。
ハードウェアI2CとソフトウェアI2C
ここまで紹介したサンプロプログラムはESP32-C3 miniに搭載されている専用のハードウェアI2Cコントローラを使用するもので、ハードウェアI2Cの機能を使用しています。
何らかの事情で他のGPIOポートでI2Cを使用したい場合はソフトウェアI2Cを使用するのが一般的です。
次の表はハードウェアI2CとソフトウェアI2Cを比較したものです。
特に事情がない限り、ハードウェアI2Cを使う方がいいでしょう。
| 特徴 | ハードウェアI2C (machine.I2C) | ソフトウェアI2C (machine.SoftI2C) |
|---|---|---|
| 実装 | マイコン内蔵のハードウェアI2Cコントローラ | ソフトウェア(ビットバンギング) |
| 速度 | 高速 | 低速 |
| CPU負荷 | 低い | 高い |
| ピンの柔軟性 | 特定のピンに限定される | どのGPIOでも使用可能 |
| 信頼性 | 高い | 環境や他の処理によって低下する可能性あり |
| 主な用途 | 高速通信、安定性が求められるアプリケーション | 柔軟なピン配置が必要な場合、シンプルなセンサーとの通信 |
サンプルプログラム3
以下のプログラムはソフトウェアI2Cを使用してESP32-C3M-TRY上のI2Cアドレスを調べ、さらにAHT21の温度、湿度を表示するものです。
# I2C using SoftI2C on ESP32-C3M-TRY
# Jul. 15th 2015
from machine import Pin, SoftI2C
from aht21 import AHT21
from time import sleep
# SCL is connected to GPIO9 and SDA to GPIO8
SCL = 9
SDA = 8
# Use software I2C
i2c = SoftI2C(scl=SCL, sda=SDA)
aht21 = AHT21(i2c)
# I2C address scan
for addr in i2c.scan():
# Display addr in hexadecimal
print("{:#x}".format(addr))
# Measure temperature and humidity
while True:
temp = aht21.temperature
humi = aht21.relative_humidity
print(f"温度: {temp:.1f}°C, 湿度: {humi:.1f}%")
sleep(1)
演習問題
-
不快指数は次の式で表すことができます。
不快指数=0.81×気温+0.01×湿度×(0.99×気温-14.3)+46.3
print文で温度、湿度、不快指数をそれぞれ少数部が1桁となるように表示して下さい。(ファイル名:aht20-ex1.py)
-
下の表は、上の式で求めた不快指数とそれに対応する体感、LED12で点灯するRGBの組み合わせです。
不快指数 体感 RGBの値 〜55 寒い (0, 0, 128) 55〜60 肌寒い (0, 64, 128) 60〜65 何も感じない (0, 128, 128) 65〜70 快い (0, 128, 0) 70〜75 暑くない (128, 128, 0) 75〜80 やや暑い (128, 64, 0) 80〜85 暑くて汗が出る (128, 32, 0) 85以上 暑くてたまらない (128, 0, 0)
AHT20で温度、湿度を測定した後、上の式で不快指数を計算し、その値を次のコードを使用して、体感の欄をprint文で表示し、さらに、LED12をRGBの欄の値で光らせるプログラムを作成して下さい。
(ファイル名:aht20-ex2.py)
discomfort_index_data = [
(55, "寒い", [0, 0, 128]),
(60, "肌寒い", [0, 64, 128]),
(65, "何も感じない", [0, 128, 128]),
(70, "快い", [0, 128, 0]),
(75, "暑くない", [128, 128, 0]),
(80, "やや暑い", [128, 64, 0]),
(85, "暑くて汗が出る", [128, 32, 0]),
(float('inf'), "暑くてたまらない", [128, 0, 0]),
]
完成したら、センサに息を吹きかけるなどして体感の文言やカラーLEDの色が変わることを確認してみて下さい。
ヒント:上のリスト内のタプルデータを順に取り出し、第0要素の不快指数データを上手に使うとif,elif,...elif,elseを使わずに済み、プログラムの行数が少なくなります。
- 温度、湿度、不快指数の15分毎にIoTクラウドにアップロードしてグラフを描いて下さい。
Discussion