Hľadať kód

Návod pre ESP32 47/55 - WS2812 CheerLights pomocou MQTT cez internet | IoT kit od SunFounder pre ESP32

Návod pre ESP32 47/55 - WS2812 CheerLights pomocou MQTT cez internet | IoT kit od SunFounder pre ESP32

V tomto návode si vytvoríme synchronizovaný systém osvetlenia pomocou ESP32 a WS2812 LED diód, ktorý je možné diaľkovo ovládať cez MQTT. Tento systém umožňuje viacerým používateľom meniť farbu svetiel súčasne, čím vytvára prepojený zážitok bez ohľadu na polohu. Projekt využíva SunFounder ESP32 IoT kit, ktorý obsahuje výkonný mikrokontrolér s Wi-Fi možnosťami, vďaka čomu je ideálny pre IoT aplikácie.

WS2812_strip.ON

Počas videa prejdeme potrebným nastavením, zapojením a implementáciou kódu na dosiahnutie tohto efektu. Ak potrebujete ďalšie objasnenie, určite si pozrite video v konkrétnych časových značkách (vo videu na mm:ss).

Vysvetlenie hardvéru

Hlavné komponenty tohto projektu zahŕňajú mikrokontrolér ESP32, WS2812 LED pásik a MQTT broker. ESP32 je všestranný mikrokontrolér so vstavanými Wi-Fi a Bluetooth možnosťami, ktorý mu umožňuje ľahko sa pripojiť na internet. Slúži ako mozog nášho projektu, spracováva komunikáciu a ovláda LED pásik.

WS2812 LED pásik pozostáva z jednotlivo adresovateľných RGB LED diód, ktoré je možné ovládať na zobrazenie širokej škály farieb. Každá LED dióda môže byť zapnutá alebo vypnutá a nastavená na akúkoľvek farbu pomocou jedného dátového vodiča, vďaka čomu je ideálna pre dynamické svetelné efekty. MQTT broker uľahčuje komunikáciu medzi rôznymi klientmi, čo používateľom umožňuje publikovať a prihlásiť sa na odber tém, ktoré ovládajú farby LED diód.

Podrobnosti z datasheetu

Výrobca Adafruit
Označenie dielu WS2812B
Logické/IO napätie 3,5 - 5,5 V
Napájacie napätie 5 V
Výstupný prúd (na kanál) 20 mA
Špičkový prúd (na kanál) 60 mA
Odporúčaná PWM frekvencia 400 Hz
Vstupné logické prahy 0,2Vcc (nízka), 0,7Vcc (vysoká)
Pokles napätia / RDS(on) / saturácia 0,5 V
Tepelné limity Prevádzková teplota: -25 až 85 °C
Puzdro Jednotlivé 5050 SMD
Poznámky / varianty Dostupné v rôznych dĺžkach a konfiguráciách

 

  • Zabezpečte dostatočné napájanie pre WS2812 pásik, aby ste predišli poklesom napätia.
  • Použite spoločnú zem medzi ESP32 a LED pásikom.
  • Udržujte dátové vodiče krátke, aby ste predišli degradácii signálu.
  • Zvážte použitie kondenzátora (1000μF) cez napájací zdroj na vyhladenie napäťových špičiek.
  • Použite vhodné rezistory na dátovom vodiči, aby ste predišli odrazom signálu.
  • Dávajte pozor na celkový odber prúdu LED pásika; v prípade potreby použite externé napájanie.

Pokyny na zapojenie

Na zapojenie ESP32 s WS2812 LED pásikom začnite pripojením napájacieho zdroja. Pripojte červený vodič z LED pásika k 5V napájaciemu zdroju a čierny vodič k zemi. Ďalej pripojte dátový vodič (žltý vodič) z WS2812 pásika na pin 14 na ESP32. Uistite sa, že ESP32 je tiež pripojený k rovnakej zemi ako LED pásik, aby sa zachoval spoločný referenčný bod.

Po nastavení napájacích a dátových pripojení pripojte ESP32 k počítaču pomocou mikrokábla USB na programovanie. Musíte sa uistiť, že ESP32 je počas programovania zapnutý, aby sa vytvorilo pripojenie. Po zapojení môžete pokračovať v nahraní kódu a otestovaní nastavenia.

esp32-47-cheer-light-wiring

Príklady kódu a vysvetlenie

Kód začína zahrnutím potrebných knižníc pre Wi-Fi a MQTT funkcie. Identifikátory ssid a password sa používajú na uloženie vašich Wi-Fi prihlasovacích údajov, zatiaľ čo mqtt_server uchováva adresu MQTT brokera.

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

Ďalej definujeme podporované CheerLights farby a ich zodpovedajúce RGB hodnoty pomocou polí. To umožňuje programu ľahko pristupovať k nastaveniam farieb na základe vstupu používateľa.

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" ...};

Funkcia setup() inicializuje sériovú komunikáciu, nastaví Wi-Fi pripojenie a pripraví MQTT klienta. Taktiež spustí LED pásik.

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

Hlavná slučka nepretržite kontroluje MQTT pripojenie a spracováva prichádzajúce správy, ktoré ovládajú farby LED diód. Funkcia callback() sa spustí, keď sa na prihlásenej téme prijme správa.

Demonštrácia / Čo očakávať

Keď je všetko nastavené a kód je nahraný, mali by ste byť schopní zmeniť farbu WS2812 LED diód odosielaním správ na MQTT tému. Ak iný používateľ zmení farbu, všetky pripojené zariadenia zobrazia zmenu súčasne. Buďte opatrní na potenciálne problémy, ako je obrátená polarita alebo nesprávne pripojenia, ktoré by mohli zabrániť správnemu fungovaniu LED diód (vo videu na mm:ss).

Časové značky videa

  • 00:00 Štart
  • 2:00 Úvod
  • 3:48 Stránka dokumentácie
  • 6:33 Vysvetlenie zapojenia
  • 7:35 Vysvetlenie kódu pre Arduino
  • 15:03 Výber dosky ESP32 a portu COMP v Arduino IDE
  • 16:46 Ukážka CheerLighs

Obrázky

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
Jazyk: 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>

// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";

// Add your MQTT Broker address:
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;


// Define the supported CheerLights colors and their RGB values
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"
                        0, 255,   0,  // "green"
                        0,   0, 255,  // "blue"
                        0, 255, 255,  // "cyan"
                      255, 255, 255,  // "white"
                      255, 223, 223,  // "warmwhite"
                      255, 223, 223,  // "oldlace"
                      128,   0, 128,  // "purple"
                      255,   0, 255,  // "magenta"
                      255, 255,   0,  // "yellow"
                      255, 165,   0}; // "orange"

// init rgb strip 
#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);

  // wifi default settings
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  // rgb strip begin
  pixels.begin();
  pixels.show(); 

}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  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 a message is received on the topic, you will check this message.
  // Changes the output state according to the message
  if (String(topic) == "cheerlights") {
    Serial.print("Changing color to ");
    Serial.println(messageTemp);
    setColor(messageTemp);
  }
}

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("cheerlights");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setColor(String color) {
  // Loop through the list of colors to find the matching color
  for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
    if (color == colorName[colorIndex]) {
      // Set the color of each NeoPixel on the strip
      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();
}

Zdroje a referencie

Súbory📁

Žiadne súbory nie sú k dispozícii.