検索コード

ESP32 チュートリアル 47/55 - インターネット経由の MQTT を使用した WS2812 CheerLights | SunFounder の ESP32 IoT キット

ESP32 チュートリアル 47/55 - インターネット経由の MQTT を使用した WS2812 CheerLights | SunFounder の ESP32 IoT キット

このチュートリアルでは、ESP32とWS2812 LEDを使用して、MQTTを介してリモートで制御可能な同期照明システムを作成します。このシステムでは、複数のユーザーが同時にライトの色を変更でき、場所を問わず接続された体験を提供します。このプロジェクトは、Wi-Fi機能を備えた強力なマイクロコントローラを含むSunFounderのESP32 IoTキットを利用しており、IoTアプリケーションに最適です。

WS2812_strip.ON

ビデオ全体を通して、この効果を得るために必要なセットアップ、配線、およびコードの実装を説明します。詳細な説明が必要な場合は、特定のタイムスタンプ(ビデオで mm:ss)でビデオを確認してください。

ハードウェアの解説

このプロジェクトの主な構成要素は、ESP32マイクロコントローラー、WS2812 LEDストリップ、MQTTブローカーです。ESP32は、内蔵のWi-FiとBluetooth機能を備えた多用途のマイクロコントローラーであり、インターネットに簡単に接続できます。これは私たちのプロジェクトの頭脳として機能し、通信を処理しLEDストリップを制御します。

WS2812 LEDストリップは、個別にアドレス指定可能なRGB LEDで構成されており、さまざまな色を表示するように制御できます。各LEDはオンまたはオフにでき、単一のデータラインを使用して任意の色に設定できるため、動的な照明効果に最適です。MQTTブローカーは、異なるクライアント間の通信を容易にし、ユーザーはLEDの色を制御するトピックに公開および購読できます。

データシートの詳細

メーカー アダフルーツ
部品番号 WS2812B
論理/入出力電圧 3.5 - 5.5 V
供給電圧 5 V
出力電流(チャネルあたり) 20 mA
チャネルあたりのピーク電流 60 mA
PWM周波数ガイダンス 400ヘルツ
入力論理閾値 0.2Vcc(ロー)、0.7Vcc(ハイ)
電圧降下 / RDS(on)/ 飽和度 0.5 V
熱的限界 動作温度: -25 ~ 85 °C
パッケージ 個別5050 SMD
ノート / バリアント さまざまな長さと構成で利用可能

  • WS2812ストリップの電圧降下を避けるために、十分な電源供給を確保してください。
  • ESP32とLEDストリップの間に共通のグランドを使用してください。
  • データラインは短く保って、信号の劣化を防ぎます。
  • 電源の間にコンデンサー(1000μF)を使用して電圧スパイクを緩和することを検討してください。
  • データラインに適切な抵抗器を使用して、信号の反射を防ぎます。
  • LEDストリップの総電流を考慮し、必要に応じて外部電源を使用してください。

配線指示

ESP32をWS2812 LEDストリップに配線するには、まず電源を接続します。LEDストリップの赤いワイヤーを5V電源に接続し、黒いワイヤーをグラウンドに接続します。次に、WS2812ストリップのデータライン(黄色いワイヤー)をESP32の14ピンに接続します。ESP32がLEDストリップと同じグラウンドに接続されていることを確認して、共通の基準を維持します。

電源とデータ接続を設定した後、プログラミングのためにマイクロUSBケーブルを使用してESP32をコンピュータに接続します。プログラミング中に接続を確立するためにESP32の電源がオンになっていることを確認する必要があります。配線が完了したら、コードをアップロードしてセットアップをテストすることができます。

esp32-47-cheer-light-wiring

コード例とウォークスルー

コードは、Wi-FiおよびMQTT機能に必要なライブラリをインクルードすることから始まります。識別子ssidそしてpasswordWi-Fiの資格情報を保存するために使用されますが、mqtt_serverMQTTブローカーのアドレスを保持します。

const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";

次に、サポートされているCheerLightsの色とそれに対応するRGB値を配列を使用して定義します。これにより、プログラムはユーザー入力に基づいて色設定に簡単にアクセスできるようになります。

String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0,  // "red"
                      255, 192, 203,  // "pink" ...};

そのsetup()関数はシリアル通信を初期化し、Wi-Fi接続を設定し、MQTTクライアントを準備します。また、LEDストリップを開始します。

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

メインループは、MQTT接続を継続的にチェックし、LEDの色を制御する受信メッセージを処理します。callback()関数は、購読されたトピックでメッセージが受信されたときにトリガーされます。

デモンストレーション / 期待すること

すべての設定が完了し、コードがアップロードされると、MQTTトピックにメッセージを送信することでWS2812 LEDの色を変更できるようになります。別のユーザーが色を変更すると、すべての接続デバイスが同時にその変更を反映します。極性の逆転や不適切な接続といった潜在的な問題に注意してください。これによりLEDが正常に機能しなくなる可能性があります(動画ではmm:ssで表示)。

動画のタイムスタンプ

  • 00:00 開始
  • 2:00 イントロダクション
  • 3:48 ドキュメンテーションページ
  • 6:33 配線の説明
  • 7:35 Arduinoコードの説明
  • 15:03 Arduino IDEでESP32ボードとCOMPポートを選択する
  • 16:46 CheerLighs デモンストレーション

画像

WS2812_strip.ON
WS2812_strip.ON
esp32-47-cheer-light-wiring
esp32-47-cheer-light-wiring
848-ESP32 Tutorial 47/55- Arduino code for cheer light
言語: C++
/*
 * :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
 * https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
 */
#include <WiFi.h>
#include <PubSubClient.h>
 // #include <Wire.h>
#include <Adafruit_NeoPixel.h>

 // 次の変数をあなたのSSID/パスワードの組み合わせに置き換えてください。
const char* ssid = "SSID";
const char* password = "PASSWORD";

 // MQTTブローカーのアドレスを追加してください:
const char* mqtt_server = "mqtt.cheerlights.com";
const char* unique_identifier = "sunfounder-client-sdgvsasdda";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;


 // サポートされているチアライトの色とそのRGB値を定義します。
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};

int colorRGB[][3] = { 255,   0,   0, // 赤
                      255, 192, 203, // ピンク
                        0, 255,   0, // 緑
                        0,   0, 255, // 青
                        0, 255, 255, // シアン
                      255, 255, 255, // 白
                      255, 223, 223, // 暖白
                      255, 223, 223, // オールドレース
                      128,   0, 128, // 紫色
                      255,   0, 255, // マゼンタ
                      255, 255,   0, // 黄色
                      255, 165,   0}; // オレンジ

 // 初期化 RGB ストリップ
#define LED_PIN 13
#define NUM_LEDS 8

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(115200);

 // Wi-Fiデフォルト設定
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

 // rgbストリップ開始
  pixels.begin();
  pixels.show();

}

void setup_wifi() {
  delay(10);
 // WiFiネットワークに接続することから始めます。
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

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 (String(topic) == "cheerlights") {
    Serial.print("Changing color to ");
    Serial.println(messageTemp);
    setColor(messageTemp);
  }
}

void reconnect() {
 // 再接続するまでループします。
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
 // 接続を試みる
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
 // 購読する
      client.subscribe("cheerlights");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
 // 再試行する前に5秒待ってください。
      delay(5000);
    }
  }
}

void setColor(String color) {
 // 色のリストをループして、一致する色を見つけます。
  for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
    if (color == colorName[colorIndex]) {
 // ストリップ上の各ネオピクセルの色を設定します。
      for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
        pixels.setPixelColor(pixel, pixels.Color (colorRGB [colorIndex][0], colorRGB [colorIndex][1], colorRGB [colorIndex][2]));
      }
      pixels.show();
    }
  }
}


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

リソースと参考文献

ファイル📁

ファイルは利用できません。