Search Code

ESP32 Eğitimi 52/55 - WS2812 CheerLights MQTT Küresel Senkronizasyon LCD ile | SunFounder ESP32 IoT Kiti

ESP32 Eğitimi 52/55 - WS2812 CheerLights MQTT Küresel Senkronizasyon LCD ile | SunFounder ESP32 IoT Kiti

Bu eğitimde, ESP32 kullanarak MQTT üzerinden renkleri küresel olarak senkronize edecek bir CheerLights projesi oluşturacağız. Bu proje yalnızca diğer kullanıcıların girdilerine göre renkleri değiştirmekle kalmayacak, aynı zamanda LCD ekranda mevcut rengi ve kaç kez güncellendiğini de gösterecektir. Sonuç, cihazların nasıl etkileşime girebileceğini ve kullanıcıları mesafeler boyunca bağlı tutabileceğini sergileyen eğlenceli bir IoT yetenekleri gösterimidir. Ek açıklama için videoyu izleyin (videoda 00:00'da).

esp32-52-cheer-light-lcd-main

Donanım Açıklaması

Bu projeyi oluşturmak için bir ESP32 mikrodenetleyici, bir WS2812 LED şeridi ve bir LCD ekrana ihtiyacınız olacak. ESP32, internete bağlanmak ve MQTT mesajlarını almak için yerleşik Wi-Fi özelliklerini kullanarak işlemin beyni olarak görev yapar. Bu, diğer kullanıcıların küresel girdisine dayalı olarak LED renklerinde gerçek zamanlı güncellemeler sağlar.

WS2812 LED şeridi, adreslenebilir RGB LED'ler gerektiren projeler için popüler bir seçimdir. Her LED bağımsız olarak kontrol edilebilir ve zengin renk gösterimlerine olanak tanır. LCD, mevcut rengin ve kaç kez değiştirildiğinin görsel bir onayını sağlayarak kullanıcı etkileşimini artıracaktır.

cheeLights_LCD

Veri Sayfası Detayları

Üretici SunFounder
Parça numarası ESP32
Mantık/IO voltajı 3,3 V
Besleme voltajı 5 V
Çıkış akımı (kanal başına) 20 mA
Tepe akımı (kanal başına) 60 mA
PWM frekansı yönergesi 400 Hz
Giriş mantık eşikleri 0,15 V (düşük), 0,8 V (yüksek)
Gerilim düşümü / RDS(on) / doyum 0,2 V
Termal sınırlar 85 °C
Paket ESP32 modülü
Notlar / varyantlar Yerleşik Wi-Fi ve Bluetooth içerir

 

  • ESP32'ye (5 V) ve WS2812 şeridine (5 V) uygun güç kaynağı sağlayın.
  • ESP32 ile LED şeridi arasında ortak toprak kullanın.
  • Renk senkronizasyonu için uygun bir MQTT broker uygulayın.
  • WS2812 için veri pini bağlantısına dikkat edin (koda göre pin 14).
  • LED sayısına dikkat edin; güç sınırlarını aşmak ek güç kaynakları gerektirir.

Bağlantı Talimatları

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

Bileşenleri bağlamak için WS2812 LED şeridini bağlayarak başlayın. LED şeridinin toprak pinini (genellikle siyah) ESP32 üzerindeki toprak pinine bağlayın. Ardından, LED şeridinin VCC pinini (genellikle kırmızı) ESP32 üzerindeki 5V çıkışına bağlayın. Son olarak, veri pinini (genellikle sarı) ESP32 üzerindeki GPIO pin 14'e bağlayın.

LCD için, toprak pinini (genellikle siyah) ESP32 üzerindeki toprağa bağlayın. VCC pini (genellikle kırmızı) 5V çıkışına bağlanmalıdır. SDA pini (genellikle gri) GPIO pin 21'e bağlanırken, SCL pini (genellikle beyaz) GPIO pin 22'ye bağlanır. Bu kurulum, ESP32'nin LCD ile iletişim kurmasını ve gerektiğinde bilgi görüntülemesini sağlar.

Kod Örnekleri ve Açıklama

Kurulum fonksiyonunda, LCD'yi başlatır ve Wi-Fi'ye bağlanırız. Aşağıdaki kod, gerekli kütüphanelerin nasıl tanımlanacağını ve LCD'nin nasıl kurulacağını gösterir:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // LCD adresini ayarlayın
void setup() {
  Serial.begin(115200);
  lcd.init(); // LCD'yi başlat
  lcd.backlight(); // LCD arka ışığını açar.
}

Bu, LCD'yi kullanım için başlatır ve mesajları görüntülemesine olanak tanır. Sonraki alıntı, Wi-Fi bağlantısının nasıl kurulduğunu gösterir:

void setup_wifi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    lcdConnect(); //LCD için
    delay(500);
  }
  Serial.println("WiFi bağlandı");
}

Bu fonksiyon, belirtilen Wi-Fi ağına bir bağlantı kurar ve bağlanırken LCD'de bir mesaj görüntüler. Son olarak, renk değiştirme mantığı geri çağırma fonksiyonunda işlenir:

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

Bu fonksiyon, "cheerlights" konusundaki gelen mesajları dinler ve rengi buna göre günceller. Tam kod makalenin altında yüklenir, bu yüzden tam uygulama için incelemeyi unutmayın.

Gösterim / Beklentiler

Projeyi tamamladığınızda, LED şeridinin küresel bir MQTT akışından gelen girdilere göre renk değiştirmesini bekleyebilirsiniz. LCD, mevcut renk adını ve kaç kez değiştirildiğini gösterecektir. İnternet bağlantısını keserseniz, LCD, bağlantı yeniden kurulana kadar "Bağlanıyor..." gösterecektir (videoda 12:30'da).

Yaygın tuzaklar arasında veri bağlantıları için doğru pinlerin kullanıldığından emin olmak ve Wi-Fi kimlik bilgilerinin doğru olduğunu doğrulamak yer alır. SSID veya şifrede herhangi bir tutarsızlık varsa, ESP32 bağlanamaz ve LCD bağlantı mesajını göstermeye devam eder.

Video Zaman Damgaları

  • 00:00 Başlangıç
  • 1:59 Projeye giriş
  • 6:16 Bağlantı şeması açıklaması
  • 8:13 Arduino Kodu açıklaması
  • 14:26 Arduino IDE'de ESP32 kartı ve COM portu seçimi
  • 16:07 LCD ile CheerLight Gösterimi

Görseller

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
Dil: 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
  






}

Kaynaklar ve referanslar

Dosyalar📁

Dosya mevcut değil.