公開日:2026/01/24
title.png

37th Season


#37-9 AHT10を使ってみようか

 オリジナル32ビットCPUコアNihoniumのパイプライン方式実装は引き続き設計を進めているのですが、小休止して、新しく入手したセンサモジュールAHT10を試してみたいと思います。

温度と湿度の計測

 本HPでは、これまで温度と湿度の計測にAM2302DHT11と言うセンサモジュールを使ってきました。AM2302は、本HPにて一番最初に入手して使用したセンサモジュールです。1線式シリアル通信なので、I/Oポートを1本しか使わない省エネ仕様です。
 ただ、独自仕様のシリアル通信規格の為、I/Oポートをソフトウェアで叩きながら通信するのが少しかったるいですね。また、AM2302とDHT11は類似した仕様でありながら、タイミング規定や読み出せるデジタルデータの仕様が微妙に異なるので、#ifdef等で切り替えて使わなくてはならないのも、否定的なのでした。

I2C通信モジュール

 最近のマイトレンドは、I2C通信規格で接続できるモジュールです。I2C通信規格は、クロック信号SCLとデータ信号SDAの2線式同期シリアル通信規格です。
 SCL,SDA共、双方向の通信線でオープンドレインなので、1本のI2Cバスに複数のスレーブデバイスを接続することができます。そればかりか、複数のマスタデバイスも接続可能な仕様です(マルチバスマスタに関しては、まだ試して見た事は在りませんが……)。

 I2Cバスにスレーブデバイスを2個接続しようと、10個接続しようと、使う信号線はSCL,SDAの2本だけな事が最大の特長と言って良いでしょう。

 唯一心配なのは、複数のスレーブデバイスから特定の1個を指定するために使用されるスレーブアドレスの重複です。I2C通信規格のスレーブアドレスは7ビットで、いくつかのアドレスは特殊な用途に予約されているため、I2Cバスに接続可能なスレーブデバイスは最大で112個(0x08〜0x77)に限定されています。
 市販されているスレーブデバイスによって、スレーブアドレスは(半)固定なので、一緒に使いたい他のスレーブデバイスと重複してしまうと同時接続は不可能となります。重複する確率は約1%(≒1/112)だし、今までの経験上では重複して困った事はありません。

※(半)固定:スレーブデバイスの外部端子によって、数パタンのスレーブアドレスを選択可能なものがあります。そうでなければ、スレーブアドレスはデバイス毎に固定です。

 そんなこんなで、色々なモジュールを購入する時、複数のインターフェイスが選択肢にあると、使い勝手の良いI2C通信可能な方を選んで購入して来ました。

AHT10

 温度・湿度センサに立ち返って見ますと、AM2302/DHT11も悪くは無いのだけど、気が付くとI2C接続可能なモジュールを選択して購入してきた経緯もあって、「温度・湿度センサもI2C接続で計測できると便利だな」と思い始めていました。
 そんな時見つけたのが、AHT10という温度・湿度センサモジュール(下図)です。

a379_aht10.jpg

 I2C接続のモジュールなので、電源を除いた端子は2本(SCL,SDA)だけです。まずは、データシートを検索して入手しておきましょう。

  AHT10のデータシートを検索する(別ウインドウが開きます)

 見つけたデータシートによると、実はAM2302/DHT11と同じ、中華企業ASAIR(Aoson)製でした。また、AHT10は、とうの昔に型落ちしていて、後継のAHT20やらAHT30やらを搭載したモジュールも見かけます。

 定格電源電圧は3.3Vでした。そうか、5V定格のUNOで使うにはレベルシフタ(L/S)が必要なのだな……。と思ったら、すごく小さなモジュール基板なのに、随分と沢山な素子が実装されていますね(上図)。
 以下、実装された素子をマークなどから考察してみました。

  AHT10モジュール基板上に実装された素子考察:

 併せて、基板パタンなどを追跡した結果、どうやらLDOレギュレータで3.3Vに降圧した上で、MOS FET×2個と抵抗×4個を使い、以下図(およびリンク)の様なL/S(×2組)を構成してI2C信号線(SCL,SDA)をレベル変換している様です。

ar73_lvshft.png

 つまり結論としては、入手したAHT10モジュールは3.3V/5V両用、どちらでも使用可能です。良イネ🌾

今回のお買い物

 今回のお買い物は以下の通りです。

 Amazonの中華ショップで購入しました。海外からの発送で、配送料無料で、このお値段、安い!です。
 型落ちしているから?でも、そんなこと言ったら、DHT11なんて、更に昔のモジュールなのでは?今AmazonでDHT11を買おうと思ったら、600〜1,000円くらい出さないと買えません(執筆時点)。変なの。昔から使い尽くされて、ライブラリとか技術情報が蓄積されているから人気なのでしょうか?

 AHT10モジュールの話題に戻ると、発注から届くまで27日余りかかりました。約一ヶ月ですね。ただ、購入ページで予め予告されていた「お届け予定日」の範囲内で届いていますので、全く問題なしです。この価格で配送料無料ですから、納期1か月でも迷わずポチリました。

※衆議院議員選挙ですか……。上のDHT11なんかもそうですが、数年前なら200円くらいで買えていたのが、今は1,000円とかですよ。円安を容認して何の有効な対策も打たず物価高を放置してきた与党に、今更まともな対策ができるでしょうか?政府の頭が据え変わってから、何か有効な対策打ちました??よく考えて投票しよう。

AHT10の使い方

 正直、見つけたデータシートは舌っ足らずで判り難い中華品質でした。まあ、難しい制御は必要なかったので、最低限必要な情報が入手できたのは救いです。何とか普通に使う事はできそうです。

 AHT10から温度・湿度データを読み出す手順を以下にまとめます。

  AHT10測定データ取得手順:

 AHT10を使った温度・湿度の計測は、Arduino UNOを使って見たいと思います。

温度・湿度の計算

 前節にまとめた通り、データを読み出して計算すれば温度・湿度を取得できます。ですが、いざ計算しようとすると、いきなり「÷220」が必要なので、浮動小数演算が必要となります。

  「UNOで浮動小数演算するのは、ちょっと重いな……」

 UNOに限らず、非力なマイコンで制御するなら、どうしても必要な時以外は整数処理した方が良いに決まっています。

 まず、データシートから温度と湿度の解像度規定を調べました。温度は0.01℃(TYP)が規定値、湿度は0.024%RH(TYP)だと判りました。有効数字は精々、小数点以下2桁程と言う事です。これを整数処理したいと思います。各々×100倍した値を計算する事で小数点以下2桁まで整数範囲にシフトして、固定小数演算しましょう。

 温度・湿度共、計算結果の単位に注意してください。小数点以下2桁まで整数範囲にシフトしているので、計算結果を100で除したのが本来の整数値、100の剰余が小数点以下2桁の数値です。

 UNOにとっては32ビット整数演算も充分重たい処理だけど、浮動小数演算よりは少しマシなはずです。

表示器

 今回はOLED/漢字シールド(下図)を使って、AHT10で計測した温度・湿度を、OLEDディスプレイに表示してみようと思います。

a359_expr.jpg

 UNOに装着するだけで表示機器(OLEDディスプレイ)が使える様にしておいたので、気軽に使えてGoodでしょう?

 今回、OLED/漢字シールドからI2C信号線(SCL,SDA)や電源を引き出せるよう、適切なピンソケットを追加しました。OLEDディスプレイは3.3V定格なので、5V定格のUNOと接続するために、OLED/漢字シールドにはL/Sが搭載されています(こちらの回路図を参照)。
 故にOLED/漢字シールドからは、電源も含めて3.3V系/5V系どちらの信号線も引き出すことができます。I2C接続可能なモジュールの中には3.3V定格の物も多いので、UNOへ3.3V/5V定格モジュール両方との接続可能性が追加できる事には大きな利点があります。

プログラム

 温度・湿度など気象情報のセンサとしては他に、気圧の計測が可能なBMP180モジュールを所有しています。BMP180モジュールもI2Cインターフェイスなので、一緒に接続して使ってみようと思います。ただし、BMP180モジュールはオプションとします。無ければ、あるいは必要なければ、接続しなくて良いです。

 完成したプログラムを以下にリンクしておきます。

  完成プログラム:meas_aht10.ino

 OLED/漢字シールドを前提としているので、以下のマクロを設定すると日本語表示に切り替え可能としてあります。

  #define USE_UI_JP  // ui: use Japanese

 UNOへコンパイル&書き込み後、シリアルモニタを開くと以下のコマンドを受け付けています。

  シリアルモニタコマンド:

 OLED/漢字シールドが装着されていれば、リアルタイムでOLEDディスプレイに計測データを表示する様になっているので、シリアルモニタ無しで自立します。

2線式の実験

 Arduino UNO、AHT10モジュール、OLED/漢字シールド、BMP180モジュールを、以下表の通りに接続してください。

Arduino UNO 接続 OLED/漢字
シールド

接続 AHT10
モジュール

接続 BMP180
モジュール

シールドソケット シールドヘッダ  
  Vdd(3.3V) VIN VIN
GND GND GND
SCL_3V3 SCL SCL
SDA_3V3 SDA SDA

 AHT10モジュールは3.3V/5V両用だと判明しましたが、今回は上表の通り、配線が邪魔にならなかった3.3Vで接続しました。UNOとなら、5Vで接続してもOKです。適宜配線を変更してください。
 BMP180モジュールは3.3V定格なので、5V接続する場合は、こちらの様にL/Sが必要です。

 OLED/漢字シールドとBMP180はオプションです。装着しなくても、AHT10の測定結果をシリアルモニタの【show】コマンドで確認できます。

 OLED/漢字シールドを装着した場合、以下図の様にリアルタイムで測定値を確認できます。

a379_expr.jpg


 では、以下実験サンプルに従って実験を進めて行きましょう。

  実験サンプル:【 】内はシリアルモニタからの送信コマンド
  【scan】
  OK+ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f
  00:             -- -- -- -- -- -- -- --
  10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  30: -- -- -- -- -- -- -- -- 38 -- -- -- 3c -- -- --
  40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  50: 50 51 -- -- -- -- -- -- 58 59 -- -- -- -- -- --
  60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  70: -- -- -- -- -- -- -- 77
  OK: scan i2c slave address


 I2Cバスに接続されたスレーブデバイスをスキャンして見ました。スレーブアドレスとスレーブデバイスの対応は以下表でご確認ください。

スレーブ 備考
アドレス デバイス
0x38 AHT10  
0x3c OLEDディスプレイ ドライバチップSSD1306。
0x50 24C256×2個 32KB EEPROM。
2個使って、合計64KBの漢字ROM
0x51
0x58 24C256(シャドウ) こちらはシャドウアドレス。
物理的には上の24C256と同一。
0x59
0x77 BMP180  

 都合5個のスレーブデバイスが接続されているのですが、占有したI/Oポート数はSCL,SDAの2本だけです。これだけI2Cスレーブデバイスが繋がってくると、I2C通信の優位性が解りますね。I2C対応モジュールに拘って購入してきた成果です。


 OLEDディスプレイにも表示されているはずですが、シリアルモニタからもAHT10の測定データを確認しておきましょう。

  【show】
  OK: show
  SHOW+ temp= 21.70 [degC] humd= 57.08 [%RH]
  SHOW: temp= 21.6 [degC] pres= 1003.04 [hPa]

 何れも、測定時の気象情報と見て矛盾ありませんでした(冬場の日中に実験した結果です)。AHT10モジュールの温度と、BMP180モジュールの温度に多少偏差がありますが、測定精度や個体差などにより、この程度の偏差は生じるでしょう。


 お安く入手できたにもかかわらず、使いやすいI2C接続、3.3V/5V両用、小数点以下2桁ほどの解像度と、中々の好仕様でした。大満足です。


btn_arduino.png

btn_prev.png btn_next.png

home