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?

NodeMCU(ESP8266)を使用してMQTTクラウドサービスにセンサーデータをアップロード

Posted at

NodeMCU(ESP8266)を使用してMQTTクラウドサービスにセンサーデータをアップロード

はじめに

この例では、ESP8266ベースのNodeMCUを使用し、MQTTプロトコルを通じてDHT11センサーによって収集された温度と湿度データをクラウドのMQTTサービスに報告する方法をデモンストレーションします。また、アプリケーションがデータを購読して処理する方法を示します。この記事でMQTTプロトコルが使用される理由は、軽量で省エネであるため、IoTの使用シナリオに非常に適しているためです。現在、すべての主要な公共クラウドプロバイダーは基本的にMQTTプロトコルに基づいたIoTハブサービスを開始しています。例えば、AWSのIoT CoreやAzureのIoT Hubなど、これらの公共クラウドサービスにMQTTプロトコルを介して簡単にデータをアクセスできます。

この例の全体的なアーキテクチャは以下の通りです:

全体的なアーキテクチャ

設定

ハードウェア設定

  • NodeMCUボード x 1: NodeMCUはオープンソースのIoTプラットフォームです。ESP8266 Wi-Fi SoC上で動作するファームウェアと、ESP-12モジュールに基づくハードウェアが含まれています。デフォルトでは、「NodeMCU」という用語は開発キットではなくファームウェアを指します。このファームウェアはLuaスクリプト言語を使用します。
  • DHT11温度/湿度センサー x 1: DHT11デジタル温度および湿度センサーは、校正されたデジタル信号出力を備えた複合センサーです。
  • ブレッドボード x 1
  • ジャンパーワイヤー数本
  • 接続図については、以下のスクリーンショットを参照してください。

接続図

Arduino設定

  • CH340G USBドライバをダウンロードしてインストール

  • ESP8266モジュールのインストール

  • PubSubClientライブラリのインストール(作者:Nick O'Leary)

    Sketch -> Include Library -> Manage Libraries... -> 検索フィールドにPubSubと入力 -> インストール

MQTTクラウドサービス

NodeMCUを介してデータが正常に収集された後、クラウドのMQTTクラウドサービスに送信する必要があります。この記事では、EMQXが提供するMQTTクラウドサービスを使用します。読者は状況に応じて、Azure IoT HubやAWS IoT Coreなど、他のMQTTクラウドサービスを選択することもできます。各クラウドサービスでは、アクセス時に異なる認証方法を提供する必要があります。そのため、NodeMCU経由でクラウドのMQTTサービスに接続する際には、対象クラウドサービスのセキュリティ要件に応じた接続方法を設定する必要があります。簡単にするために、この記事では非セキュア接続方法を使用しています。公式の生産環境では、セキュアな認証方法を持つ接続を設定する必要があります。

  • EMQX Cloudの登録アドレスにアクセスして登録

  • 登録後、EMQX Cloudにアクセスして、15日間の無料トライアルを申し込む

    EMQX Cloud

  • ブローカー接続アドレスを表示

    ブローカー接続アドレス

ソースコード

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

#include "DHT.h"

#define DHTPIN D4     // 接続するピン
#define wifi_ssid "xxxxx"
#define wifi_password "xxxxx"

#define mqtt_server "broker-internet-facing-f1429d8cb54ca4a7.elb.us-east-1.amazonaws.com"  // MQTTクラウドアドレス
#define humidity_topic "humidity"
#define temperature_topic "temperature"

#define DHTTYPE DHT11   // DHT 11

WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
    Serial.begin(115200);
    setup_wifi();
    client.setServer(mqtt_server, 1883);
    dht.begin();
}

void setup_wifi() {
    delay(10);
    WiFi.begin(wifi_ssid, wifi_password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
}

void reconnect() {
    // 再接続するまでループ
    while (!client.connected()) {
        Serial.print("MQTT接続を試みています...");
        if (client.connect("nodeMcuDHT11")) {
            Serial.println("接続しました");
        } else {
            Serial.print("失敗, rc=");
            Serial.print(client.state());
            Serial.println(" 5秒後に再試行");
            delay(5000);
        }
    }
}

bool checkBound(float newValue, float prevValue, float maxDiff) {
    return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
}

long lastMsg = 0;
float temp = 0.0;
float hum = 0.0;
float diff = 1.0;

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

    long now = millis();
    if (now - lastMsg > 30000) {
        // 測定間の数秒間待機
        lastMsg = now;

        float newTemp = dht.readTemperature();
        float newHum = dht.readHumidity();
        if (checkBound(newTemp, temp, diff)) {
            temp = newTemp;
            Serial.print("新しい温度:");
            Serial.println(String(temp).c_str());
            client.publish(temperature_topic, String(temp).c_str(), true);
        }

        if (checkBound(newHum, hum, diff)) {
            hum = newHum;
            Serial.print("新しい湿度:");
            Serial.println(String(hum).c_str());
            client.publish(humidity_topic, String(hum).c_str(), true);
        }
    }
}

自身のWi-FiとMQTT設定に合わせて、以下の手順でコードを編集してください。

  • Wi-Fi設定

    #define wifi_ssid "あなたのWi-Fi名"
    #define wifi_password "あなたのWi-Fiパスワード"
    
  • ブローカーサーバー設定

    #define mqtt_server "あなたのMQTTブローカーアドレス"
    
  • Arduino設定

    Arduino設定

実行

  • コードアップロード

    NodeMCUをPCにUSB経由で接続し、Arduion IDEで115200ポートを選択します。アップロードボタンを使用してスケッチをコンパイルし、デバイスにアップロードします。

  • Arduinoモニターウィンドウを開いて、データ報告を表示します。

    Arduinoモニターウィンドウ

  • MQTTクライアントがメッセージを受信

    この投稿では、ブラウザアクセスをサポートするMQTTXが提供するMQTTクライアントツールを使用します:http://www.emqx.io/online-mqtt-client。MQTT Xはデスクトップクライアントコマンドラインツールも提供しています。

    1. MQTT接続を作成します MQTT接続を作成

    2. トピックを購読し、テストメッセージを受信します

      購読

  • Python MQTTクライアントを使用して報告されたメッセージを表示

from paho.mqtt import client as mqtt

def on_connect(client, userdata, flags, rc):
    # MQTTブローカーに接続
    client.subscribe([("temperature", 0), ("humidity", 0)])

def on_message(client, userdata, msg):
    # DHT11温度/湿度データを購読
    print(f"{msg.topic}: {msg.payload.decode()}")

def run():
    client = mqtt.Client()
    # MQTTクラウドアドレスを編集
    client.connect("あなたのMQTTブローカーアドレス", 1883)
    client.on_connect = on_connect
    client.on_message = on_message
    client.loop_forever()

if __name__ == '__main__':
    run()

Pythonスクリプト実行のスクリーンショット:

Pythonスクリプト実行

  • トラブルシューティング:トラブルシューティングを行うために、USBアダプタをPCに接続し、Arduino IDEでUSB-TTLアダプタのポートを選択します。シリアル出力によって生成されたデバッグ情報を表示するためにシリアルモニターを開きます。

まとめ

これまでに、NodeMCUからデータを収集し、EMQによって提供されるMQTTクラウドサービスにアップロードし、Pythonで書かれたバックエンドプログラムによってデータを処理する簡単なプロセスを完了しました。しかし、実際の生産アプリケーションでは、より高い要求が必要になります。例えば、

  • より安全な接続方法
  • IoTデータのリアルタイム処理
  • データの永続化
  • 大規模な接続

EMQX Enterpriseとそのクラウドサービスは、上記の問題を解決するための良いソリューションを提供しています。読者は関連リンクで詳細情報を参照できます。

データセキュリティを高め(クラウドへのアップロードを避ける)、ビジネス処理の遅延を減らし、データ伝送コストを削減するために、ソリューションにエッジコンピューティングを検討することができます。Azure IoT EdgeやAWSのGreengrassは、エッジでのソリューションを提供しています。EMQは、オープンソースの超軽量エッジIoTエッジストリーミング分析ソリューションeKuiperも提供しています。詳細については、この記事を参照してください。

リソース

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?