ブログ 読了時間: 7分

M5StickC Plus2で自作スマート加湿器!温湿度センサーと赤外線で自動制御&スマホ連携完全ガイド

2025年12月12日

M5StickC Plus2で自作スマート加湿器!温湿度センサーと赤外線で自動制御&スマホ連携完全ガイド

KUREBA

はじめに:なぜ「自作スマート加湿器」なのか?

冬の乾燥、夏のエアコンによる湿度低下。快適な空間を保つために加湿器は欠かせませんが、「手動でのオンオフが面倒」「いつの間にか部屋がジメジメに…」といった悩みもつきものです。市販のスマート加湿器は便利ですが、高価であったり、既存の愛用している加湿器をスマート化できなかったりします。

この記事では、コンパクトで高機能なIoT開発ボード「M5StickC Plus2」を使い、お使いの加湿器を「自作」でスマート化する全手順を、初心者にも分かりやすく徹底解説します。M5StickC Plus2は、その小さな筐体にWi-Fi機能、赤外線送信機能、そして豊富なインターフェースを統合しており、このようなDIYプロジェクトに最適なデバイスです。公式ドキュメントによると、初心者でも迅速にIoTプロトタイプを構築できるとされています。

この記事を読めば、以下のことが実現できます。

  • 部屋の湿度を常に監視し、設定した湿度に応じて加湿器を自動でオン・オフする。
  • 手元のスマートフォンから、いつでもどこでも加湿器を遠隔操作する。
  • まるで「SwitchBot」のような機能を、低コストで自作する。

さあ、あなただけの快適な空間を創造するプロジェクトを始めましょう!

プロジェクトの全体像と動作原理

本格的な作業に入る前に、今回作成するシステムの全体像を把握しましょう。仕組みは非常にシンプルです。下の図は、各コンポーネントがどのように連携して動作するかを示しています。

Source: 作成者がシステム原理に基づき図示
  1. 【入力】温湿度を検知: M5StickC Plus2に接続した「温湿度センサー(ENV III Hat)」が、部屋の温度と湿度をリアルタイムで測定します。
  2. 【処理】M5StickC Plus2が判断:
    • 自動制御: 測定した湿度が、あらかじめプログラムに設定した「快適な湿度範囲」(例:40%未満になったらオン、60%を超えたらオフ)から外れた場合、M5StickC Plus2が「加湿器を操作する」と判断します。
    • 遠隔操作: スマートフォンアプリから「オン/オフ」の指示がインターネット経由(MQTTプロトコル)でM5StickC Plus2に届くと、その指示に従って即座に操作判断を下します。
  3. 【出力】赤外線で操作: M5StickC Plus2に内蔵された「赤外線(IR)エミッター」から、加湿器のリモコンと同じ赤外線信号を送信し、電源をオン・オフします。この赤外線エミッターはGPIO 19ピンに接続されています。M5StickC Plus2のピンマップで確認できます。

この一連の流れにより、既存の赤外線リモコン付き加湿器を、一切改造することなくスマート化できるのです。このアーキテクチャは、加湿器だけでなく、エアコン、テレビ、照明など、他の赤外線リモコンで操作する多くの家電に応用可能です。

【核心】M5StickC Plus2で加湿器を自動化する実践ガイド

ここからが本番です。ハードウェアの準備からプログラムの実装、スマホでの設定まで、ステップバイステップで進めていきましょう。

準備編:必要なハードウェアとツール

まずは、プロジェクトに必要な部品と工具を揃えましょう。主要なコンポーネントはM5Stackの公式ストアや代理店から入手できます。

Data Source: M5Stack Official Docs

今回使用するM5StickC Plus2は、前モデルのM5StickC Plusから大幅にスペックアップしています。特に、メモリ(PSRAM)の追加とバッテリー容量の増加は、より複雑なプログラムや長時間のバッテリー駆動を可能にし、今回のプロジェクトに非常に適しています。右のグラフは、主要なスペックの向上を示しています。

カテゴリ 部品/ツール名 型番/仕様(推奨) 数量 主な用途と補足
コア 開発ボード M5StickC Plus2 1 プロジェクトの頭脳。ESP32-PICO-V3-02搭載でWi-Fiと赤外線機能を内蔵。公式製品ページ参照。
センサー 温湿度センサーユニット M5Stack ENV III Hat (SHT30+QMP6988) 1 I2C接続で高精度な温湿度・気圧を測定。HAT形式で直接接続でき簡単。ENV III Hatドキュメント参照。
ツール PC接続ケーブル USB Type-C ケーブル 1 プログラム書き込みと給電用。C to Cケーブルでは認識しない場合があるため、A to Cを推奨。公式の注意書きにも記載あり。
ツール 開発用PC Windows, Mac, or Linux 1 Arduino IDEをインストールして使用。
その他 加湿器 赤外線リモコンで操作できるもの 1 操作対象の家電。

ポイント: M5StickC Plus2は赤外線送信機能(IR Emitter)を内蔵しているため、別途赤外線LEDモジュールを用意する必要はありません。また、ENV III HatもHAT(Hardware Attached on Top)形式のため、M5StickC Plus2の上部に直接差し込むだけで接続が完了し、複雑な配線作業は不要です。

ステップ1:開発環境のセットアップ

PCでM5StickC Plus2にプログラムを書き込むための準備をします。ここでは最も一般的な開発環境であるArduino IDEを使用します。

  1. Arduino IDEのインストール:まだインストールしていない場合は、Arduino公式サイトから、お使いのOSに合った最新版のArduino IDEをダウンロードし、インストールします。
  2. M5Stackボード定義の追加:Arduino IDEにM5Stackシリーズのボード情報を認識させるための設定です。
    • Arduino IDEを開き、「ファイル」メニュー(Macの場合は「Arduino」メニュー)から「環境設定」を開きます。
    • 「追加のボードマネージャのURL」の入力欄に、以下のURLを正確にコピー&ペーストし、「OK」をクリックします。
      https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
  3. M5StickCPlus2ボードのインストール:
    • 「ツール」メニュー > 「ボード」 > 「ボードマネージャ」を開きます。
    • ウィンドウ上部の検索ボックスに M5Stack と入力します。
    • 表示された「M5Stack by M5Stack」を選択し、「インストール」ボタンをクリックします。これにより、M5StickC Plus2を含むM5Stack製品群のボード定義がインストールされます。
  4. 必要なライブラリのインストール:プロジェクトで使用する機能を簡単に呼び出すためのライブラリ(プログラムの部品集)をインストールします。
    • 「ツール」メニュー > 「ライブラリを管理」を開きます。
    • 表示されるライブラリマネージャの検索ボックスで、以下のライブラリを一つずつ検索し、最新版をインストールしてください。
      • M5Unified: M5Stack製品を統一的に扱うための最新公式ライブラリです。これ一つでディスプレイ、ボタン、センサーなど多くの機能を制御できます。M5Unifiedライブラリ情報
      • IRremote: 赤外線信号の送受信を行うための定番ライブラリ。今回のプロジェクトの要です。
      • PubSubClient: スマートフォンとの連携に使うMQTT通信を実装するためのライブラリです。
      • Adafruit SHT31 Library: ENV III Hatに搭載されているSHT30センサーを動かすためのライブラリです。(M5Unifiedでも制御可能ですが、個別のライブラリは安定した動作実績があります)。

以上で開発環境の準備は完了です。次に、PCとM5StickC Plus2をUSBケーブルで接続し、Arduino IDEの「ツール」>「ボード」メニューから「M5Stack Arduino」>「M5StickCPlus2」を選択し、「シリアルポート」でM5StickC Plus2が接続されているポート(例: COM3や /dev/tty.usbserial-XXXX)を選択しておきましょう。

Arduino IDEのボードとポート設定
Arduino IDEで「M5StickCPlus2」ボードと対応するシリアルポートを選択する

ステップ2:ハードウェアの接続

このプロジェクトの美しい点の一つは、そのシンプルさです。HAT(拡張基板)を使用するため、複雑な配線やはんだ付けは一切不要です。

  • M5StickC Plus2 の電源がオフになっていることを確認します。
  • M5StickC Plus2の側面にあるピンヘッダ(10ピンのコネクタ)に、ENV III Hat を向きを合わせて、奥までしっかりと差し込みます。

以上でハードウェアの準備は完了です。このシンプルな接続により、I2C通信で温湿度センサーと気圧センサーがM5StickC Plus2に接続された状態になります。

ステップ3:加湿器リモコンの赤外線コードを解析する

加湿器をM5StickC Plus2から操作するためには、まずリモコンがどのような赤外線信号を送っているかを知る必要があります。この信号を「学習」し、M5StickC Plus2から同じ信号を「再生」させることで、リモコンの代わりをさせます。

ここで重要な点として、M5StickC Plus2は赤外線送信機能(Emitter)は内蔵していますが、赤外線受信機能(Receiver)は内蔵していません。そのため、信号を解析するには、別途赤外線受信モジュールを一時的に接続する必要があります。

  1. 赤外線受信用のスケッチ(プログラム)を準備:もし赤外線受信モジュールをお持ちでない場合、Webで「[お使いの加湿器の型番] 赤外線コード」や「[リモコンの型番] 赤外線コード」で検索すると、有志が解析したデータが見つかることもあります。見つからない場合は、安価な赤外線受信モジュール(例: VS1838B)を入手して以下の手順を実行します。一時的な配線:
    • 赤外線受信モジュール VCC (電源) → M5StickC Plus2 5V
    • 赤外線受信モジュール GND (接地) → M5StickC Plus2 GND
    • 赤外線受信モジュール DATA (信号) → M5StickC Plus2 G36 (アナログ入力も可能なピン)

    以下のコードをArduino IDEに貼り付け、M5StickC Plus2に書き込みます。

    #include <M5Unified.h>
    #include <IRremote.h>
    
    // G36ピンを赤外線受信に設定
    const int RECV_PIN = 36;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    
    void setup() {
        M5.begin();
        irrecv.enableIRIn(); // 受信開始
        M5.Lcd.setRotation(3);
        M5.Lcd.setTextSize(2);
        M5.Lcd.println("IR Receiver Ready...");
        Serial.begin(115200);
        Serial.println("IR Receiver Ready...");
    }
    
    void loop() {
        if (irrecv.decode(&results)) {
            String type = "Unknown";
            // IRremoteライブラリのバージョンによってプロトコル名の取得方法が異なります
            type = IrReceiver.getProtocolString();
    
            M5.Lcd.fillScreen(BLACK);
            M5.Lcd.setCursor(0, 0);
            M5.Lcd.printf("Received IR Code!\n\n");
            M5.Lcd.printf("Type: %s\n", type.c_str());
            M5.Lcd.printf("Code: 0x%lX\n", results.value);
            M5.Lcd.printf("Bits: %d\n", results.bits);
    
            Serial.printf("Type: %s, Code: 0x%lX, Bits: %d\n", type.c_str(), results.value, results.bits);
            
            irrecv.resume(); // 次の信号を待つ
        }
        delay(100);
    }
  2. 赤外線コードの記録:
    • プログラムを書き込んだら、「ツール」>「シリアルモニタ」を開きます(通信速度が115200 bpsに設定されていることを確認してください)。
    • 加湿器のリモコンを、M5StickC Plus2に接続した受信モジュールに向け、「電源オン」ボタンを押します。
    • シリアルモニタとM5StickC Plus2の画面に `Type`, `Code`, `Bits` が表示されるので、これらを正確にメモします。
    • 同様に「電源オフ」ボタンを押し、表示された情報をメモします。(もし電源ボタンがトグル式で一つしかない場合は、その一つのコードを記録します)

    以下のようにテーブルにまとめておくと、後の作業がスムーズです。

    機能 プロトコル (Type) コード (Code) ビット数 (Bits)
    電源オン 例: NEC 例: 0xFF30CF 例: 32
    電源オフ 例: NEC 例: 0xFF10EF 例: 32

    解析が終わったら、一時的に接続した赤外線受信モジュールは取り外して構いません。

ステップ4:スマホ連携(MQTT)の準備

スマートフォンから加湿器を操作するために、MQTTという軽量なメッセージングプロトコルを利用します。これはIoTデバイス間の通信で広く使われている「発行/購読(Publish/Subscribe)」モデルのプロトコルです。M5Stackのドキュメントでも紹介されています。

  1. MQTTブローカーの選択:MQTT通信には、メッセージを中継する「ブローカー」と呼ばれるサーバーが必要です。今回は、テストや個人利用で無料で使えるパブリックなMQTTブローカー `broker.hivemq.com` を使用します。
  2. MQTTクライアントアプリのインストール:お使いのスマートフォンにMQTTの送受信ができるクライアントアプリをインストールします。多くの選択肢がありますが、以下は代表的なものです。
    • iOS: `MQTTool` や `EasyMQTT`
    • Android: `MQTT Client`

    (他の同機能のアプリでも全く問題ありません)

  3. アプリの設定:インストールしたアプリを開き、新しい接続(Broker/Connection)を作成します。設定項目は以下の通りです。
    • Host/Address (ホスト/アドレス): broker.hivemq.com
    • Port (ポート): 1883 (暗号化なしの標準ポート)
    • Client ID (クライアントID): (通常は自動生成されるものでOKです。空欄でも構いません)

    設定を保存し、サーバーに接続します。「Connected」や「接続済み」と表示されれば成功です。

  4. トピック(通信チャンネル)を決める:MQTTでは「トピック」という階層構造の文字列(例: `home/living/light`)を使って、メッセージの宛先を決めます。誰でもアクセスできるパブリックブローカーを使うため、他の人と重複しないように、ユニークな名前にすることが重要です。今回は以下のように決めます。
    • 指令用トピック(スマホ → M5Stick): myhome/living/humidifier/set/ユニークなID
    • 状態報告用トピック(M5Stick → スマホ):myhome/living/humidifier/status/ユニークなID

    ※ `ユニークなID` の部分には、ご自身の名前やランダムな文字列などを入れて、他者と被らないようにしてください。

ステップ5:すべてを統合した最終コードの実装

いよいよ、これまでの要素(センサー読み取り、赤外線送信、MQTT通信)をすべて組み合わせた最終的なプログラムを作成します。

コードの概要:

  1. Wi-Fiに接続する。
  2. MQTTブローカーに接続し、指令用トピックを購読(Subscribe)する。
  3. 5秒ごとにENV III Hatから温湿度を読み取る。
  4. 読み取ったデータと現在の加湿器の状態を、状態報告用トピックに発行(Publish)する。
  5. 湿度が設定した閾値を下回れば電源オンの赤外線信号を、上回ればオフの信号を送信する(自動制御)。
  6. スマホからのMQTT指令(”ON”または”OFF”)を受信したら、それに応じて赤外線信号を送信する(遠隔操作)。
  7. 現在の温湿度と加湿器の状態をM5StickC Plus2の画面に表示する。

以下のコードをArduino IDEに貼り付け、「— ユーザー設定項目 —」の部分をあなたの情報に書き換えてください。

  • YOUR_WIFI_SSIDYOUR_WIFI_PASSWORD をあなたのWi-Fi情報に。
  • YOUR_UNIQUE_ID をステップ4で決めたユニークなIDに。
  • IR_ON_CODE, IR_OFF_CODE, IR_BITS をステップ3で解析したコードに。
  • IR_PROTOCOL を解析したプロトコルに(例:NEC, SONYなど。`IRremote`ライブラリで定義されているもの)。
#include <M5Unified.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_SHT31.h>
#include <IRremote.h>

// --- ユーザー設定項目 ---
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* mqtt_server = "broker.hivemq.com";
const char* unique_id = "YOUR_UNIQUE_ID"; // 他の人と被らないように設定

// ステップ3で解析した赤外線コード
#define IR_PROTOCOL NEC // 例: NEC, SONY, RC5など。リモコンに合わせて変更
const uint64_t IR_ON_CODE = 0xFF30CF; // 例: 電源オンのコード
const uint64_t IR_OFF_CODE = 0xFF10EF; // 例: 電源オフのコード
const uint8_t IR_BITS = 32; // 例: ビット数

// 湿度の閾値
const float HUMIDITY_LOWER_THRESHOLD = 45.0; // この湿度未満でオン
const float HUMIDITY_UPPER_THRESHOLD = 55.0; // この湿度以上でオフ

// MQTTトピック
char MQTT_SET_TOPIC[100];
char MQTT_STATUS_TOPIC[100];
// --- 設定項目ここまで ---

WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_SHT31 sht31 = Adafruit_SHT31();
// M5StickC Plus2の赤外線送信ピンはG19
const int IR_TX_PIN = 19;

bool humidifier_state = false; // false: OFF, true: ON
float current_temp = 0.0;
float current_humi = 0.0;
unsigned long last_sensor_read = 0;
bool auto_mode = true; // 自動制御モード

// MQTTメッセージ受信時の処理
void callback(char* topic, byte* payload, unsigned int length) {
    String message;
    for (int i = 0; i < length; i++) {
        message += (char)payload[i];
    }
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    Serial.println(message);

    if (String(topic) == MQTT_SET_TOPIC) {
        auto_mode = false; // 手動操作があったら自動モードをオフ
        if (message == "ON" && !humidifier_state) {
            sendIRSignal(true);
        } else if (message == "OFF" && humidifier_state) {
            sendIRSignal(false);
        } else if (message == "AUTO_ON") {
            auto_mode = true;
        }
    }
}

// MQTT再接続処理
void reconnect() {
    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        M5.Lcd.println("MQTT connecting...");
        String clientId = "M5StickCPlus2-Humidifier-" + String(unique_id);
        if (client.connect(clientId.c_str())) {
            Serial.println("connected");
            M5.Lcd.println("MQTT connected!");
            client.subscribe(MQTT_SET_TOPIC);
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

// 赤外線信号送信
void sendIRSignal(bool turn_on) {
    uint64_t code = turn_on ? IR_ON_CODE : IR_OFF_CODE;
    IrSender.send(IR_PROTOCOL, code, IR_BITS);
    humidifier_state = turn_on;
    Serial.printf("Sent IR signal: %s\n", turn_on ? "ON" : "OFF");
    
    // 状態をMQTTで発行
    publishStatus();
    updateDisplay();
}

// 状態をMQTTで発行
void publishStatus() {
    char status_payload[100];
    sprintf(status_payload, "{\"temp\":%.1f, \"humi\":%.1f, \"state\":\"%s\", \"auto\":%s}", 
            current_temp, current_humi, humidifier_state ? "ON" : "OFF", auto_mode ? "true" : "false");
    client.publish(MQTT_STATUS_TOPIC, status_payload, true); // retainフラグをtrueに
}

// 画面表示更新
void updateDisplay() {
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(10, 10);
    M5.Lcd.setTextSize(2);
    M5.Lcd.printf("Temp: %.1f C\n", current_temp);
    M5.Lcd.printf("Humi: %.1f %%\n", current_humi);
    
    M5.Lcd.setCursor(10, 60);
    M5.Lcd.printf("Mode: %s", auto_mode ? "AUTO" : "MANUAL");

    M5.Lcd.setTextSize(3);
    M5.Lcd.setCursor(50, 95);
    if (humidifier_state) {
        M5.Lcd.setTextColor(TFT_GREEN);
        M5.Lcd.print("ON");
    } else {
        M5.Lcd.setTextColor(TFT_RED);
        M5.Lcd.print("OFF");
    }
    M5.Lcd.setTextColor(WHITE);
}

void setup() {
    M5.begin();
    M5.Lcd.setRotation(3);
    M5.Lcd.setTextSize(2);
    M5.Lcd.println("Booting...");

    // トピック名を生成
    sprintf(MQTT_SET_TOPIC, "myhome/living/humidifier/set/%s", unique_id);
    sprintf(MQTT_STATUS_TOPIC, "myhome/living/humidifier/status/%s", unique_id);

    // センサー初期化
    if (!sht31.begin(0x44)) { // ENV III HatのSHT30アドレスは0x44
        M5.Lcd.println("SHT30 init failed!");
        while (1) delay(1);
    }

    // Wi-Fi接続
    M5.Lcd.print("Connecting to WiFi...");
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        M5.Lcd.print(".");
    }
    M5.Lcd.println("\nWiFi connected!");
    Serial.println("WiFi connected");

    // MQTT設定
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);

    // 赤外線送信初期化
    IrSender.begin(IR_TX_PIN, false);

    updateDisplay();
}

void loop() {
    M5.update();

    // ボタンAで手動ON/OFF切り替え
    if (M5.BtnA.wasPressed()) {
        auto_mode = false; // 手動操作
        sendIRSignal(!humidifier_state);
    }
    // ボタンB長押しで自動モードに復帰
    if (M5.BtnB.wasHold()) {
        auto_mode = true;
        Serial.println("Auto mode enabled.");
        updateDisplay();
    }

    if (!client.connected()) {
        reconnect();
    }
    client.loop();

    // 5秒ごとにセンサーを読み取り、制御ロジックを実行
    if (millis() - last_sensor_read > 5000) {
        current_temp = sht31.readTemperature();
        current_humi = sht31.readHumidity();
        last_sensor_read = millis();

        if (isnan(current_humi) || isnan(current_temp)) {
            Serial.println("Failed to read from SHT30 sensor!");
            return;
        }

        Serial.printf("Temp: %.1f C, Humi: %.1f %%\n", current_temp, current_humi);
        
        publishStatus();

        // 自動制御ロジック
        if (auto_mode) {
            if (!humidifier_state && current_humi < HUMIDITY_LOWER_THRESHOLD) {
                Serial.println("Humidity is low, turning ON.");
                sendIRSignal(true);
            } else if (humidifier_state && current_humi > HUMIDITY_UPPER_THRESHOLD) {
                Serial.println("Humidity is high, turning OFF.");
                sendIRSignal(false);
            }
        }
        
        updateDisplay();
    }
}

ステップ6:動作確認とデバッグ

プログラムを書き込んだら、いよいよ動作確認です。以下の手順で一つずつ確認していきましょう。

  1. プログラムの書き込み:上記で編集したコードをM5StickC Plus2に書き込みます。書き込みが完了すると、デバイスは自動的に再起動します。
  2. シリアルモニタでの確認:Arduino IDEのシリアルモニタを開きます(通信速度: 115200)。以下のようなログが順に表示されることを確認します。
    • Wi-Fiへの接続成功メッセージ (`WiFi connected!`)
    • MQTTブローカーへの接続成功メッセージ (`MQTT connected!`)
    • 5秒ごとに温湿度データが表示される (`Temp: XX.X C, Humi: XX.X %`)

    ここでエラーが出る場合は、FAQセクションを参考にしてください。

  3. 自動制御のテスト:プログラムの自動制御ロジックが正しく機能するかテストします。
    • 湿度を上げるテスト: センサー部分(ENV III Hat)に息を吹きかけるなどして、湿度を急激に上げます。湿度が `HUMIDITY_UPPER_THRESHOLD`(例: 55%)を超えたときに、シリアルモニタに `Humidity is high, turning OFF.` と表示され、加湿器がオフになるか(赤外線信号が送信されるか)確認します。
    • 湿度を下げるテスト: しばらく放置して部屋の湿度が自然に下がるのを待ちます。湿度が `HUMIDITY_LOWER_THRESHOLD`(例: 45%)を下回ったときに、`Humidity is low, turning ON.` と表示され、加湿器がオンになるか確認します。
  4. スマートフォンからの操作テスト:MQTTクライアントアプリを使って、遠隔操作をテストします。
    • 状態の購読(Subscribe): アプリで、状態報告用トピック(`myhome/living/humidifier/status/YOUR_UNIQUE_ID`)を購読します。5秒ごとにM5StickC Plus2からJSON形式のデータ(例: `{“temp”:25.1, “humi”:52.3, “state”:”OFF”, “auto”:true}`)が受信できるか確認します。
    • ON指令の発行(Publish): アプリのPublish機能を使って、指令用トピック(`myhome/living/humidifier/set/YOUR_UNIQUE_ID`)にメッセージ `ON` を送信します。加湿器がオンになり、購読しているトピックの `state` が `”ON”` に変わることを確認します。この操作により、モードは自動的に `MANUAL` に切り替わります。
    • OFF指令の発行(Publish): 同様に、メッセージ `OFF` を送信し、加湿器がオフになることを確認します。
    • 自動モード復帰指令: メッセージ `AUTO_ON` を送信し、自動制御モードに戻ることを確認します。

下のグラフは、この自動制御がどのように機能するかを視覚的に示したものです。湿度が上限・下限の閾値に達すると、加湿器の状態が切り替わっていることがわかります。

Source: 自動制御ロジックに基づくシミュレーションデータ

応用編:さらに便利な機能を追加する

基本機能が完成したら、さらにプロジェクトを発展させて、より高機能で使いやすいシステムにしてみましょう。

  • UIFlowでの開発:ArduinoのC++コードを書くのが苦手な方や、より直感的に開発したい場合は、M5Stackが提供するビジュアルプログラミング環境「UIFlow」がおすすめです。ブロックをドラッグ&ドロップで組み合わせるだけで、今回実装したようなロジックを構築できます。UIFlow 2.0のチュートリアルを参考に始めてみてください。
  • Home Assistantとの連携:人気のオープンソース・スマートホームプラットフォーム「Home Assistant」と連携させれば、他のスマートデバイス(照明、スイッチ、センサーなど)と連動させたり、より高度な自動化(オートメーション)を組んだりできます。例えば、「外出したら加湿器をオフにする」「朝6時に湿度50%になるように運転を開始する」といった設定が可能です。M5StickC Plus2は、ESPHomeというツールを使うことで、Home Assistantと非常に簡単に連携できます。
    Home Assistantのダッシュボード例
    Home AssistantのダッシュボードにM5StickCのセンサーデータ(温度、湿度、バッテリー残量など)を表示した例
  • BlynkやThingsBoardの活用:よりリッチなスマートフォンUI(グラフ表示、ボタン、スライダーなど)を簡単に作成したい場合は、IoTプラットフォーム「Blynk」や「ThingsBoard」の利用もおすすめです。これらのサービスは、ドラッグ&ドロップでスマホアプリの画面をデザインでき、M5StickC Plus2との連携も容易です。温湿度の推移をグラフで確認したり、目標湿度をスライダーで設定したりといった、商用製品のようなインターフェースを自作できます。M5StackとBlynkの連携ガイドなどが参考になります。

FAQ:よくある問題と解決策

プロジェクトを進める中で遭遇しがちな問題と、その解決策をまとめました。トラブルシューティングの参考にしてください。

問題の現象 考えられる原因 解決策
Wi-Fiに接続できない SSIDやパスワードが間違っている。電波が弱い。 コード内の `ssid` と `password` の文字列が正しいか、大文字小文字を含めて再確認してください。ルーターの近くで試すなど、電波環境の良い場所で確認してください。
センサーの読み取り値がおかしい(NaNなど) センサーの接触不良。I2Cアドレスの間違い。 ENV III HatがM5StickC Plus2にしっかりと奥まで差し込まれているか確認してください。コード内の `sht31.begin(0x44)` のアドレスが正しいか確認します(ENV IIIのSHT30は0x44です)。
赤外線で加湿器が反応しない 1. 解析したコードが間違っている。
2. 赤外線LEDの出力が弱い、または向きが違う。
3. プロトコル指定が間違っている。
1. ステップ3を再度実行し、コードを慎重に記録・確認してください。特に16進数の `0x` の付け忘れなどに注意してください。
2. M5StickC Plus2の先端(USB-Cポート側)を加湿器の赤外線受信部に近づけて試してください。
3. 解析したプロトコル(NEC, SONYなど)がコードの `#define IR_PROTOCOL` と一致しているか確認してください。
スマホアプリで操作できない MQTTのトピック名やサーバー設定が一致していない。 コード内とスマホアプリ内のMQTTサーバーアドレス、ポート番号、Publish/Subscribeのトピック名(特にユニークID部分)が一字一句同じであることを確認してください。
USB-CケーブルでPCに認識されない 1. ドライバがインストールされていない。
2. C to Cケーブルの問題。
1. M5StickC Plus2は `CH9102` というUSB-UART変換チップを使用しています。M5Stack公式サイトから `CH9102` ドライバをダウンロードしてインストールしてください。
2. 一部のPCではUSB-C to Cケーブルでの認識が不安定な場合があります。PCのUSB-Aポートから接続する `A to C` ケーブルで試してみてください。

これで、あなただけのスマート加湿器コントローラーは完成です。このプロジェクトで得た知識と経験をベースに、次はエアコンやテレビ、照明など、他の赤外線リモコンで動く家電のスマート化にもぜひ挑戦してみてください!

弊社へのお問い合わせはこちらよりお願いいたします。
内容を確認し、3営業日以内に返信いたします。
※営業目的でのご連絡の方は、こちらよりお問い合わせ下さい。

 

この記事をシェア

ITのご相談はKUREBAへ

ITのご相談は何でもお申し付けください。 無料相談から始めませんか?