メインコンテンツまでスキップ

インターネットを介してナイトライトを制御する - Wio Terminal

IoTデバイスは、MQTTを使用してtest.mosquitto.orgと通信し、光センサーの読み取り値を送信し、LEDを制御するコマンドを受信するようにコード化する必要があります。

このレッスンのこの部分では、Wio TerminalをMQTTブローカーに接続します。

WiFiおよびMQTT Arduinoライブラリのインストール

MQTTブローカーと通信するには、Wio TerminalのWiFiチップを使用するためのArduinoライブラリをインストールし、MQTTと通信する必要があります。Arduinoデバイスの開発時には、オープンソースコードを含む幅広いライブラリを使用して、多くの機能を実装できます。Seeedは、Wio TerminalがWiFiを介して通信できるようにするライブラリを公開しています。他の開発者は、MQTTブローカーと通信するためのライブラリを公開しており、これらをデバイスで使用します。

これらのライブラリは、PlatformIOに自動的にインポートされ、デバイス用にコンパイルされるソースコードとして提供されます。この方法で、Arduinoライブラリは、ライブラリが必要とする特定のハードウェアをデバイスが持っている限り、Arduinoフレームワークをサポートする任意のデバイスで動作します。Seeed WiFiライブラリのように、特定のハードウェアに特化したライブラリもあります。

ライブラリはグローバルにインストールして必要に応じてコンパイルすることも、特定のプロジェクトにインストールすることもできます。この課題では、ライブラリはプロジェクトにインストールされます。

✅ ライブラリ管理の詳細やライブラリの検索とインストール方法については、PlatformIOライブラリドキュメントをご覧ください。

タスク - WiFiおよびMQTT Arduinoライブラリのインストール

Arduinoライブラリをインストールします。

  1. VS Codeでナイトライトプロジェクトを開きます。

  2. platformio.iniファイルの末尾に次の内容を追加します:

    lib_deps =
    seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5
    seeed-studio/Seeed Arduino FS @ 2.1.1
    seeed-studio/Seeed Arduino SFUD @ 2.0.2
    seeed-studio/Seeed Arduino rpcUnified @ 2.1.3
    seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1

    これにより、Seeed WiFiライブラリがインポートされます。@ <number>の構文は、ライブラリの特定のバージョン番号を指します。

    💁 @ <number>を削除して常に最新バージョンのライブラリを使用することもできますが、後のバージョンが以下のコードで動作する保証はありません。ここでのコードは、このバージョンのライブラリでテストされています。

    これでライブラリを追加するために必要なことはすべて完了です。次回PlatformIOがプロジェクトをビルドするときに、これらのライブラリのソースコードがダウンロードされ、プロジェクトにコンパイルされます。

  3. lib_depsに次の内容を追加します:

    knolleary/PubSubClient @ 2.8

    これにより、Arduino MQTTクライアントであるPubSubClientがインポートされます。

WiFiに接続する

Wio TerminalをWiFiに接続できるようになりました。

タスク - WiFiに接続する

Wio TerminalをWiFiに接続します。

  1. srcフォルダにconfig.hという新しいファイルを作成します。これを行うには、srcフォルダまたはその中のmain.cppファイルを選択し、エクスプローラーから新しいファイルボタンを選択します。このボタンは、カーソルがエクスプローラー上にあるときにのみ表示されます。

    新しいファイルボタン

  2. このファイルに次のコードを追加して、WiFiの認証情報を定義します:

    #pragma once

    #include <string>

    using namespace std;

    // WiFi認証情報
    const char *SSID = "<SSID>";
    const char *PASSWORD = "<PASSWORD>";

    <SSID>をWiFiのSSIDに置き換えます。<PASSWORD>をWiFiのパスワードに置き換えます。

  3. main.cppファイルを開きます。

  4. ファイルの先頭に次の#includeディレクティブを追加します:

    #include <PubSubClient.h>
    #include <rpcWiFi.h>
    #include <SPI.h>

    #include "config.h"

    これにより、前に追加したライブラリのヘッダーファイルと、設定ヘッダーファイルが含まれます。これらのヘッダーファイルは、PlatformIOにライブラリのコードを取り込むように指示するために必要です。これらのヘッダーファイルを明示的に含めないと、一部のコードがコンパイルされず、コンパイラエラーが発生します。

  5. setup関数の上に次のコードを追加します:

    void connectWiFi()
    {
    while (WiFi.status() != WL_CONNECTED)
    {
    Serial.println("WiFiに接続中..");
    WiFi.begin(SSID, PASSWORD);
    delay(500);
    }

    Serial.println("接続完了!");
    }

    このコードは、デバイスがWiFiに接続されていない間ループし、設定ヘッダーファイルからSSIDとパスワードを使用して接続を試みます。

  6. ピンが構成された後、setup関数の末尾にこの関数の呼び出しを追加します。

    connectWiFi();
  7. このコードをデバイスにアップロードして、WiFi接続が機能しているか確認します。シリアルモニターに次のように表示されるはずです。

    > タスクを実行中: platformio device monitor <

    --- 利用可能なフィルターとテキスト変換: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
    --- 詳細は http://bit.ly/pio-monitor-filters を参照してください
    --- /dev/cu.usbmodem1101 でのMiniterm 9600,8,N,1 ---
    --- 終了: Ctrl+C | メニュー: Ctrl+T | ヘルプ: Ctrl+Tの後にCtrl+H ---
    WiFiに接続中..
    接続完了!

MQTTに接続する

Wio TerminalがWiFiに接続されたら、MQTTブローカーに接続できます。

タスク - MQTTに接続する

MQTTブローカーに接続します。

  1. config.hファイルの末尾に次のコードを追加して、MQTTブローカーの接続詳細を定義します:

    // MQTT設定
    const string ID = "<ID>";

    const string BROKER = "test.mosquitto.org";
    const string CLIENT_NAME = ID + "nightlight_client";

    <ID>を、このデバイスクライアントの名前として使用される一意のIDに置き換えます。このIDは、後でこのデバイスが公開および購読するトピックにも使用されます。test.mosquitto.orgブローカーは公開されており、多くの人々、特にこの課題に取り組んでいる他の学生によって使用されています。一意のMQTTクライアント名とトピック名を持つことで、コードが他の人のコードと衝突しないようにします。このIDは、この課題の後半でサーバーコードを作成する際にも必要です。

    💁 GUIDGenのようなウェブサイトを使用して、一意のIDを生成できます。

    BROKERはMQTTブローカーのURLです。

    CLIENT_NAMEは、このMQTTクライアントのブローカー上での一意の名前です。

  2. main.cppファイルを開き、connectWiFi関数の下、setup関数の上に次のコードを追加します:

    WiFiClient wioClient;
    PubSubClient client(wioClient);

    このコードは、Wio Terminal WiFiライブラリを使用してWiFiクライアントを作成し、それを使用してMQTTクライアントを作成します。

  3. このコードの下に次のコードを追加します:

    void reconnectMQTTClient()
    {
    while (!client.connected())
    {
    Serial.print("MQTT接続を試みています...");

    if (client.connect(CLIENT_NAME.c_str()))
    {
    Serial.println("接続完了");
    }
    else
    {
    Serial.print("5秒後に再試行 - 失敗, rc=");
    Serial.println(client.state());

    delay(5000);
    }
    }
    }

    この関数は、MQTTブローカーへの接続をテストし、接続されていない場合は再接続します。接続されていない間は常にループし、設定ヘッダーファイルで定義された一意のクライアント名を使用して接続を試みます。

    接続が失敗した場合、5秒後に再試行します。

  4. reconnectMQTTClient関数の下に次のコードを追加します:

    void createMQTTClient()
    {
    client.setServer(BROKER.c_str(), 1883);
    reconnectMQTTClient();
    }

    このコードは、クライアントのMQTTブローカーを設定し、メッセージが受信されたときのコールバックを設定します。その後、ブローカーへの接続を試みます。

  5. WiFiが接続された後、setup関数でcreateMQTTClient関数を呼び出します。

  6. loop関数全体を次のコードに置き換えます:

    void loop()
    {
    reconnectMQTTClient();
    client.loop();

    delay(2000);
    }

    このコードは、MQTTブローカーへの再接続から始まります。これらの接続は簡単に切断される可能性があるため、定期的にチェックして必要に応じて再接続する価値があります。その後、MQTTクライアントのloopメソッドを呼び出して、購読しているトピックに来ているメッセージを処理します。このアプリはシングルスレッドであるため、メッセージはバックグラウンドスレッドで受信できません。そのため、メインスレッドでネットワーク接続上で待機しているメッセージを処理する時間を割り当てる必要があります。

    最後に、2秒の遅延により、光レベルが頻繁に送信されるのを防ぎ、デバイスの消費電力を削減します。

  7. コードをWio Terminalにアップロードし、シリアルモニターを使用してデバイスがWiFiおよびMQTTに接続されているのを確認します。

    > タスクを実行中: platformio device monitor <

    source /Users/jimbennett/GitHub/IoT-For-Beginners/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/.venv/bin/activate
    --- 利用可能なフィルターとテキスト変換: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
    --- 詳細は http://bit.ly/pio-monitor-filters を参照してください
    --- /dev/cu.usbmodem1201 でのMiniterm 9600,8,N,1 ---
    --- 終了: Ctrl+C | メニュー: Ctrl+T | ヘルプ: Ctrl+Tの後にCtrl+H ---
    WiFiに接続中..
    接続完了!
    MQTT接続を試みています...接続完了

💁 このコードはcode-mqtt/wio-terminalフォルダにあります。

😀 デバイスをMQTTブローカーに正常に接続しました。