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

このページでは ESP32 + MicroPython + MQTT を使って、 外部からLEDをON / OFF制御する方法をわかりやすく解説します。スマホやPCから MQTT メッセージを送るだけで、ESP32 の LED を制御できます。

この記事で学べること

  • MQTT を使って ESP32 をリモート制御できる
  • LED を ON / OFF できる
  • IoT の基本構造が理解できる

MQTTの仕組み(簡単)

  • Publisher:メッセージを送る
  • Subscriber:メッセージを受け取る
  • Broker:仲介サーバ

今回は、

  • PC(Linux) → Publisher
  • ESP32 → Subscriber

として動作します。

ステップごとの解説

  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

まとめ

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

類似投稿