Search Code

Tutorial ESP32 47/55 - WS2812 CheerLights folosind MQTT prin Internet | Kitul IoT ESP32 de la SunFounder

Tutorial ESP32 47/55 - WS2812 CheerLights folosind MQTT prin Internet | Kitul IoT ESP32 de la SunFounder

În acest tutorial, vom crea un sistem de iluminare sincronizat folosind ESP32 și LED-uri WS2812 care poate fi controlat de la distanță prin MQTT. Acest sistem permite mai multor utilizatori să schimbe culoarea luminilor simultan, creând o experiență conectată indiferent de locație. Proiectul utilizează kit-ul IoT SunFounder ESP32, care include un microcontroler puternic cu capacități Wi-Fi, fiind ideal pentru aplicații IoT.

WS2812_strip.ON

Pe parcursul videoclipului, vom parcurge configurarea necesară, cablarea și implementarea codului pentru a obține acest efect. Dacă aveți nevoie de clarificări suplimentare, asigurați-vă că verificați videoclipul la anumite momente de timp (în videoclip la mm:ss).

Hardware Explicat

Componentele principale ale acestui proiect includ microcontrolerul ESP32, banda de LED-uri WS2812 și un broker MQTT. ESP32 este un microcontroler versatil cu capacități Wi-Fi și Bluetooth încorporate, permițându-i să se conecteze ușor la Internet. Acesta servește ca creier al proiectului nostru, gestionând comunicarea și controlând banda de LED-uri.

Banda de LED-uri WS2812 constă din LED-uri RGB adresabile individual, care pot fi controlate pentru a afișa o gamă largă de culori. Fiecare LED poate fi pornit sau oprit și setat la orice culoare folosind o singură linie de date, făcând-o perfectă pentru efecte de iluminare dinamice. Brokerul MQTT facilitează comunicarea între diferiți clienți, permițând utilizatorilor să publice și să se aboneze la subiecte care controlează culorile LED-urilor.

Detalii din Fișa Tehnică

Producător Adafruit
Număr de piesă WS2812B
Tensiune logică/IO 3.5 - 5.5 V
Tensiune de alimentare 5 V
Curent de ieșire (pe canal) 20 mA
Curent de vârf (pe canal) 60 mA
Ghid de frecvență PWM 400 Hz
Praguri logice de intrare 0.2Vcc (jos), 0.7Vcc (sus)
Cădere de tensiune / RDS(on) / saturație 0.5 V
Limite termice Temperatură de operare: -25 până la 85 °C
Pachet SMD individual 5050
Note / variante Disponibil în diverse lungimi și configurații

 

  • Asigurați o sursă de alimentare adecvată pentru banda WS2812 pentru a evita căderile de tensiune.
  • Utilizați un pământ comun între ESP32 și banda de LED-uri.
  • Păstrați liniile de date scurte pentru a preveni degradarea semnalului.
  • Luați în considerare utilizarea unui condensator (1000μF) pe sursa de alimentare pentru a netezi vârfurile de tensiune.
  • Utilizați rezistențe adecvate pe linia de date pentru a preveni reflexia semnalului.
  • Fiți atenți la consumul total de curent al benzii de LED-uri; utilizați alimentare externă atunci când este necesar.

Instrucțiuni de Cablare

Pentru a cabla ESP32 cu banda de LED-uri WS2812, începeți prin conectarea sursei de alimentare. Conectați firul roșu de la banda de LED-uri la o sursă de 5V și firul negru la pământ. Apoi, conectați linia de date (firul galben) de la banda WS2812 la pinul 14 de pe ESP32. Asigurați-vă că ESP32 este, de asemenea, conectat la același pământ ca și banda de LED-uri pentru a menține o referință comună.

După configurarea conexiunilor de alimentare și date, conectați ESP32 la computer folosind un cablu micro USB pentru programare. Va trebui să vă asigurați că ESP32 este pornit în timpul programării pentru a stabili o conexiune. Odată cablat, puteți continua să încărcați codul și să testați configurarea.

esp32-47-cheer-light-wiring

Exemple de Cod & Parcurgere

Codul începe prin includerea bibliotecilor necesare pentru funcționalitatea Wi-Fi și MQTT. Identificatorii ssid și password sunt folosiți pentru a stoca acreditările dvs. Wi-Fi, în timp ce mqtt_server conține adresa brokerului MQTT.

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

Apoi, definim culorile CheerLights acceptate și valorile lor RGB corespunzătoare folosind array-uri. Acest lucru permite programului să acceseze ușor setările de culoare pe baza intrării utilizatorului.

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

Funcția setup() inițializează comunicarea serială, configurează conexiunea Wi-Fi și pregătește clientul MQTT. De asemenea, începe banda de LED-uri.

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

Bucla principală verifică continuu conexiunea MQTT și procesează mesajele primite care controlează culorile LED-urilor. Funcția callback() este declanșată atunci când un mesaj este primit pe subiectul abonat.

Demonstrație / Ce să Vă Așteptați

Odată ce totul este configurat și codul este încărcat, ar trebui să puteți schimba culoarea LED-urilor WS2812 trimițând mesaje către subiectul MQTT. Dacă un alt utilizator schimbă culoarea, toate dispozitivele conectate vor reflecta schimbarea simultan. Fiți atenți la potențiale probleme precum polaritatea inversată sau conexiuni necorespunzătoare, care ar putea împiedica funcționarea corectă a LED-urilor (în videoclip la mm:ss).

Momentul de Timp din Videoclip

  • 00:00 Start
  • 2:00 Introducere
  • 3:48 Pagina de documentație
  • 6:33 Conexiunile explicate
  • 7:35 Codul Arduino explicat
  • 15:03 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
  • 16:46 Demonstrație CheerLights

Imagini

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
Limba: 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();
}

Resurse și referințe

Fișiere📁

Nu sunt disponibile fișiere.