Search Code

Poradnik ESP32 52/55 - WS2812 CheerLights MQTT Global Sync z LCD | SunFounder ESP32 IoT kit

Poradnik ESP32 52/55 - WS2812 CheerLights MQTT Global Sync z LCD | SunFounder ESP32 IoT kit

W tym samouczku stworzymy projekt CheerLights z użyciem ESP32, który będzie synchronizował kolory globalnie przez MQTT. Projekt ten nie tylko będzie zmieniał kolory na podstawie danych wejściowych od innych użytkowników, ale także wyświetlał bieżący kolor oraz liczbę jego aktualizacji na ekranie LCD. Efektem będzie zabawna demonstracja możliwości IoT, pokazująca, jak urządzenia mogą współdziałać i utrzymywać kontakt między użytkownikami na odległość. Aby uzyskać dodatkowe wyjaśnienia, obejrzyj wideo (na wideo w 00:00).

esp32-52-cheer-light-lcd-main

Wyjaśnienie sprzętu

Do zbudowania tego projektu potrzebny będzie mikrokontroler ESP32, pasek LED WS2812 oraz wyświetlacz LCD. ESP32 pełni rolę mózgu operacji, wykorzystując wbudowane możliwości Wi-Fi do połączenia z internetem i odbierania wiadomości MQTT. Umożliwia to aktualizacje kolorów LED w czasie rzeczywistym na podstawie globalnych danych wejściowych od innych użytkowników.

Pasek LED WS2812 to popularny wybór do projektów wymagających adresowalnych diod RGB. Każda dioda może być sterowana niezależnie, co pozwala na bogate wyświetlanie kolorów. LCD zapewni wizualne potwierdzenie bieżącego koloru oraz liczby jego zmian, zwiększając interakcję z użytkownikiem.

cheeLights_LCD

Szczegóły z karty katalogowej

Producent SunFounder
Numer części ESP32
Napięcie logiki/IO 3,3 V
Napięcie zasilania 5 V
Prąd wyjściowy (na kanał) 20 mA
Prąd szczytowy (na kanał) 60 mA
Zalecana częstotliwość PWM 400 Hz
Progi logiczne wejścia 0,15 V (niski), 0,8 V (wysoki)
Spadek napięcia / RDS(on) / nasycenie 0,2 V
Limity termiczne 85 °C
Obudowa Moduł ESP32
Uwagi / warianty Obejmuje wbudowane Wi-Fi i Bluetooth

 

  • Zapewnij prawidłowe zasilanie ESP32 (5 V) i paska WS2812 (5 V).
  • Użyj wspólnej masy między ESP32 a paskiem LED.
  • Zaimplementuj odpowiedni broker MQTT do synchronizacji kolorów.
  • Zwróć uwagę na połączenie pinu danych dla WS2812 (pin 14 zgodnie z kodem).
  • Zachowaj ostrożność z liczbą diod LED; przekroczenie limitów mocy wymaga dodatkowych źródeł zasilania.

Instrukcje podłączenia

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

Aby podłączyć komponenty, zacznij od podłączenia paska LED WS2812. Podłącz pin masy (zwykle czarny) paska LED do pinu masy na ESP32. Następnie podłącz pin VCC (zwykle czerwony) paska LED do wyjścia 5V na ESP32. Na koniec podłącz pin danych (często żółty) do pinu GPIO 14 na ESP32.

Dla LCD podłącz pin masy (często czarny) do masy na ESP32. Pin VCC (zwykle czerwony) powinien być podłączony do wyjścia 5V. Pin SDA (zazwyczaj szary) łączy się z pinem GPIO 21, podczas gdy pin SCL (zwykle biały) łączy się z pinem GPIO 22. Ta konfiguracja umożliwia ESP32 komunikację z LCD i wyświetlanie informacji w razie potrzeby.

Przykłady kodu i omówienie

W funkcji setup inicjalizujemy LCD i łączymy się z Wi-Fi. Poniższy kod pokazuje, jak zdefiniować niezbędne biblioteki i skonfigurować LCD:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // ustaw adres LCD
void setup() {
  Serial.begin(115200);
  lcd.init(); // inicjalizacja LCD 
  lcd.backlight(); // Włącza podświetlenie LCD.
}

To inicjalizuje LCD do użycia, umożliwiając wyświetlanie komunikatów. Następny fragment pokazuje, jak nawiązywane jest połączenie Wi-Fi:

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

Ta funkcja nawiązuje połączenie z określoną siecią Wi-Fi, wyświetlając komunikat na LCD podczas łączenia. Na koniec logika zmiany koloru jest obsługiwana w funkcji wywołania zwrotnego:

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);
  }
}

Ta funkcja nasłuchuje przychodzących wiadomości na temacie "cheerlights" i odpowiednio aktualizuje kolor. Pełny kod znajduje się poniżej artykułu, więc upewnij się, że go przejrzałeś, aby zobaczyć kompletną implementację.

Demonstracja / Czego się spodziewać

Po ukończeniu projektu możesz spodziewać się, że pasek LED będzie zmieniał kolory na podstawie danych z globalnego źródła MQTT. LCD będzie wyświetlać nazwę bieżącego koloru oraz liczbę jego zmian. Jeśli odłączysz internet, LCD wskaże "Connecting..." (Łączenie...) do czasu ponownego nawiązania połączenia (na wideo w 12:30).

Typowe pułapki obejmują upewnienie się, że używane są prawidłowe piny do połączeń danych oraz weryfikację poprawności danych logowania Wi-Fi. Jeśli wystąpią jakiekolwiek rozbieżności w SSID lub haśle, ESP32 nie połączy się, a LCD będzie nadal wyświetlać komunikat o łączeniu.

Znaczniki czasu wideo

  • 00:00 Start
  • 1:59 Wprowadzenie do projektu
  • 6:16 Wyjaśnienie podłączeń
  • 8:13 Wyjaśnienie kodu Arduino
  • 14:26 Wybór płytki ESP32 i portu COM w Arduino IDE
  • 16:07 Demonstracja CheerLight z wyświetlaczem LCD

Obrazy

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
Język: C++
/*********
This is the origianl code from Examples->iot_5_cheerlight of SunFounder
full video instrucions https://youtu.be/xEqmxMiF-E8
📚⬇️ Download and resource page https://robojax.com/RJT685

I have added LCD to display:
1-Color name
2-Count the number of times the color is updated
3-Showon LCD if wifi is connected
4-Show connecting if not connected or disconnected

Written by Ahmad Shamshiri
www.Robojax.com
Dec 29, 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);  // set the LCD address to 0x27 for a 16 chars and 2 line 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>



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

// 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);

  lcd.init();// initialize the lcd 
  lcd.backlight(); // Turns on the LCD backlight.

  // 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) {
    lcdConnect();//for 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();

  // 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()) {
  lcdConnect();
    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]) {
        lastColor = colorIndex;//remeber the last color
        colorCount++;//increment the count
      // 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]));
        delay(100);
      }
      pixels.show();
    }
  }
}

void lcdConnect()
{
    lcd.clear(); 
    lcd.setCursor(0, 0); //line 0
    lcd.print("Connecting...");   
    lcd.setCursor(0, 1); 
    lcd.print("SSID:"); //line 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();


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

  //second row
  lcd.setCursor(0, 1);
  lcd.print("Changed ");  
  lcd.print(colorCount);
  lcd.print(" times");

  delay(1000);//we must have delay to able to read the display
  






}

Zasoby i odniesienia

Pliki📁

Brak dostępnych plików.