Search Code

ESP32 Tutorial 47/55 - WS2812 CheerLights met MQTT via internet | SunFounder's ESP32 IoT-kit

ESP32 Tutorial 47/55 - WS2812 CheerLights met MQTT via internet | SunFounder's ESP32 IoT-kit

In deze tutorial maken we een gesynchroniseerd verlichtingssysteem met behulp van de ESP32 en WS2812 LED's dat op afstand kan worden bediend via MQTT. Dit systeem stelt meerdere gebruikers in staat om tegelijkertijd de kleur van de lichten te veranderen, waardoor een verbonden ervaring ontstaat, ongeacht de locatie. Het project maakt gebruik van de SunFounder ESP32 IoT-kit, die een krachtige microcontroller met Wi-Fi-mogelijkheden bevat, waardoor het ideaal is voor IoT-toepassingen.

WS2812_strip.ON

In de video doorlopen we de benodigde opstelling, bedrading en code-implementatie om dit effect te bereiken. Als je verdere verduidelijking nodig hebt, bekijk dan de video op specifieke tijdstippen (in video op mm:ss).

Hardware Uitgelegd

De primaire componenten van dit project zijn de ESP32-microcontroller, WS2812 LED-strip en een MQTT-broker. De ESP32 is een veelzijdige microcontroller met ingebouwde Wi-Fi- en Bluetooth-mogelijkheden, waardoor deze gemakkelijk verbinding kan maken met internet. Het fungeert als het brein van ons project en verzorgt de communicatie en aansturing van de LED-strip.

De WS2812 LED-strip bestaat uit individueel adresseerbare RGB-LED's, die kunnen worden aangestuurd om een breed scala aan kleuren weer te geven. Elke LED kan worden in- of uitgeschakeld en op elke kleur worden ingesteld via een enkele datalijn, waardoor het perfect is voor dynamische lichteffecten. De MQTT-broker faciliteert de communicatie tussen verschillende clients, waardoor gebruikers berichten kunnen publiceren en zich kunnen abonneren op onderwerpen die de LED-kleuren aansturen.

Datasheet Details

Fabrikant Adafruit
Onderdeelnummer WS2812B
Logica/IO-spanning 3,5 - 5,5 V
Voedingsspanning 5 V
Uitgangsstroom (per kanaal) 20 mA
Piekstroom (per kanaal) 60 mA
PWM-frequentierichtlijn 400 Hz
Ingangslogische drempels 0,2Vcc (laag), 0,7Vcc (hoog)
Spanningsval / RDS(on) / verzadiging 0,5 V
Thermische limieten Bedrijfstemperatuur: -25 tot 85 °C
Behuizing Individuele 5050 SMD
Opmerkingen / varianten Beschikbaar in verschillende lengtes en configuraties

 

  • Zorg voor een adequate voeding voor de WS2812-strip om spanningsdalingen te voorkomen.
  • Gebruik een gemeenschappelijke aarde tussen de ESP32 en de LED-strip.
  • Houd datalijnen kort om signaalverslechtering te voorkomen.
  • Overweeg een condensator (1000μF) over de voeding te plaatsen om spanningspieken af te vlakken.
  • Gebruik geschikte weerstanden op de datalijn om signaalreflectie te voorkomen.
  • Wees je bewust van de totale stroomafname van de LED-strip; gebruik externe voeding wanneer nodig.

Bedradingsinstructies

Om de ESP32 met de WS2812 LED-strip te bedraden, begin je met het aansluiten van de voeding. Verbind de rode draad van de LED-strip met een 5V-voedingsbron en de zwarte draad met de aarde. Verbind vervolgens de datalijn (gele draad) van de WS2812-strip met pin 14 op de ESP32. Zorg ervoor dat de ESP32 ook op dezelfde aarde is aangesloten als de LED-strip om een gemeenschappelijke referentie te behouden.

Nadat je de stroom- en dataverbindingen hebt ingesteld, verbind je de ESP32 met je computer via een micro-USB-kabel voor het programmeren. Je moet ervoor zorgen dat de ESP32 is ingeschakeld tijdens het programmeren om een verbinding tot stand te brengen. Zodra de bedrading is voltooid, kun je doorgaan met het uploaden van de code en het testen van de opstelling.

esp32-47-cheer-light-wiring

Codevoorbeelden & Uitleg

De code begint met het opnemen van de benodigde bibliotheken voor Wi-Fi- en MQTT-functionaliteit. De identifiers ssid en password worden gebruikt om je Wi-Fi-referenties op te slaan, terwijl mqtt_server het adres van de MQTT-broker bevat.

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

Vervolgens definiëren we de ondersteunde CheerLights-kleuren en hun bijbehorende RGB-waarden met behulp van arrays. Hierdoor heeft het programma gemakkelijk toegang tot de kleurinstellingen op basis van gebruikersinvoer.

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

De functie setup() initialiseert de seriële communicatie, stelt de Wi-Fi-verbinding in en bereidt de MQTT-client voor. Het start ook de LED-strip.

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

De hoofdloop controleert continu de MQTT-verbinding en verwerkt inkomende berichten die de LED-kleuren aansturen. De functie callback() wordt geactiveerd wanneer een bericht wordt ontvangen op het geabonneerde onderwerp.

Demonstratie / Wat te Verwachten

Zodra alles is ingesteld en de code is geüpload, zou je de kleur van de WS2812-LED's moeten kunnen veranderen door berichten naar het MQTT-onderwerp te sturen. Als een andere gebruiker de kleur verandert, zullen alle verbonden apparaten de wijziging tegelijkertijd weerspiegelen. Wees voorzichtig met mogelijke problemen zoals omgekeerde polariteit of onjuiste verbindingen, die kunnen voorkomen dat de LED's correct functioneren (in video op mm:ss).

Videotijdstippen

  • 00:00 Start
  • 2:00 Introductie
  • 3:48 Documentatiepagina
  • 6:33 Bedrading uitgelegd
  • 7:35 Arduino-code uitgelegd
  • 15:03 ESP32-board en COMP-poort selecteren in Arduino IDE
  • 16:46 CheerLights-demonstratie

Afbeeldingen

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

Hulpmiddelen en referenties

Bestanden📁

Geen bestanden beschikbaar.