Pretraži kod

ESP32 Tutorijal 47/55 - WS2812 CheerLights koristeći MQTT preko interneta | SunFounder-ov ESP32 IoT komplet

ESP32 Tutorijal 47/55 - WS2812 CheerLights koristeći MQTT preko interneta | SunFounder-ov ESP32 IoT komplet

U ovom tutorijalu ćemo kreirati sinhronizovani sistem osvetljenja koristeći ESP32 i WS2812 LED diode koje se mogu daljinski kontrolisati putem MQTT-a. Ovaj sistem omogućava više korisnika da istovremeno menjaju boju svetala, stvarajući povezano iskustvo bez obzira na lokaciju. Projekat koristi SunFounder ESP32 IoT komplet, koji uključuje moćan mikrokontroler sa Wi-Fi mogućnostima, što ga čini idealnim za IoT aplikacije.

WS2812_strip.ON

Tokom videa, proći ćemo kroz neophodno podešavanje, povezivanje i implementaciju koda za postizanje ovog efekta. Ako vam je potrebno dodatno pojašnjenje, obavezno pogledajte video na određenim vremenskim oznakama (u videu na mm:ss).

Objašnjenje hardvera

Primarne komponente ovog projekta uključuju ESP32 mikrokontroler, WS2812 LED traku i MQTT broker. ESP32 je svestran mikrokontroler sa ugrađenim Wi-Fi i Bluetooth mogućnostima, što mu omogućava lako povezivanje na internet. On služi kao mozak našeg projekta, upravljajući komunikacijom i kontrolišući LED traku.

WS2812 LED traka se sastoji od pojedinačno adresabilnih RGB LED dioda, koje se mogu kontrolisati za prikaz širokog spektra boja. Svaka LED dioda se može uključiti ili isključiti i podesiti na bilo koju boju koristeći jednu liniju podataka, što je čini savršenom za dinamične svetlosne efekte. MQTT broker olakšava komunikaciju između različitih klijenata, omogućavajući korisnicima da objavljuju i pretplaćuju se na teme koje kontrolišu boje LED dioda.

Detalji iz tehničke dokumentacije

Proizvođač Adafruit
Broj dela WS2812B
Logički/IO napon 3.5 - 5.5 V
Napon napajanja 5 V
Izlazna struja (po kanalu) 20 mA
Maksimalna struja (po kanalu) 60 mA
Preporuka za PWM frekvenciju 400 Hz
Ulazni logički pragovi 0.2Vcc (nisko), 0.7Vcc (visoko)
Pad napona / RDS(on) / zasićenje 0.5 V
Termička ograničenja Radna temperatura: -25 do 85 °C
Pakovanje Pojedinačni 5050 SMD
Napomene / varijante Dostupno u različitim dužinama i konfiguracijama

 

  • Osigurajte adekvatno napajanje za WS2812 traku kako biste izbegli padove napona.
  • Koristite zajedničko uzemljenje između ESP32 i LED trake.
  • Držite linije podataka kratkim kako biste sprečili degradaciju signala.
  • Razmotrite korišćenje kondenzatora (1000μF) preko napajanja kako biste izgladili naponske šiljke.
  • Koristite odgovarajuće otpornike na liniji podataka kako biste sprečili refleksiju signala.
  • Budite svesni ukupne struje koju povlači LED traka; koristite eksterno napajanje kada je to neophodno.

Uputstva za povezivanje

Da biste povezali ESP32 sa WS2812 LED trakom, počnite povezivanjem napajanja. Povežite crvenu žicu sa LED trake na 5V izvor napajanja, a crnu žicu na uzemljenje. Zatim povežite liniju podataka (žutu žicu) sa WS2812 trake na pin 14 na ESP32. Uverite se da je ESP32 takođe povezan na isto uzemljenje kao i LED traka kako biste održali zajedničku referencu.

Nakon podešavanja napajanja i podatkovnih veza, povežite ESP32 sa računarom koristeći mikro USB kabl za programiranje. Moraćete da osigurate da je ESP32 uključen tokom programiranja kako biste uspostavili vezu. Kada je povezano, možete nastaviti sa otpremanjem koda i testiranjem podešavanja.

esp32-47-cheer-light-wiring

Primeri koda i objašnjenje

Kod počinje uključivanjem neophodnih biblioteka za Wi-Fi i MQTT funkcionalnost. Identifikatori ssid i password se koriste za čuvanje vaših Wi-Fi kredencijala, dok mqtt_server sadrži adresu MQTT brokera.

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

Zatim definišemo podržane CheerLights boje i njihove odgovarajuće RGB vrednosti koristeći nizove. Ovo omogućava programu lak pristup podešavanjima boja na osnovu korisničkog unosa.

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

Funkcija setup() inicijalizuje serijsku komunikaciju, podešava Wi-Fi vezu i priprema MQTT klijenta. Takođe pokreće LED traku.

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

Glavna petlja kontinuirano proverava MQTT vezu i obrađuje dolazne poruke koje kontrolišu boje LED dioda. Funkcija callback() se aktivira kada se primi poruka na pretplaćenu temu.

Demonstracija / Šta očekivati

Kada je sve podešeno i kod otpremljen, trebalo bi da budete u mogućnosti da promenite boju WS2812 LED dioda slanjem poruka na MQTT temu. Ako drugi korisnik promeni boju, svi povezani uređaji će istovremeno odraziti promenu. Budite oprezni na potencijalne probleme kao što su obrnuti polaritet ili nepravilne veze, koje bi mogle sprečiti ispravno funkcionisanje LED dioda (u videu na mm:ss).

Vremenske oznake videa

  • 00:00 Početak
  • 2:00 Uvod
  • 3:48 Stranica dokumentacije
  • 6:33 Objašnjeno povezivanje
  • 7:35 Objašnjen Arduino kod
  • 15:03 Odabir ESP32 ploče i COMP porta u Arduino IDE-u
  • 16:46 Demonstracija CheerLights-a

Slike

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

Resursi i reference

Datoteke📁

Nema dostupnih datoteka.