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).
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.
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ı


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
/*********
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
}
Common Course Links
Common Course Files
Kaynaklar ve referanslar
-
BelgelendirmeESP32 Tutorial 52/55- SunFounder doc page for CheerLightdocs.sunfounder.com
Dosyalar📁
Dosya mevcut değil.