ESP32のMicroPythonでMQTT × LED制御(MicroPython 完全ガイド)

この記事では、ESP32 に MicroPython を書き込み、MQTT メッセージを受信して LED を ON / OFF 制御する方法を解説します。

MQTT の詳しい仕組み(publish / subscribe、ブローカーの役割など)については、別記事で解説していますので、基礎から知りたい方はこちらをご覧ください。

ESP32のMicroPythonでMQTTを使う方法(基礎編)
https://try-iot.com/tutorial/micropython_mqtt/

この記事で学べること

  • ESP32 を MQTT ブローカーに接続する
  • MQTT メッセージを受信する
  • JSON形式のデータを解析する
  • 受信内容に応じて LED を ON / OFF 制御する

対象読者

  • ESP32 / MicroPython を触り始めた方
  • MQTT を使った遠隔制御を試してみたい方
  • IoT の実践的な通信処理を学びたい方

なぜ LED 制御を例にするのか

LED は 状態が目で確認できるため、MQTT の「メッセージを受信 → 処理 → 動作する」という流れを理解するのに最適です。

将来的に

  • リレー制御
  • モーター制御
  • センサー連携

へ発展させる際の基本形にもなります。

MQTTの役割(簡潔)

本記事では、ESP32 は Subscriber(受信側) として動作します。

  • MQTT ブローカーからメッセージを受信
  • 指定した topic のみを処理
  • メッセージ内容に応じて LED を制御

今回は、

  • PC(Linux) → Publisher
  • ESP32 → Subscriber

として動作します。

※ MQTT の仕組みそのものは、以下の記事で詳しく解説しています。
👉 https://try-iot.com/tutorial/micropython_mqtt/

MQTTメッセージ形式(JSON)

今回は、以下のような JSON形式 のメッセージを受信します。

{
  "led": "on"
}

なぜ JSON を使うのか

  • 将来、複数の制御項目を追加しやすい
  • センサー値や状態情報をまとめて扱える
  • IoT で一般的に使われている形式

ステップごとの解説

  1. 必要な部品を準備する
    今回も前回、MicroPythonをインストールしたM5STACK社のM5StampS3を使います。
    M5StampS3は、Amazonスイッチサイエンス社マルツエレック社などで購入することができます。
  2. M5StampS3にMicroPythonをインストールする
    前回の記事を参考にMicroPythonをインストールします。
  3. M5StampS3をPCに接続する
    M5StampS3とPCをUSBケーブルで接続します。接続できているか確認します。
ls -l /dev/tty.usbmodem*
crw-rw-rw-  1 root  wheel  0x9000006  8 24 16:37 /dev/tty.usbmodem11401
  1. VSCodeで以前、作ったプロジェクトを選択する
    VSCodeを起動して、以前、作ったプロジェクトを選択します。
  1. boot.pyをM5StampS3にアップロードする
    左側のエクスプローラにて、以前、作成した「boot.py」を選択して、右クリックから、「Upload file to Pico」をクリックして、M5StampS3にアップロードします。
  2. エディタで新しいファイルを作成する
    左側のエクスプローラにて右クリックして、「新しいファイル」を選択します。ファイル名を入力する欄が表示されるので、適当に名前を入力します。今回は、「mqtt_led.py」としました。
  1. 下記コードをエディターで記入する
    「mqtt_led.py」を選択すると、エディター画面が開くので、下記コードを記入して保存します。
from umqtt.simple import MQTTClient
import network
import time
import json
import binascii
import machine
import neopixel

# WiFi接続
# WiFiのssid
ssid = "SSID"
# WiFiのパスワード
password = "PASSWORD"

# MQTT Broker
server = "broker.hivemq.com"

# TOPIC
TOPIC = b"test/topic/esp32"
client_id = binascii.hexlify(machine.unique_id())

pin = machine.Pin(21, machine.Pin.OUT)   # NeoPixel 駆動のための GPIO 21 を出力に設定
np = neopixel.NeoPixel(pin, 8)   # 8ピクセル用の NeoPixel ドライバーを GPIO 21 で作成

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected():
    time.sleep(0.5)

# MQTT接続
client = MQTTClient(client_id, server, port=8883, ssl=True)
client.connect()

# メッセージ送信
client.publish(TOPIC, b"Hello MQTT!")

# メッセージ受信
def sub_cb(topic, msg):
    print((topic.decode(), msg.decode()))
    data = json.loads(msg.decode())
    print(data)
    print(data["led"])
    if data["led"] == "on":
        print("led on")
        led_on()
    elif data["led"] == "off":
        print("led off")
        led_off()

# LED ON
def led_on():
    np[0] = (255, 0, 0) # 第1ピクセルを赤に設定
    np.write() # 全ピクセルにデータ書込み

# LED OFF
def led_off():
    np[0] = (0, 0, 0) # 第1ピクセルを消灯に設定
    np.write() # 全ピクセルにデータ書込み

client.set_callback(sub_cb)
client.subscribe(TOPIC)

print("Connected to %s, subscribed to %s topic" % (server, TOPIC))

try:
    while True:
        client.wait_msg()
finally:
        client.disconnect()
  1. 「mqtt_led.py」を実行する
    左のエクスプローラにて、「mqtt-led.py」を選択して、右クリックから、「Run current file on Pico」をクリックすると、REPL画面に下記のように、MQTTブローカーに接続したことが表示されます。
MicroPython v1.26.1 on 2025-09-11; Generic ESP32S3 module with ESP32S3
Type "help()" for more information or .help for custom vREPL commands.

>>> 
Connected to broker.hivemq.com, subscribed to b'test/topic/esp32' topic
  1. Publish側を作成する
    PC(Linux)にて、node.jsをインストールし、下記のコードを記入して、index.jsとして保存します。
import mqtt from 'mqtt'
const client = mqtt.connect('mqtts://broker.hivemq.com', {
   rejectUnauthorized: false
});

const topic = "test/topic/esp32"

const argv = process.argv[2]
console.log(argv)

let msg;
if (argv === "on") {
  msg = {
    'led': 'on',
  }
} else {
  msg = {
    'led': 'off',
  }
}

client.on('connect', () => {
    console.log("MQTT connected");
    client.publish(topic, JSON.stringify(msg))
    client.end()
})
  1. mqttモジュールをインストールする
    npmをインストールしてから、mqttモジュールをインストールします。
$ npm init
$ npm install mqtt
  1. 下記コマンドを実行する
ESP32S3のLEDを点灯する
$ node index.js on

ESP32S3のLEDを消灯する
$ node index.js off

まとめ

  • MQTT を使うことで ESP32 を遠隔制御できる
  • JSON形式を使うと拡張しやすい
  • LED制御は MQTT の理解に最適な例
  • この仕組みを応用すれば、さまざまな IoT 制御に発展可能

ESP32とMicroPythonを使えば、シンプルなコードでMQTTプロトコルで通信ができます。応用すればIoTデバイスに簡単に組み込めます。

類似投稿