ESP32 Eğitimi 47/55 - WS2812 CheerLights, İnternet Üzerinden MQTT Kullanarak | SunFounder'ın ESP32 IoT kiti
Bu eğitimde, ESP32 ve WS2812 LED'leri kullanarak MQTT üzerinden uzaktan kontrol edilebilen senkronize bir aydınlatma sistemi oluşturacağız. Bu sistem, birden fazla kullanıcının ışıkların rengini aynı anda değiştirmesine olanak tanıyarak, konumdan bağımsız olarak bağlantılı bir deneyim yaratır. Proje, Wi-Fi özelliklerine sahip güçlü bir mikrodenetleyici içeren ve IoT uygulamaları için ideal olan SunFounder ESP32 IoT kitini kullanır.
Video boyunca, bu efekti elde etmek için gerekli kurulum, bağlantı ve kod uygulamasını adım adım inceleyeceğiz. Daha fazla açıklamaya ihtiyacınız olursa, videoyu belirli zaman damgalarında (videoda mm:ss) kontrol ettiğinizden emin olun.
Donanım Açıklaması
Bu projenin ana bileşenleri ESP32 mikrodenetleyicisi, WS2812 LED şeridi ve bir MQTT broker'ıdır. ESP32, yerleşik Wi-Fi ve Bluetooth özelliklerine sahip çok yönlü bir mikrodenetleyicidir ve internete kolayca bağlanmasını sağlar. Projemizin beyni olarak görev yapar, iletişimi yönetir ve LED şeridini kontrol eder.
WS2812 LED şeridi, geniş bir renk yelpazesini görüntülemek için kontrol edilebilen, ayrı ayrı adreslenebilir RGB LED'lerden oluşur. Her LED, tek bir veri hattı kullanılarak açılıp kapatılabilir ve herhangi bir renge ayarlanabilir, bu da onu dinamik aydınlatma efektleri için mükemmel kılar. MQTT broker'ı, farklı istemciler arasındaki iletişimi kolaylaştırarak kullanıcıların LED renklerini kontrol eden konulara yayın yapmasına ve abone olmasına olanak tanır.
Veri Sayfası Detayları
| Üretici | Adafruit |
|---|---|
| Parça numarası | WS2812B |
| Mantık/IO voltajı | 3.5 - 5.5 V |
| Besleme voltajı | 5 V |
| Çıkış akımı (kanal başına) | 20 mA |
| Tepe akımı (kanal başına) | 60 mA |
| PWM frekansı kılavuzu | 400 Hz |
| Giriş mantık eşikleri | 0.2Vcc (düşük), 0.7Vcc (yüksek) |
| Gerilim düşümü / RDS(on) / doyum | 0.5 V |
| Termal sınırlar | Çalışma sıcaklığı: -25 ila 85 °C |
| Paket | Bireysel 5050 SMD |
| Notlar / varyantlar | Çeşitli uzunluklarda ve konfigürasyonlarda mevcuttur |
- Gerilim düşümlerini önlemek için WS2812 şeridi için yeterli güç kaynağı sağlayın.
- ESP32 ile LED şeridi arasında ortak bir toprak kullanın.
- Sinyal bozulmasını önlemek için veri hatlarını kısa tutun.
- Güç kaynağı boyunca voltaj ani yükselmelerini yumuşatmak için bir kapasitör (1000μF) kullanmayı düşünün.
- Sinyal yansımasını önlemek için veri hattında uygun dirençler kullanın.
- LED şeridinin toplam akım çekişine dikkat edin; gerektiğinde harici güç kullanın.
Bağlantı Talimatları
ESP32'yi WS2812 LED şeridiyle bağlamak için güç kaynağını bağlayarak başlayın. LED şeridindeki kırmızı kabloyu 5V güç kaynağına ve siyah kabloyu toprağa bağlayın. Ardından, WS2812 şeridindeki veri hattını (sarı kablo) ESP32 üzerindeki pin 14'e bağlayın. ESP32'nin de LED şeridiyle aynı toprağa bağlı olduğundan emin olun, böylece ortak bir referans korunur.
Güç ve veri bağlantılarını kurduktan sonra, programlama için ESP32'yi bir mikro USB kablosu kullanarak bilgisayarınıza bağlayın. Programlama sırasında bir bağlantı kurmak için ESP32'nin açık olduğundan emin olmanız gerekecektir. Bağlantıları yaptıktan sonra kodu yüklemeye ve kurulumu test etmeye devam edebilirsiniz.

Kod Örnekleri ve Açıklaması
Kod, Wi-Fi ve MQTT işlevselliği için gerekli kütüphaneleri dahil ederek başlar. ssid ve password tanımlayıcıları Wi-Fi kimlik bilgilerinizi saklamak için kullanılırken, mqtt_server MQTT broker'ının adresini tutar.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
Ardından, desteklenen CheerLights renklerini ve bunlara karşılık gelen RGB değerlerini diziler kullanarak tanımlarız. Bu, programın kullanıcı girişine göre renk ayarlarına kolayca erişmesini sağlar.
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" ...};
setup() işlevi seri iletişimi başlatır, Wi-Fi bağlantısını kurar ve MQTT istemcisini hazırlar. Ayrıca LED şeridini başlatır.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Ana döngü sürekli olarak MQTT bağlantısını kontrol eder ve LED renklerini kontrol eden gelen mesajları işler. callback() işlevi, abone olunan konuda bir mesaj alındığında tetiklenir.
Gösterim / Beklentiler
Her şey kurulduktan ve kod yüklendikten sonra, MQTT konusuna mesaj göndererek WS2812 LED'lerinin rengini değiştirebilmelisiniz. Başka bir kullanıcı rengi değiştirirse, bağlı tüm cihazlar değişikliği aynı anda yansıtacaktır. Ters polarite veya hatalı bağlantılar gibi LED'lerin düzgün çalışmasını engelleyebilecek olası sorunlara dikkat edin (videoda mm:ss).
Video Zaman Damgaları
- 00:00 Başlangıç
- 2:00 Giriş
- 3:48 Dokümantasyon sayfası
- 6:33 Bağlantı şeması açıklaması
- 7:35 Arduino Kodu açıklaması
- 15:03 Arduino IDE'de ESP32 kartı ve COMP portu seçimi
- 16:46 CheerLights Gösterimi
/*********
: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();
}
Common Course Links
Common Course Files
Kaynaklar ve referanslar
-
BelgelendirmeESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
Dosyalar📁
Dosya mevcut değil.