LoginSignup
0
0

ESP8266とMQTTを使ったLEDのリモートコントロール

Posted at

ESP8266とMQTTを使ったLEDのリモートコントロール

MQTTは、IoTメッセージの交換とデータの配信を行うための軽量で柔軟なプロトコルです。IoT開発者にとって、柔軟性とハードウェア/ネットワークリソースのバランスを実現することに専念しています。

NodeMCUはオープンソースのIoTプラットフォームです。Lua言語を使用してプログラミングします。このプラットフォームはeLuaオープンソースプロジェクトに基づいており、その基礎層はESP8266 SDK 0.9.5を使用しています。

このプロジェクトでは、NodeMCU(ESP8266)とEMQX Cloudによって運営され維持される無料の公開MQTTブローカーを使用して、LEDライトをリモートで制御する方法を実装します。Arduino IDEを使用してNodeMCU ESP8266をプログラムします。EMQX Cloudは、EMQによって開始されたMQTT IoTクラウドサービスプラットフォームであり、ワンストップの運用保守管理とユニークな隔離環境を持つMQTT 5.0アクセスサービスを提供します。

もっと学ぶ: ESP32が無料の公開MQTTブローカーに接続する

必要なコンポーネント

  • NodeMCU
  • Arduino IDE
  • LED * 1、330 Ω抵抗
  • MQTTX: クロスプラットフォームMQTT 5.0クライアントツール
  • 無料の公開MQTTブローカー
    • ブローカー: broker.emqx.io
    • TCPポート: 1883
    • Websocketポート: 8083

NodeMCU ESP8266とLEDの接続図

project

ソースコード

  1. まず、ESP8266WiFiPubSubClientのライブラリをインポートします。ESP8266WiFiライブラリはESP8266をWiFiネットワークに接続することができ、PubSubClientライブラリはMQTTブローカーに接続し、トピックを公開/購読することができます。

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
  2. NodeMCU ESP8266のD1ピンを使用してLEDに接続します。実際には、このピンの内部はESP8266モジュールのGPIO5に接続されています。

    // GPIO 5 D1
    #define LED 5
    
  3. WiFiの名前とパスワード、およびMQTTブローカーの接続アドレスとポートを設定します。

    // WiFi
    const char *ssid = "mousse"; // WiFi名を入力
    const char *password = "qweqweqwe";  // WiFiパスワードを入力
    
    // MQTTブローカー
    const char *mqtt_broker = "broker.emqx.io";
    const char *topic = "esp8266/led";
    const char *mqtt_username = "emqx";
    const char *mqtt_password = "public";
    const int mqtt_port = 1883;
    
  4. WiFiネットワークに接続し、プログラムの結果を出力するためにシリアル接続を開始します。

    // ソフトウェアシリアルのボーレートを115200に設定;
    Serial.begin(115200);
    // WiFiネットワークに接続
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("WiFiに接続中..");
    }
    
  5. MQTTブローカーを設定し、シリアルモニターに接続情報を表示します。

     // MQTTブローカーに接続
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp8266-client-";
        client_id += String(WiFi.macAddress());
        Serial.println("公開emqx mqttブローカーに接続中.....");
        if (client.connect(client_id, mqtt_username, mqtt_password)) {
            Serial.println("公開emqx mqttブローカーに接続しました");
        } else {
            Serial.print("接続失敗、状態 ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    
  6. MQTTブローカーに正常に接続した後、ESP8266はメッセージを公開し、MQTTブローカーを購読します。

    // メッセージの公開と購読
    client.publish(topic, "hello emqx");
    client.subscribe(topic);
    
  7. シリアルモニターから送信されたコマンドを読み取り、LEDのオン/オフを制御するコールバック関数を記述します。

    void callback(char *topic, byte *payload, unsigned int length) {
        Serial.print("トピックにメッセージが到着: ");
        Serial.println(topic);
        Serial.print("メッセージ: ");
        String message;
        for (int i = 0; i < length; i++) {
            message += (char) payload[i];  // byteをStringに変換
        }
        Serial.print(message);
        if (message == "on" && !ledState) {
            digitalWrite(LED, HIGH);  // LEDを点灯
            ledState = true;
        }
        if (message == "off" && ledState) {
            digitalWrite(LED, LOW); // LEDを消灯
            ledState = false;
        }
        Serial.println();
        Serial.println("-----------------------");
    }
    
  8. 完全なコード。

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    // GPIO 5 D1
    #define LED 5
    
    // WiFi
    const char *ssid = "mousse"; // WiFi名を入力
    const char *password = "qweqweqwe";  // WiFiパスワードを入力
    
    // MQTTブローカー
    const char *mqtt_broker = "broker.emqx.io";
    const char *topic = "esp8266/led";
    const char *mqtt_username = "emqx";
    const char *mqtt_password = "public";
    const int mqtt_port = 1883;
    
    bool ledState = false;
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    void setup() {
        // ソフトウェアシリアルのボーレートを115200に設定;
        Serial.begin(115200);
        delay(1000); // 安定性のために遅延
    
        // WiFiネットワークに接続
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.println("WiFiに接続中...");
        }
        Serial.println("WiFiネットワークに接続しました");
    
        // LEDピンを出力として設定
        pinMode(LED, OUTPUT);
        digitalWrite(LED, LOW);  // 最初はLEDを消灯
    
        // MQTTブローカーに接続
        client.setServer(mqtt_broker, mqtt_port);
        client.setCallback(callback);
        while (!client.connected()) {
            String client_id = "esp8266-client-";
            client_id += String(WiFi.macAddress());
            Serial.printf("クライアント %s が公開MQTTブローカーに接続しています\n", client_id.c_str());
            if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
                Serial.println("公開EMQX MQTTブローカーに接続しました");
            } else {
                Serial.print("失敗しました ステート ");
                Serial.print(client.state());
                delay(2000);
            }
        }
    
        // メッセージの公開と購読
        client.publish(topic, "hello emqx");
        client.subscribe(topic);
    }
    
    void callback(char *topic, byte *payload, unsigned int length) {
        Serial.print("トピックにメッセージが到着: ");
        Serial.println(topic);
        Serial.print("メッセージ: ");
        String message;
        for (int i = 0; i < length; i++) {
            message += (char) payload[i];  // byteをStringに変換
        }
        Serial.print(message);
        if (message == "on" && !ledState) {
            digitalWrite(LED, HIGH);  // LEDを点灯
            ledState = true;
        }
        if (message == "off" && ledState) {
            digitalWrite(LED, LOW); // LEDを消灯
            ledState = false;
        }
        Serial.println();
        Serial.println("-----------------------");
    }
    
    void loop() {
        client.loop();
        delay(100); // ループの各反復で短い遅延
    }
    

テスト

  1. Arduino IDEを使用してESP8266に完全なコードをアップロードし、シリアルモニターを開いてください。

    esp_con

  2. MQTTXクライアントとMQTTブローカーとの接続を確立し、ESP8266にコマンドを送信します。

    esp_con

まとめ

これまでに、NodeMCU ESP8266と無料の公開MQTTブローカーを使用してLEDライトのリモートコントロールを成功させました。この例ではシンプルなシナリオのみを説明していますが、実際のプロジェクトでは、よりセキュアな接続方法とIoTデータの永続化が必要です。

次に、EMQが提供するMQTTプロトコルに関する簡単なガイドシリーズの記事で、MQTTプロトコルの特徴について学び、MQTTのより高度なアプリケーションを探求し、MQTTアプリケーションおよびサービス開発を始めることができます。

リソース

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