0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32-S3 を WiFi 対応させて IoT デバイスとして使えるようにした話

0
Last updated at Posted at 2026-04-27

✨はじめに

以前こちらの記事で、USB シリアル経由で JSON コマンドを送るだけで I/O を制御できる ESP32-S3 デバイス を紹介しました。

👉 https://qiita.com/Noritama-Lab/items/8b4ae6f8f7738d76fa5b

今回はこの USB 版をベースに従来機能を残しつつ、以下の機能を追加して
ESP32-S3 IO デバイスを “そのまま IoT デバイス” として使えるように進化 させました。

  • ネットワーク越しに I/O 制御
  • 複数デバイスを同時に扱える
  • スマホから操作可能
  • USB ケーブル不要で運用できる

まず触ってみたい方は、こちらからファームウェアをダウンロードできます。

👉 https://github.com/noritama-lab/esp32io-firmware/releases/tag/f-v1.0.4


🚀今回のアップデートで何が変わった?

ESP32-S3 IO デバイスが IoT デバイスとして使えるようになったポイントをまとめます。

✔ USB だけでなく Wi‑Fi でも制御可能に

USB 版と同じ JSON コマンドを、HTTP GET で送るだけで動作します。

http://(ESP32のIPアドレス)/api?cmd=ping

ブラウザに入力するだけで応答が返ります。

image.png

これにより、スマホ・Python・Raspberry Pi・Excel など
ネットワークにつながるあらゆる環境から I/O を制御可能 になります。


mDNS 対応で固定IP不要

デバイス名でもアクセスできます。
※安定性を求める場合は固定IPの方がおすすめです。

http://ESP32_S3_IO_XXXXXX/api?cmd=ping

XXXXXX は MAC アドレス下位 3 バイトから自動生成。

image.png


Web 設定ポータルを搭載

電源投入時に AP モードが起動し、スマホやPCから Wi‑Fi 設定が可能。

  • SSID:ESP32_S3_IO_XXXXXX
  • PASS:esp32setup
  • URL:http://192.168.4.1 または http://ESP32_S3_IO_XXXXXX

image.png

設定できる項目:

項目 内容
WiFi SSID 接続先のSSID
WiFi Password パスワード
Wireless Radio Enabled / AP Only
IP Addressing DHCP / Static IP
RGB LED Mode WiFi Status / Manual Control

LED の状態表示例:

LED 状態
緑点灯(ゆっくり) 接続済
青点滅 ネットワーク検索中
赤高速点滅 デバイスリセット

image.png

※ BOOT 長押しで設定リセット可能。


API を拡張(LED / システム情報など)

以前公開した部分はそのまま残しつつ機能を追加しています。
Wi‑Fi と USB で 同じ JSON コマンド を利用できます。

コマンドの形式:

{"cmd": "コマンド名", ...}

主なコマンド一覧:

コマンド名 説明
read_di デジタル入力を読む
set_do デジタル出力を設定
get_io_state 全 I/O 状態をまとめて取得
read_adc ADC 値を取得
set_pwm PWM デューティ設定
set_pwm_config PWM 周波数・分解能設定
set_rgb 内蔵RGB LEDを制御
set_led_mode LEDモード切替
get_status 稼働時間・メモリ・IPなど取得
ping 生存確認
help コマンド一覧取得

(詳細は記事の最後にある「JSON コマンド一覧」にまとめています)


📡どんな IoT 用途に使える?

Wi‑Fi 対応により、用途が一気に広がります。

✔ Node-RED と組み合わせてダッシュボード化

  • DO の ON/OFF
  • ADC のグラフ化
  • PWM をスライダーで調整

✔ Excel から I/O を制御

HTTP GET なので、WEBSERVICE() で叩けます。

✔ Python で自動化スクリプト

USB でも Wi‑Fi でも同じ JSON を送るだけ。

✔ 教育用途にも最適

  • ネットワーク越しの I/O 制御
  • JSON API
  • mDNS
    IoT の基礎が全部詰まっています。

🛠️セットアップ手順(IoT 版)

1. ファームウェアを書き込む

ESP32-S3 用ファームウェア:

👉 https://github.com/noritama-lab/esp32io-firmware/releases/tag/f-v1.0.4

ESP32-S3-DevkitC-1 への書き込み方法:

👉 https://qiita.com/Noritama-Lab/items/d50cff13af655c5e2fd0

2. AP モードで Wi‑Fi 設定

  • SSID:ESP32_S3_IO_XXXXXX
  • URL:http://192.168.4.1 または http://ESP32_S3_IO_XXXXXX

3. 通常アクセス

http://ESP32_S3_IO_XXXXXX.local

🐍Python から使う(USB / Wi‑Fi)

USB(シリアル)版

import serial
import json
import time

ser = serial.Serial("COMX", 115200, timeout=1)

def send(cmd):
    ser.write((json.dumps(cmd) + "\n").encode())
    time.sleep(0.05)
    resp = ser.readline().decode().strip()
    print("Response:", resp)

send({"cmd": "ping"})
send({"cmd": "set_do", "pin_id": 0, "value": 1})
send({"cmd": "read_adc", "pin_id": 0})

Wi‑Fi(HTTP)版

import requests
import json

BASE_URL = "http://ESP32_S3_IO_XXXXXX.local/api"

def send(cmd: dict):
    resp = requests.get(BASE_URL, params=cmd, timeout=2)
    try:
        data = resp.json()
    except:
        data = resp.text
    print("Response:", data)

send({"cmd": "ping"})
send({"cmd": "set_do", "pin_id": 0, "value": 1})
send({"cmd": "read_adc", "pin_id": 0})

🔗GitHub(ファームウェアはこちら)


✅まとめ

今回のアップデートで、USB でも Wi‑Fi でも扱える IoT デバイスが完成しました。
IoT の学習にも、プロトタイピングにも、実運用(安定性は未確認…)にも使える便利なデバイスになったと思います。

今後は、このデバイスを使ったロギングアプリや Excel 連携などに挑戦して記事にしていく予定です。

※このデバイスを Python から扱いやすくするための API をつくって記事にしました。

📘JSON コマンド一覧(詳細)

コマンドは、USB通信 と Wi-Fi通信 で共通です。

コマンド 説明 入力パラメータ 応答
read_di デジタル入力ピンの値を読み取ります。 pin_id: 読み取るデジタル入力ピンのID(0~5)。 status: "ok", value: ピンのデジタル値 (0または1)。エラー時はERR_RANGE
set_do デジタル出力ピンの値を設定します。 pin_id: 設定するデジタル出力ピンのID (0からDIO_OUT_COUNT-1)。
value: 設定する値 (0でLOW、1でHIGH)。
status: "ok"。エラー時はERR_RANGEHardware.writeDOを呼び出します。
get_io_state すべてのIO (デジタル入力、デジタル出力、ADC、PWM) の現在の状態をまとめて取得します。 なし status: "ok", dio_in: デジタル入力値の配列。
dio_out: デジタル出力値の配列。
adc: ADC値 (mV) の配列。
pwm: PWMデューティ値の配列。
read_adc 指定されたADCピンのアナログ値を読み取ります (複数回サンプリングし平均化)。 pin_id: 読み取るADCピンのID (0からADC_COUNT-1)。 status: "ok", value: 平均化されたADC値 (mV)。エラー時はERR_RANGE
set_pwm 指定されたPWMチャンネルのデューティサイクルを設定します。 pin_id: 設定するPWMチャンネルのID (0からPWM_COUNT-1)。
duty: 設定するデューティ値 (0からgetSafeMaxDuty())。
status: "ok", duty: 設定されたデューティ値。エラー時はERR_RANGEHardware.setPwmDutyを呼び出します。
get_pwm_config 現在のPWM周波数、分解能、および安全な最大デューティ値を取得します。 なし status: "ok", freq: 現在の周波数。
res: 現在の分解能。
max_duty: 安全な最大デューティ値。
set_pwm_config すべてのPWMチャンネルの周波数と分解能を設定します。デューティ値は新しい分解能に合わせて自動的にスケーリングされます。 freq: 設定する周波数 (Hz、省略時はDEFAULT_PWM_FREQ)。
res: 設定する分解能 (ビット、省略時はDEFAULT_PWM_RES)。
status: "ok"Hardware.applyPwmConfigを呼び出します。
set_rgb 内蔵RGB LEDの色と明るさを設定します。自動的にLEDモードが手動制御に切り替わります。 r, g, b: 赤、緑、青の成分 (0-255)。
brightness: 明るさ (0-255、省略時は0)。
status: "ok", r, g, b, brightness: 設定された色と明るさ。AppNet.setLedStatusMode(false)Hardware.setLedColorを呼び出します。
led_off 内蔵RGB LEDを消灯します。自動的にLEDモードが手動制御に切り替わります。 なし status: "ok"AppNet.setLedStatusMode(false)Hardware.setLedColor(0,0,0)を呼び出します。
set_led_mode 内蔵RGB LEDの動作モードを設定します。 mode: "status" (WiFiステータス表示) または "manual" (手動制御)。 status: "ok", mode: 設定されたモード。AppNet.setLedStatusModeを呼び出します。manual設定時はLEDを消灯します。
get_led_state 内蔵RGB LEDの現在の色、明るさ、および点灯状態を取得します。 なし status: "ok", on: 点灯しているか (bool)。
r, g, b, brightness: 現在の色と明るさ。
get_status システムの動作状況 (稼働時間、空きヒープメモリ、WiFi接続状態、IPアドレス) を取得します。 なし status: "ok", uptime_ms: 稼働時間 (ミリ秒)。
free_heap: 空きヒープメモリ (バイト)。
wifi_connected: WiFi接続状態 (bool)。
wifi_ip: WiFiのローカルIPアドレス。
ap_ip: アクセスポイントのIPアドレス。
ping デバイスが応答可能かを確認します。 なし status: "ok", message: "pong"
help 利用可能なすべてのAPIコマンドの一覧を返します。 なし status: "ok", commands: 利用可能なコマンド名の配列。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?