Suchcode

ESP32 Tutorial 52/55 - WS2812 CheerLights MQTT Globale Synchronisation mit LCD | SunFounder ESP32 IoT-Kit

ESP32 Tutorial 52/55 - WS2812 CheerLights MQTT Globale Synchronisation mit LCD | SunFounder ESP32 IoT-Kit

In diesem Tutorial werden wir ein CheerLights-Projekt mit dem ESP32 erstellen, das Farben global über MQTT synchronisiert. Dieses Projekt wird nicht nur die Farben basierend auf Eingaben von anderen Benutzern ändern, sondern auch die aktuelle Farbe und wie oft sie aktualisiert wurde, auf einem LCD-Bildschirm anzeigen. Das Ergebnis ist eine unterhaltsame Demonstration der IoT-Fähigkeiten, die zeigt, wie Geräte interagieren und Benutzer über Entfernungen hinweg verbunden bleiben können. Zur weiteren Veranschaulichung schauen Sie sich das Video an (im Video bei 00:00).

esp32-52-cheer-light-lcd-haupt

Hardware erklärt

Um dieses Projekt zu bauen, benötigen Sie einen ESP32-Mikrocontroller, einen WS2812-LED-Streifen und ein LCD-Display. Der ESP32 dient als das Gehirn des Betriebs und nutzt seine integrierten Wi-Fi-Fähigkeiten, um sich mit dem Internet zu verbinden und MQTT-Nachrichten zu empfangen. Dadurch sind Echtzeitaktualisierungen der LED-Farben basierend auf einem globalen Eingangs von anderen Benutzern möglich.

Der WS2812 LED-Streifen ist eine beliebte Wahl für Projekte, die adressierbare RGB-LEDs erfordern. Jede LED kann unabhängig gesteuert werden, was reichhaltige Farbdarstellungen ermöglicht. Das LCD wird eine visuelle Bestätigung der aktuellen Farbe und der Anzahl der Änderungen bieten, was die Benutzerinteraktion verbessert.

cheeLights_LCD

Technische Daten

Hersteller SunFounder
Teilenummer ESP32
Logik/IO-Spannung 3,3 V
Versorgungsspannung 5 V
Ausgangsstrom (pro Kanal) 20 mA
Spitzenstrom (pro Kanal) 60 mA
PWM-Frequenzrichtlinie 400 Hz
Eingangsschwellwerte 0,15 V (niedrig), 0,8 V (hoch)
Spannungsabfall / RDS(on)/ Sättigung 0,2 V
Thermische Grenzen 85 °C
Paket ESP32-Modul
Notizen / Varianten Eingebautes Wi-Fi und Bluetooth enthalten.

  • Stellen Sie die ordnungsgemäße Stromversorgung für den ESP32 (5 V) und den WS2812-Streifen (5 V) sicher.
  • Verwenden Sie einen gemeinsamen Masseanschluss zwischen dem ESP32 und dem LED-Streifen.
  • Implementieren Sie einen ordentlichen MQTT-Broker für die Farbsynchronisation.
  • Achten Sie auf die Daten-Pin-Verbindung für den WS2812 (Pin 14 gemäß dem Code).
  • Sei vorsichtig mit der Anzahl der LEDs; das Überschreiten der Leistungsgrenzen erfordert zusätzliche Stromquellen.

Verdrahtungsanweisungen

ESP32-11_LCD-wiring
esp32-47-cheer-light-wiring

Um die Komponenten zu verdrahten, beginnen Sie mit dem Anschließen des WS2812 LED-Streifens. Verbinden Sie den Massepin (normalerweise schwarz) des LED-Streifens mit dem Massepin des ESP32. Verbinden Sie dann den VCC-Pin (normalerweise rot) des LED-Streifens mit dem 5V-Ausgang des ESP32. Verbinden Sie schließlich den Datenpin (häufig gelb) mit dem GPIO-Pin 14 des ESP32.

Für das LCD verbinden Sie den Erdungspin (oft schwarz) mit der Erde am ESP32. Der VCC-Pin (in der Regel rot) sollte mit dem 5V-Ausgang verbunden werden. Der SDA-Pin (typischerweise grau) wird mit dem GPIO-Pin 21 verbunden, während der SCL-Pin (in der Regel weiß) mit dem GPIO-Pin 22 verbunden wird. Diese Konfiguration ermöglicht es dem ESP32, mit dem LCD zu kommunizieren und Informationen nach Bedarf anzuzeigen.

Codebeispiele und Anleitung

In der Setup-Funktion initialisieren wir das LCD und verbinden uns mit Wi-Fi. Der folgende Code zeigt, wie man die erforderlichen Bibliotheken definiert und das LCD einrichtet:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // set the LCD address
void setup() {
  Serial.begin(115200);
  lcd.init(); // initialize the lcd 
  lcd.backlight(); // Turns on the LCD backlight.
}

Dies initialisiert das LCD zur Verwendung, sodass es Nachrichten anzeigen kann. Der nächste Abschnitt zeigt, wie die Wi-Fi-Verbindung hergestellt wird:

void setup_wifi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    lcdConnect(); //for LCD
    delay(500);
  }
  Serial.println("WiFi connected");
}

Diese Funktion stellt eine Verbindung zum angegebenen Wi-Fi-Netzwerk her und zeigt während der Verbindung eine Nachricht auf dem LCD an. Schließlich wird die Logik für den Farbwechsel in der Callback-Funktion behandelt:

void callback(char* topic, byte* message, unsigned int length) {
  String messageTemp;
  for (int i = 0; i < length; i++) {
    messageTemp += (char)message[i];
  }
  if (String(topic) == "cheerlights") {
    setColor(messageTemp);
  }
}

Diese Funktion lauscht auf eingehende Nachrichten zum Thema "cheerlights" und aktualisiert die Farbe entsprechend. Der vollständige Code wird unter dem Artikel geladen, also stellen Sie sicher, dass Sie ihn zur vollständigen Implementierung überprüfen.

Demonstration / Was Sie erwarten können

Nach Abschluss des Projekts können Sie erwarten, dass der LED-Streifen die Farben basierend auf Eingaben von einem globalen MQTT-Feed ändert. Das LCD wird den aktuellen Farbnamen und die Anzahl der Änderungen anzeigen. Wenn Sie das Internet trennen, zeigt das LCD "Verbindung wird hergestellt..." an, bis eine Verbindung wiederhergestellt ist (im Video um 12:30).

Häufige Fallstricke sind die Sicherstellung, dass die richtigen Pins für Datenverbindungen verwendet werden, und die Überprüfung, ob die Wi-Fi-Anmeldeinformationen korrekt sind. Bei Unstimmigkeiten im SSID oder Passwort wird der ESP32 keine Verbindung herstellen, und das LCD wird weiterhin die Verbindungsmeldung anzeigen.

Video-Zeiten

  • 00:00 Start
  • 1:59 Einführung in das Projekt
  • 6:16 Verkabelung erklärt
  • 8:13 Arduino-Code erklärt
  • 14:26 Auswahl des ESP32-Boards und des COM-Ports in der Arduino IDE
  • 16:07 CheerLight-Demonstration mit LCD

Bilder

ESP32-11_LCD-wiring
ESP32-11_LCD-wiring
esp32-47-cheer-light-wiring
esp32-47-cheer-light-wiring
esp32-52-cheer-light-lcd-main
esp32-52-cheer-light-lcd-main
cheeLights_LCD
cheeLights_LCD
853-ESP32 Tutorial 52/55- CheerLight MQTT and LCD
Sprache: C++
/*
 * Dies ist der Originalcode aus Examples->iot_5_cheerlight von SunFounder
 * vollständige Videoinstruktionen https://youtu.be/xEqmxMiF-E8
 * 📚⬇️ Download- und Ressourcen-Seite https://robojax.com/RJT685
 * 
 * Ich habe ein LCD hinzugefügt, um anzuzeigen:
 * 1-Farbname
 * 2-Anzahl der Aktualisierungen der Farbe
 * 3-Anzeigen auf dem LCD, wenn das WLAN verbunden ist
 * 4-Anzeigen von "Verbinde", wenn nicht verbunden oder getrennt
 * 
 * Geschrieben von Ahmad Shamshiri
 * www.Robojax.com
 * 29. Dezember 2023
 * 
 * :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 <Wire.h>
#include <LiquidCrystal_I2C.h>

 // SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27, 16,2); // Setzen Sie die LCD-Adresse auf 0x27 für ein 16 Zeichen und 2 Zeilen Display.

int colorCount = 0;
int lastColor=0;

byte connected[] = {
          B00001,
          B00001,
          B00011,
          B00111,
          B00111,
          B01111,
          B01111,
          B11111
};


#include <WiFi.h>
#include <PubSubClient.h>
 // #include <Wire.h>
#include <Adafruit_NeoPixel.h>



 // Ersetzen Sie die nächsten Variablen durch Ihre SSID/Passwort-Kombination.
const char* ssid = "dars";
const char* password = "5152535455";

 // Fügen Sie die Adresse Ihres MQTT-Brokers hinzu:
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;


 // Definieren Sie die unterstützten CheerLights-Farben und deren RGB-Werte.
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};

int colorRGB[][3] = { 255,   0,   0, // rot
                      255, 192, 203, // rosa
                        0, 255,   0, // grün
                        0,   0, 255, // blau
                        0, 255, 255, // "cyan"
                      255, 255, 255, // weiß
                      255, 223, 223, // warmweiß
                      255, 223, 223, // alte Spitze
                      128,   0, 128, // lila
                      255,   0, 255, // magenta
                      255, 255,   0, // gelb
                      255, 165,   0}; // orange

 // RGB-Streifen initialisieren
#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);

  lcd.init(); // LCD initialisieren
  lcd.backlight(); // Schaltet die LCD-Hintergrundbeleuchtung ein.

 // WLAN-Standard Einstellungen
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

 // rgb-Streifen beginnen
  pixels.begin();
  pixels.show();

}

void setup_wifi() {
  delay(10);
 // Wir beginnen mit der Verbindung zu einem WiFi-Netzwerk.
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    lcdConnect(); // für LCD
    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();

 // Wenn eine Nachricht zu diesem Thema eingeht, werden Sie diese Nachricht überprüfen.
 // Ändert den Ausgangszustand entsprechend der Nachricht.
  if (String(topic) == "cheerlights") {
    Serial.print("Changing color to ");
    Serial.println(messageTemp);
    setColor(messageTemp);
  }
}

void reconnect() {
 // Schleife, bis wir wieder verbunden sind.
  while (!client.connected()) {
  lcdConnect();
    Serial.print("Attempting MQTT connection...");
 // Versuch, eine Verbindung herzustellen
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
 // Abonnieren
      client.subscribe("cheerlights");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
 // Warte 5 Sekunden, bevor du es erneut versuchst.
      delay(5000);
    }
  }
}

void setColor(String color) {
 // Durchlaufe die Liste der Farben, um die passende Farbe zu finden.
  for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
    if (color == colorName[colorIndex]) {
        lastColor = colorIndex; // erinnere dich an die letzte Farbe
        colorCount++; // erhöhe die Anzahl
 // Stelle die Farbe jedes NeoPixel auf dem Streifen ein.
      for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
        pixels.setPixelColor(pixel, pixels.Color (colorRGB [colorIndex][0], colorRGB [colorIndex][1], colorRGB [colorIndex][2]));
        delay(100);
      }
      pixels.show();
    }
  }
}

void lcdConnect()
{
    lcd.clear();
    lcd.setCursor(0, 0); // linie 0
    lcd.print("Connecting...");
    lcd.setCursor(0, 1);
    lcd.print("SSID:"); // zeile 1
    lcd.print(ssid);
}

void loop() {
  lcd.clear();

  if (!client.connected()) {
    reconnect();
  }else{
    lcd.createChar(0, connected);
    lcd.setCursor(15, 0);
    lcd.write(byte(0));
  }
  client.loop();


 // erste Reihe
  lcd.setCursor(0, 0);
  lcd.print("Color: ");
  lcd.print(colorName[lastColor]);

 // zweite Reihe
  lcd.setCursor(0, 1);
  lcd.print("Changed ");
  lcd.print(colorCount);
  lcd.print(" times");

  delay(1000); // Wir müssen eine Verzögerung haben, um das Display lesen zu können.







}

Ressourcen & Referenzen

Dateien📁

Keine Dateien verfügbar.