前回の記事で、ESP32とAM2302を使って温湿度を測定できるようになりました。

次は、実際に無線を使って測定データを送ってみたくなりますよね。
そこで今回、ESP32で測定した温湿度データをMQTT通信でラズパイ5へ送信し、SSD1306 OLEDディスプレイへ表示する構成を試してみました。
ラズパイ5とOLEDディスプレイは、以下で動作確認したものを使用します。

今回の内容は分量が多いため、3つの記事に分けて説明します。本記事【前編:環境構築編】では、
- Raspberry Pi 5へMosquittoを導入
- ESP32のMicroPython環境準備
- umqtt.simpleの配置
といった内容について、実際に試した構成をもとに分かりやすく解説していきます。
今回のシステム構成
今回のシステム構成は以下のようになります。

温湿度センサAM2302はESP32に接続、SSD1306 OLEDディスプレイはラズパイ5に接続しています。
ESP32とラズパイ5の間はwifi接続。測定した温湿度データは「MQTT」を使ってラズパイ5に送信しています。ラズパイ5は「データを受信して表示する側」として動作します。
最終的には、OLEDディスプレイに測定データをリアルタイム表示します。
MQTTって何?
MQTTというのは、デバイス同士でデータをやりとりするのによく使われる通信方式です。軽量なので、ESP32やRaspberry Piのような小型デバイスでの利用に向いています。
中継役が存在
MQTTの特徴の一つとしては、送信側と受信側の間に
ブローカー(Broker )
という中継役が入っていることです。
またMQTTでは、データの送信者をパブリッシャー(Publisher)といい、データの受信者をサブスクライバー(Subscriber)といいます。
つまり、今回のシステムを表すと以下のようになります。

ESP32がパブリッシャーで、ラズパイ5がブローカー(Mosquitto)とサブスクライバー(OLEDディスプレイ表示プログラム)を兼ねています。
サブスクライバーは、こういうデータを送ってほしいと予めブローカーに登録しておきます。これをサブスクライブ(subscribe)といいます。このとき、データの分類名(トピック)を指定して登録します。
ブローカーは、指定されたトピックのデータをパブリッシャーから受信すると、それを中継してサブスクライバーに配信します。
Topicでデータを分類する
MQTTでは、
トピック(Topic)
という名前でデータを分類する仕組みをとっています。
例えば、今回のシステムで測定する温湿度データを「sensor/temperature」というトピックに決めます。トピックを介したデータの流れは、以下のようになります。
- サブスクライバー:表示プログラム
「sensor/temperature のデータを受信したい」とブローカーに登録(サブスクライブ) - パブリッシャー:ESP32
ブローカーのTopic(sensor/temperature)に温湿度データを送信(パブリッシュ) - ブローカー:ラズパイ5のMosquitto
サブスクライバー(表示プログラム)に温湿度データを配信
仕組みとしては、「YouTubeのチャンネル登録」に近いように思います。
つまり、Topic = チャンネルとして、
「このチャンネルの更新を知りたい」とyoutubeに登録
→ チャンネル所有者が新規動画を投稿すると、youtubeが通知してくれる
のように、youtube登録チャンネルの新着通知と思うとイメージしやすいですね。
同時配信が可能
MQTTは、ブローカーを介して複数の受信者(サブスクライバー)に同時配信できます。
例えば、以下の受信者がトピック(sensor/temperature)をサブスクライブしているとします。
- SSD1306表示プログラム
- Webダッシュボード
- スマホアプリ
この状態でESP32がデータを1回送信すると、ブローカーはこれらの受信者にデータを同時配信します。youtubeでも、チャンネル登録者全員に新着通知されますよね。それと同じようなものです。
ラズパイ5にMQTT Brokerを構築する
それでは、今回のシステムの環境構築手順について、
- ラズパイ5側
- ESP32側
に分けて説明していきます。
まずは、ESP32から温湿度データを受け取る準備として、ラズパイ5にMQTT Brokerを構築します。ブローカーをラズパイ側へ置いておくことで、将来的に複数のESP32を追加したり、Webアプリへデータを渡したりといった拡張もしやすくなります。
今回は、MQTT Brokerとして定番の「Mosquitto」を使用しました。
Mosquittoは軽量で扱いやすく、ラズパイとの相性も良いため、個人のIoT環境では非常によく使われています。
インストール
まずはパッケージ情報を更新し、Mosquittoをインストールします。
sudo apt update
sudo apt install mosquitto mosquitto-clientsmosquitto がBroker本体、mosquitto-clients が動作確認用のクライアントツールです。
インストールが完了したら、ブローカーを自動起動するよう設定します。
sudo systemctl enable mosquitto
sudo systemctl start mosquitto正常に起動しているか確認するには、以下のコマンドを実行します。
systemctl status mosquitto
active (running) と表示されていれば正常に動作しています。

MQTT通信をテストする
ブローカーが正しく動いているか確認するため、まずはラズパイ上でMQTT通信テストを行ってみます。
最初に、受信側(サブスクライバー)を起動します。
mosquitto_sub -t testこの状態で別ターミナルを開き以下を実行すると、送信側(パブリッシャー)からテストメッセージが送信されます。
mosquitto_pub -t test -m "hello"すると、サブスクライバー側のターミナルに「Hello」と表示されます。

これでMQTT Brokerが正常に動作していることを確認できました。
Mosquittoのアクセス制限を解除する
Mosquittoをインストールした直後の状態では、ESP32などの外部機器からMQTT接続できない場合があります。
実際、ESP32側からMQTT接続しようとすると、
OSError: [Errno 104] ECONNRESET
が発生しました。最初はESP32側コードの問題かと思ったのですが、原因はMosquitto側のアクセス制限でした。Mosquittoは初期状態だと、
「同じPCからのローカル接続のみ許可」
のような状態になっている場合があります。そのため、ESP32のような別機器から接続するには、以下のような設定変更が必要になります。
まず、Mosquitto設定ファイルを開き、
sudo nano /etc/mosquitto/mosquitto.confファイルの最後に以下を追記します。
listener 1883
allow_anonymous true- listener 1883 : MQTT通信用ポート1883の待ち受け
- allow_anonymous true: ユーザー認証なしでも接続可能
設定変更後は、Mosquittoを再起動します。
sudo systemctl restart mosquitto念のため、1883ポートが待ち受け状態になっているかssコマンドを使って確認してみます。
sudo ss -tuln | grep 1883正常に設定できている場合は、
tcp LISTEN 0 128 0.0.0.0:1883 0.0.0.0:*
のような表示になります。以下の表示があればOKです。
- 1883 → MQQTポート
- LISTEN → 待ち受け中
- 0.0.0.0 → すべての接続を許可
これでESP32からMQTT接続できるようになりました。
IPアドレスは固定化しておく
アドレス割り当てをDHCPにしていると、時間の経過やラズパイの起動でIPアドレスが変わる場合があり、ESP32側で設定していた接続先アドレスと一致しなくなってしまいます。
そのため、MQTTを使う場合はラズパイ側のIPアドレスを固定化しておくのがおすすめです。

ESP32で使用するライブラリを準備する
次に、ESP32側の環境構築に進みます。
まずは、ESP32でMQTT通信を行うために必要となる 「umqtt.simple」 の入手方法や、MicroPython特有のライブラリ配置について確認していきます。
使用するライブラリについて
ESP32でMQTT通信を行うために、今回は「umqtt.simple」 というMicroPython用ライブラリを使用します。
通常のPythonでは paho-mqtt がよく使われますが、MicroPython環境ではより軽量な umqtt.simple が定番となっています。
ライブラリで使用するファイル
umqtt.simple は、以下の2つのPythonファイルを使用します。
- simple.py
- robust.py
今回の動作確認だけなら simple.py だけでも問題ありません。
ただ、robust.py は通信切断時の再接続処理などに対応した拡張版なので、将来的な拡張を考えて一緒に配置しておくと便利です。
ファイルを入手する
umqtt.simple は、MicroPython公式ライブラリとして公開されています。
ファイルを入手するには、公式GitHubのsimple.pyページにアクセスして右上のRawをクリック。

Pythonコードだけが表示されるので、右クリック→「名前を付けてページを保存」を選択して「simple.py」という名前で保存します。
robust.pyも同様に保存します。
ESP32のMicroPython環境を構築する
使用するライブラリを準備できたら、次はESP32側のMicroPython環境を構築していきます。
ThonnyでESP32へ接続する
MicroPython開発環境としては、「Thonny」を使用します。
ThonnyはESP32との相性が良く、
- コード編集
- ファイル転送
- シリアル通信
をまとめて行えるため、MicroPython初心者にも使いやすいです。
Thonnyのインストール方法やESP32へのMicroPython書き込み手順については、以下の記事で詳しく解説しています。

ESP32をUSBに接続した状態でThonnyを起動し、シェルに以下のような起動メッセージが出てくればOKです。

起動メッセージが出ない場合、ウィンドウ右下のインタプリタ表示をクリックして「MicroPython(ESP32)…」を選択します。問題なければ動作が自動的に開始され、シェルに起動メッセージが表示されます。

ESP32のファイル構成を確認する
MicroPythonでは、PythonファイルをESP32の内部ストレージに保存して実行します。
そのため、まずはESP32側にどのようなファイルが保存されているか確認してみます。
Thonnyのメニューから「表示」を選択し、「ファイル」にチェックを入れます。すると、ESP32内部のファイルが左側に表示されます。

上で表示されているboot.py は、ESP32起動時に最初に実行されるファイルです。例えば、
- Wi-Fi初期設定
- CPUクロック設定
- マウント処理
など起動時の基本設定を書く用途で使われますが、最初は無理に触らなくても大丈夫です。
boot.pyの他、main.pyというファイルがある場合もあります。これは起動後に実行されるメインプログラムです。
ライブラリをインストールする
それでは、上で入手したファイルをインストールしていきます。
なお、通常のPythonライブラリで使うpip installは、MicroPythonでは使えません。そのため、必要な .py ファイルをESP32内部に直接転送することでインストールします。
umqttフォルダを作成
まずは、ESP32内部に「umqttフォルダ」を作成します。
Thonny左側の「Micro Pythonデバイス」で右クリックし、メニューから「新しいディレクトリ」を選択。

続いて、名前を入力します (フォルダ名は「umqtt」とした)。これで、umqttフォルダが作成されました。

ファイルをumqttフォルダに転送する
上で用意したsimple.pyをESP32に転送します。
Thonnyでsimple.pyを開き、ファイル→「名前を付けて保存」を選び、保存先として「MicroPythoデバイス」を選択。

ファイル名を入力して、umqttフォルダに保存します。

同様にしてrobust.pyもumqttフォルダに保存します。
これで、umqttフォルダ内に上の2つのファイルが保存された状態になります。
/umqtt
├── simple.py
└── robust.py
このようにファイルを配置することで、Pythonコード側からは以下のように読み込めるようになります。
from umqtt.simple import MQTTClientシステムの環境構築は以上で完了です!
まとめ
今回は、ESP32とラズパイ5をMQTT連携するための環境構築を行いました。
普通のPython環境とは異なる部分も多いため、最初は分かりにくいと感じたかもしれません。ただ、一つずつ確認していくことで、
- ESP32のMicroPython環境
- MQTT Broker
- MQTTライブラリ
の関係が少しずつ把握でき、IoTシステムの土台が見えてくると思います。
次回の【中編:ESP32送信編】では、AM2302で取得した温湿度データをJSON形式へ変換し、MQTTを使ってラズパイ5へ送信するところまで進めます。
