当ブログの電子工作記事では、これまでラズパイをとりあげてきました。

今回は、Wi-Fi + Bluetooth機能を搭載したESP32を使って温湿度の取得に挑戦してみます。
センサは、温湿度を測定可能なAM2302を使用。開発ツール「Thonny」からMicroPythonを書き込み、シリアルモニタに温度と湿度を表示するシンプルな構成で試してみました。
本記事では、ESP32とAM2302の配線方法から、MicroPythonを使った温湿度の取得方法、実際に動かしてみた結果までを解説します。
使用した機材
まずは、今回の温湿度測定で使用した機材を紹介していきます。
使用したパーツは以下のとおりです。ブレッドボード上にESP32とAM2302を配置する構成としています。
- ESP32
- AM2302
- ブレッドボード (6穴タイプ)
- プルアップ抵抗 4.7KΩ
- ジャンパワイヤ
- USBケーブル
ESP32
今回使用したボード
ESP32は、秋月電子で購入した「ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB」を使用しました。

Amazonなどの通販サイトでもESP32関連ボードを入手できますが、「技適マーク」の有無に気を付けてください。無線機能を搭載しているため、日本国内の場合は技適取得済みのものを使う必要があります。今回のボードは、

赤で囲ったところに小さい文字ですが、技適マークと認証番号「211-200403」が入っています。
ちなみにESP32ボードはいろいろ種類があって、ボード形状、フラッシュ容量、USBチップなど製品によって異なります。そのため、「同じESP32でも微妙に違う」可能性があります。
また、「ESP32」というのは、Espressif Systemsが開発しているマイコンシリーズ全体を指していることもあります。今回使うのは定番のものですが、ESP32-S3やESP32-C3など新しいシリーズも登場しています。
ESP32という呼び方が少し分かりにくい
調べていて最初混乱したのが、「ESP32」という名称の使われ方です。実際には、
- チップ
単体のESP32チップ - WROOM / WROVER(無線モジュール)
ESP32チップに周辺回路やアンテナをつけて、使いやすくまとめた「モジュール」 - DevKit(開発ボード)
「モジュール」を搭載し、さらにGPIOピンやUSB端子を追加したボード
のように階層が分かれています。
例えば、今回使用するのは、「WROVER」モジュールを搭載した開発ボードという位置付けになります。
ただ、これらの違いははっきり区別されず、
- チップ名
- モジュール名
- 開発ボード名
を全部まとめて「ESP32」と呼ぶことが多いです。ややこしいですが、これは慣れるしかないですね。
AM2302
AM2302は、温度と湿度を同時に測定できるセンサです。DHT22互換として販売されていることも多く、比較的高精度に測定できるのが特徴です。こちらも秋月で購入しました。

このセンサは、1本のデータ線だけで通信を行うシリアル単線通信を採用しています。配線はシンプルですが、I2Cのようなクロック線を持たないため、配線を長くすると通信が不安定になる可能性があります。
ピンアサインは、写真上からVDD、SDA、NC、GNDになります。NCは未接続なので、実質的には3ピンしか使いません。

ブレッドボード
今回は、ESP32とAM2302をブレッドボード上で配線して動作確認します。
注意したいのが、ESP32とブレッドボードのサイズ問題です。ESP32は基板幅が広いため、よく使われる「両側に電源レールがある5穴タイプ」だと片側のGPIO列しか使えなくなってしまいます。

これを解消するには、以下のように電源レールが片側のみの6穴タイプを使います。

このタイプであれば、ESP32を挿入しても両側のGPIOを使えます。

今回の回路は片側のGPIOしか使わないため5穴タイプでも大丈夫ですが、今後の拡張も考えて6穴タイプを使いました。
その他の部品
【プルアップ抵抗】

AM2302のデータ線はオープンドレインのため、VCCへのプルアップ抵抗が必要になります。データシートには約5.1KΩと記載されていますが、今回は4.7kΩを使用しました。
【ジャンパワイヤ】

ジャンパワイヤは5本使います。今回は、単線タイプのジャンパワイヤを使いました。
理由としては、できるだけ配線を短くシンプルにまとめたかったためです。上に書いたように、AM2302はシリアル単線通信を使用しています。そのため配線が長すぎると、タイミングの関係で読み取りエラーになる場合があります。
単線タイプのジャンパワイヤはやや固いのですが、ボードに密着させて短い距離で配線可能です。ボード上がゴチャゴチャしないので見通しが良くなるという利点もあります。
【USBケーブル】

PCとESP32ボードを接続するのに使います。USBの形状はMicro USB Type-Bです。私はダイソーで買ったケーブルを使いました。
ESP32とAM2302の配線
今回は、ESP32とAM2302をブレッドボード上で配線して動作確認を行いました。
AM2302は電源・GND・データ線の3本のみで使えるのでシンプルな構成です。
回路図

AM2302のDATA端子は、ESP32のGPIO26に接続しました。
DATA線と3.3Vの間には4.7kΩのプルアップ抵抗を入れています。AM2302は5Vにも対応していますが、今回はESP32の3.3Vで駆動します。
配線図
配線図は以下のとおりです。

配線図のとおり、実際に配線してみました。AM2302のデータ線(配線図で赤のワイヤ)は、ちょうどいい長さのジャンパワイヤがなく、少し曲げて配線しています。

配線が済んだら、ブレッドボード上のESP32とPCをUSBケーブルで接続します。

MicroPython環境を準備する
今回のESP32開発では、プログラミング言語としてMicroPythonを使用しました。
MicroPythonは、マイコン向けに軽量化されたPythonです。通常のPythonに近い書き方でGPIO制御やセンサ読み取りができるため、電子工作初心者でも扱いやすいです。
Thonnyをインストールする
ESP32でMicroPythonを使うには、最初にMicroPythonファームウェアを書き込む必要があります。開発環境としてはvscodeを使う方法もありますが、今回はシンプルで扱いやすいThonnyを使用します。
公式サイトからインストーラをダウンロードします(windowsであれば、下の赤枠のもの)。

ダウンロードファイルを実行してインストーラが起動したら、基本的にNextボタンを押し続ければインストールが完了します。
インストールが終わったら、Thonyを起動しておきます。
ESP32へMicroPythonを書き込む
プログラムを実行する前に、ThonnyからMicroPythonを書き込みます。
まず、Thonnyのメニューから「ツール」→「オプション」を選択してThonnyオプションを開き、「インタプリタ」タブの以下の項目を選択します。
- インタプリタ →「MicroPython(ESP32)」
- ポート → ESP32と接続している通信ポート

続いて、ウィンドウ下部の「Install or update MicroPython (esptool)」をクリックします。

Install MicroPythonの画面が開くので、通信ポートを再度選択し、その下のfamilyとvaliantを以下のように選択します。
- family → ESP32
- variant → Espressif・ESP32 / WROOM
(今回使っているWROVERの選択肢はなかったので、WROOMを選択しました)

versionは、自動的に最新のものが選択されます。
あとは、「インストール」ボタンを押すとMicroPythonのインストールが始まります。

インストールは2分ぐらいで完了しました。終わったら「閉じる」を押し、

Thonnyオプションの画面を抜けます。
これで、ESP32上でMicroPythonが動作するようになります。
シリアル接続を確認する
MicroPythonの書き込み後、Thonnyのシェルに以下のようなメッセージが表示されれば接続成功です。

この「>>>」はREPL(対話実行モード)と呼ばれるもので、ここへPythonコードを直接入力して実行できます。
例えば、
print("Hello ESP32")と入力すれば、その場で実行結果を確認できます。
ここで、フラッシュメモリのサイズを確認してみます。シェルから以下のように入力するとフラッシュメモリサイズが返ります。
import esp
print(esp.flash_size())試しに実行すると、ちゃんと8MB版として認識されていました。問題なく動作しているようですね。

ここまでくれば、センサ制御やGPIO操作を試せるようになります。
AM2302を読み取るコード
配線と開発環境の用意ができたら、いよいよAM2302から温湿度データを読み取ってみます。
MicroPythonにはDHT系センサ用ライブラリが標準で用意されているため、比較的少ないコードで簡単に扱えます。今回は、2秒ごとに温度と湿度を取得し、シリアルモニタに表示するプログラムを作成しました。
サンプルコード
from machine import Pin
import dht
import time
# GPIO26へ接続
sensor = dht.DHT22(Pin(26))
while True:
# センサー測定実行
sensor.measure()
# 温度と湿度を取得
temp = sensor.temperature()
hum = sensor.humidity()
# 結果表示
print("Temperature:", temp, "C")
print("Humidity:", hum, "%")
print("--------------------")
time.sleep(2)コードの内容を簡単に解説
まず最初に、必要なライブラリを読み込んでいます。
from machine import Pin
import dht
import timemachineはGPIO制御用、dhtはAM2302/DHT22用ライブラリ、timeは待ち時間処理に使用しています。
次に、GPIO26へ接続したAM2302を初期化します。
sensor = dht.DHT22(Pin(26))ここで指定している「26」はGPIO番号です。別のGPIOへ接続した場合は、この番号を変更してください。
測定を実行
sensor.measure()AM2302で測定する際、まずはmeasure()を実行する必要があります。
sensor.measure() は、通信シーケンスを実行してAM2302からデータを受信し、受信データを内部バッファに入れるメソッドです。つまり、これを実行しておかないとデータが得られません。通信シーケンスは、GPIOの電圧変化タイミングを利用して行われます。
そして、以下の2行を実行すると、最新のmeasure()による受信データから温湿度の値が得られます。
temp = sensor.temperature()
hum = sensor.humidity()2秒以上間隔を空ける
AM2302は、高速な連続読み取りには対応できず、読み取り間隔を短くしすぎるとエラーになる場合があります。
今回は安全を見て、
time.sleep(2)で2秒待機しています。
実際に動かしてみた
実際にコードを書き込み、ESP32とAM2302を動作させてみました。
実行方法は簡単で、Thonnyのエディタ部分にプログラムコードを貼り付け、実行ボタンを押すだけです。

コードを保存する場合は、メニューの「ファイル」→「名前を付けて保存」を選択します。下のようにPCかESP32のどちらに保存するか聞かれるので、いずれか選択して保存します。

さて、実際に実行してみると…シェルに温度と湿度が2秒ごとに表示されました!

温度は26℃前後、湿度は50%程度ですね。温湿度計付き時計の表示値と比較してみましたが、だいたい合っています。

センサに息を吹きかけると湿度が上昇し、

ドライヤーを使ってセンサに温風をあてると、温度が上昇しました。


ちゃんと反応して動いているみたいです。その後1時間ほど動かしていましたが、エラーもなく動作していました。
まとめ
今回は、ESP32-DevKitC 8MBとAM2302を使い、MicroPythonで温湿度を取得してみました。
GPIO26を使用し、2秒ごとに安定して温湿度データを取得できています。MicroPython環境も比較的簡単に構築できたので、ESP32電子工作の入門として楽しいテーマでした。
今後はESP32の無線機能を使って、
- MQTT送信
- Webダッシュボード表示
- 水耕栽培との連携
といったIoTに発展させたいと考えています。
本記事がこれからESP32やIoT電子工作へ挑戦してみたい方の参考になれば嬉しいです。
