注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!
8.4 IoT通信とMQTT¶
このプロジェクトは、IoT(モノのインターネット)分野で人気のある通信プロトコルであるMQTTを活用することに焦点を当てています。MQTTは、IoTデバイスがトピックを通じてデータを交換するパブリッシュ/サブスクライブモデルを可能にします。
このプロジェクトでは、LED、ボタン、サーミスタを含む回路を構築することでMQTTの実装を探求します。ESP32-WROOM-32Eマイクロコントローラーは、Wi-Fiへの接続を確立し、MQTTブローカーと通信するために使用されます。コードにより、マイクロコントローラーは特定のトピックをサブスクライブし、メッセージを受信し、受信した情報に基づいてLEDを制御することができます。さらに、このプロジェクトは、ボタンが押されたときにサーミスタからの温度データを指定されたトピックに公開することを示しています。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
コードアップロード
回路を組み立てます。
注釈
Wi-Fiへの接続を確立する際には、36, 39, 34, 35, 32, 33ピンのみがアナログ読取りに使用できます。サーミスタがこれら指定されたピンに接続されていることを確認してください。
次に、USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_4_mqtt
ディレクトリにあるiot_4_mqtt.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
PubSubClient
ライブラリが使用されており、 Library Manager からインストールできます。
次の行を見つけて、あなたの
SSID
とPASSWORD
で修正してください。// Replace the next variables with your SSID/Password combination const char* ssid = "SSID"; const char* password = "PASSWORD";
次の行を見つけて、あなたの
unique_identifier
で修正してください。あなたのunique_identifier
が本当にユニークであることを保証してください。同一のIDを持つデバイスが同じMQTTブローカーにログインしようとすると、ログインに失敗する可能性があります。// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com"; const char* unique_identifier = "sunfounder-client-sdgvsda";
トピックのサブスクリプション
他の参加者からのメッセージの干渉を避けるために、目立たない、または一般的でない文字列として設定できます。現在のトピック
SF/LED
を、あなたの望むトピック名に単純に置き換えてください。注釈
トピックは、あなたが望むどんな文字にも設定できます。同じトピックにサブスクライブしたMQTTデバイスは、同じメッセージを受け取ることができます。また、複数のトピックに同時にサブスクライブすることもできます。
void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(unique_identifier)) { Serial.println("connected"); // Subscribe client.subscribe("SF/LED"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }
サブスクライブしているトピックに応答する機能を変更します。提供されたコードでは、トピック
SF/LED
でメッセージを受信すると、on
またはoff
かどうかを確認します。受信したメッセージに応じて、LEDのオン/オフ状態を制御する出力状態を変更します。注釈
サブスクライブしている任意のトピックに対して変更できますし、複数のトピックに対応するために複数のif文を書くこともできます。
void callback(char* topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off". // Changes the output state according to the message if (String(topic) == "SF/LED") { Serial.print("Changing state to "); if (messageTemp == "on") { Serial.println("on"); digitalWrite(ledPin, HIGH); } else if (messageTemp == "off") { Serial.println("off"); digitalWrite(ledPin, LOW); } } }
正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。
シリアルモニターを開いて、以下の情報が表示されれば、MQTTサーバーへの接続が成功したことを意味します。
WiFi connected IP address: 192.168.18.77 Attempting MQTT connection...connected
HiveMQを通じたメッセージ公開
HiveMQは、MQTTブローカーとして機能するメッセージングプラットフォームで、IoTデバイスへの迅速で効率的かつ信頼性の高いデータ転送を促進します。
私たちのコードは、HiveMQが提供するMQTTブローカーを具体的に利用しています。コード内には、HiveMQのMQTTブローカーのアドレスが次のように含まれています:
// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com";
現在、Webブラウザで HiveMQ Web Client を開きます。
クライアントをデフォルトの公開プロキシに接続します。
サブスクライブしたトピックでメッセージを公開します。このプロジェクトでは、
on
またはoff
を公開してLEDを制御できます。
MQTTへのメッセージ公開
コードを使用してトピックに情報を公開することもできます。このデモでは、ボタンを押したときにサーミスタで測定した温度をトピックに送信する機能をコーディングしました。
Add New Topic Subscription をクリックします。
フォローしたいトピックを入力して、 サブスクライブ をクリックします。コードでは、温度情報をトピック
SF/TEMP
に送信しています。void loop() { if (!client.connected()) { reconnect(); } client.loop(); // if the button pressed, publish the temperature to topic "SF/TEMP" if (digitalRead(buttonPin)) { long now = millis(); if (now - lastMsg > 5000) { lastMsg = now; char tempString[8]; dtostrf(thermistor(), 1, 2, tempString); client.publish("SF/TEMP", tempString); } } }
これで、HiveMQでこのトピックを監視することができ、公開した情報を見ることができます。