ESP32とラズパイ5をMQTT連携|AM2302の温湿度をSSD1306へ表示【前編:環境構築編】

当ページのリンクには広告が含まれています。

前回の記事で、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のような小型デバイスでの利用に向いています。

「Message Queuing Telemetry Transport」の頭文字をとって「MQTT」と呼びます。

中継役が存在

MQTTの特徴の一つとしては、送信側と受信側の間に

ブローカー(Broker )

という中継役が入っていることです。

今回のシステムは、ラズパイ5上で「Mosquitto」という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-clients

mosquitto が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: ユーザー認証なしでも接続可能

今回は家庭内LANでの動作確認が目的なので、この設定にしました。実際の運用では、セキュリティ対策が必要です。

設定変更後は、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用ライブラリを使用します。

umqtt.simple は、ESP32のような小型マイコン向けに作られた軽量なMQTTライブラリです。

通常のPythonでは paho-mqtt がよく使われますが、MicroPython環境ではより軽量な umqtt.simple が定番となっています。

ライブラリで使用するファイル

umqtt.simple は、以下の2つのPythonファイルを使用します。

umqtt.simpleで使用するファイル
  • 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というファイルがある場合もあります。これは起動後に実行されるメインプログラムです。

例えば、ESP32起動時に自動で温湿度送信を開始したい場合は、今回作成するコードを main.py として保存すればOKです。

ライブラリをインストールする

それでは、上で入手したファイルをインストールしていきます。

なお、通常の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へ送信するところまで進めます。

目次