ESP32 Eğitimi 54/55 - WS2812 LED Şerit Rengini Wifi Üzerinden Ayarlama | SunFounder'ın ESP32 IoT Öğrenme Kiti
Bu eğitimde, bir ESP32 mikrodenetleyicisi kullanarak Wi-Fi üzerinden WS2812 RGB LED şeridinin rengini nasıl kontrol edeceğimizi öğreneceğiz. Bir renk seçici kullanarak mobil cihazınızdan veya masaüstünüzden farklı renkler seçebilir ve bu bilgiyi LED şeridine gönderebilirsiniz. Bu proje, ESP32'nin yeteneklerini sergileyerek bir web arayüzü aracılığıyla LED aydınlatma ile kesintisiz etkileşim sağlar.
ESP32 mikrodenetleyicisi hem Wi-Fi hem de Bluetooth ile donatılmıştır ve bu da onu IoT uygulamaları için çok yönlü bir seçim haline getirir. Bu projede, LED şeridini kontrol etmek için Wi-Fi işlevselliğine odaklanacağız. Kullanıcılar renkleri dinamik olarak seçebilecek ve görsel olarak ilgi çekici bir deneyim yaratabilecektir. Bu proje hakkında daha fazla netlik için videoyu mutlaka izleyin (videoda 00:00'da).
Donanım Açıklaması
Bu projenin ana bileşenleri ESP32 mikrodenetleyicisi ve WS2812 LED şerididir. ESP32, yerleşik Wi-Fi özelliklerine sahip güçlü bir mikrodenetleyicidir ve kablosuz iletişim ve kontrol sağlar.
WS2812 LED şeridi, ayrı ayrı adreslenebilir RGB LED'lerden oluşur ve her LED'in rengini bağımsız olarak ayarlamanıza olanak tanır. Her LED, tek bir paket içinde bir kontrol devresi ve bir RGB LED içerir; bu da birden fazla LED'in kablolamasını ve kontrolünü basitleştirir.
Veri Sayfası Detayları
| Üretici | Worldsemi |
|---|---|
| Parça numarası | WS2812B |
| Mantık/IO voltajı | 3.5–5.3 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.3 × VDD (düşük), 0.7 × VDD (yüksek) |
| Gerilim düşümü / RDS(on) / doyum | 0.5 V |
| Termal sınırlar | –40 ila +80 °C |
| Paket | 5050 SMD |
| Notlar / varyantlar | Çeşitli uzunluklarda ve konfigürasyonlarda mevcuttur. |
- LED'lere zarar vermemek için doğru 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.
- Stabilite için güç kaynağına bir kapasitör (1000 µF) eklemeyi düşünün.
- Sinyal bütünlüğü için veri hattına bir direnç (470 Ω) kullanın.
Bağlantı Talimatları

ESP32'yi WS2812 LED şeridine bağlamak için bileşenleri şu şekilde bağlayın: İlk olarak, LED şeridinin 5V pinini ESP32'nin 5V çıkışına bağlayın. Ardından, LED şeridinin toprak (GND) pinini ESP32 üzerindeki bir GND pinine bağlayın. Son olarak, LED şeridinin veri pinini (genellikle DI veya Data In olarak etiketlenir) ESP32 üzerindeki GPIO 13 pinine bağlayın. Doğru çalışmayı sağlamak için tüm bağlantıların güvenli olduğundan emin olun.
Videoda alternatif bağlantı yöntemlerinden kısaca bahsedilmiştir, ancak burada açıklanan kurulum optimum performans için önerilen yapılandırmadır (videoda 03:00'da).
Kod Örnekleri ve Açıklama
Kod, WS2812 LED şeridini kontrol etmek ve web sunucusunu kurmak için gerekli kütüphaneleri dahil ederek başlar. LED pini LED_PIN olarak tanımlanır ve şeritteki LED sayısı NUM_LEDS ile ayarlanır.
#define LED_PIN 13 // NeoPixel LED şeridi
#define NUM_LEDS 8 // LED sayısı
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Bu kod parçacığı NeoPixel kütüphanesini başlatır ve LED şeridini belirtilen pin üzerinde kurar. Adafruit_NeoPixel nesnesi olan strip, LED renklerini kontrol etmek için kullanacağınız şeydir.
Ardından kod, Wi-Fi'yi başlatır ve gelen istekleri işlemek için bir web sunucusu kurar. Ağın SSID'si ve şifresi tanımlanarak ESP32'nin Wi-Fi'ye bağlanması sağlanır.
const char *ssid = "sizin_SSID";
const char *password = "sizin_SIFRE";
WebServer server(80);
Bu alıntıda, sizin_SSID ve sizin_SIFRE değerlerini gerçek Wi-Fi kimlik bilgilerinizle değiştirin. Bu bağlantı, ESP32'nin aynı ağdaki cihazlarla iletişim kurmasını sağlayarak LED şeridinin uzaktan kontrolüne olanak tanır.
LED rengini değiştirmek için ana işlev, seçilen RGB değerlerine göre her LED'in rengini ayarlayarak tüm LED'ler üzerinde döngü yapan setColor() işlevidir.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // i. LED'in rengini ayarla
strip.show(); // LED şeridini yeni renklerle güncelle
delay(10); // 10 milisaniye bekle
}
}
Bu işlev, şeritteki her LED'in seçilen renkle güncellenmesini sağlar. Gecikme, LED'lerin rengini sorunsuz bir şekilde değiştirmesine olanak tanır. Web arayüzüyle etkileşime girdikçe, renk seçimlerinizi yansıtmak için bu işlev çağrılacaktır.
Gösterim / Beklentiler
Kurulum tamamlandığında, web arayüzüne ESP32'nin IP adresi üzerinden erişebilmelisiniz. Herhangi bir rengi seçmenize olanak tanıyan bir renk seçici göreceksiniz; seçilen renk LED şeridine gönderilecektir. ESP32 Wi-Fi bağlantısını kaybederse, şerit sorunu belirten bir uyarı rengiyle yanıp sönecektir (videoda 14:30'da).
Yaygın hatalar arasında LED'lerin yanmamasına yol açabilecek hatalı kablolama veya ESP32'nin ağa bağlanmasını engelleyen yanlış SSID/şifre kombinasyonlarının kullanılması yer alır. Bağlantılarınızı ve kimlik bilgilerinizi her zaman iki kez kontrol edin.
Video Zaman Damgaları
- 00:00 Başlangıç
- 2:01 Projeye giriş
- 3:09 Dokümanlar
- 3:47 RGB rengi açıklandı
- 7:47 Kablolama
- 8:40 WIFI ile WS2812 için Arduino kodu açıklandı
- 19:35 Arduino IDE'de ESP32 kartı ve COM portu seçimi
- 21:17 LED Şeridi wifi üzerinden kontrol etme demosu
/*
* Control RGB LED over wifi using ESP32
*
full video instrucions https://youtu.be/J_UFHk_T9aE
📚⬇️ Download and resource page https://robojax.com/RJT687
* Written by Ahmad Shamshiri on Dec 18, 2023
*
* Watch video instruciton for this video:
*
* I have combined DHT library of Adafruit with ESP8266 WebServer both links
* Adafruit DHT library on GitHub: https://github.com/adafruit/DHT-sensor-library
* and
* ESP8266 on GitHub : https://github.com/esp8266/Arduino
*
Copyright (c) 2015, Majenko Technologies
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
* * Neither the name of Majenko Technologies nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <Adafruit_NeoPixel.h> // Include the Adafruit NeoPixel library
#define LED_PIN 13 // NeoPixel LED strip
#define NUM_LEDS 8 // Number of LEDs
// Create an instance of the Adafruit_NeoPixel class
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
//initial color of LED strip
int valueR = 178;//from 0 to 255 for Red
int valueG = 27;//from 0 to 255 for Green
int valueB = 84;//from 0 to 255 for Blue
bool showSerialData = false;
String theColorR, theColorG, theColorB;
String theColor ="ff0000";
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
const char *ssid = "dars";
const char *password = "hhhhhhhhhhh";
WebServer server(80);
void showColorPicker() {
String page = "<!DOCTYPE html>\n";
page +="<html>\n";
page +="<body>\n";
page +="<div style=\"zoom: 300%;\">\n";
page +="<h2>Robojax RGB Color picker</h2>\n";
page +="<p id=\"result\"></p>\n";
page +="<form action=\"/color\">\n";
page +=" <label for=\"favcolor\">Select your favorite color:</label>\n";
page +=" <input type=\"color\" id=\"favcolor\" name=\"favcolor\" value=\"#";
page += theColor;
page +="\"><br><br>\n";
page +=" <input type=\"submit\" value=\"Set Color\" />\n";
page +="</form> \n</div>\n";
page +="</body>\n";
page +="</html>\n";
server.send(200, "text/html", page);
}
//from https://stackoverflow.com/questions/44683071/convert-string-as-hex-to-hexadecimal
uint64_t StrToHex(const char* str)
{
return (uint64_t) strtoull(str, 0, 16);
}
void getColor(){
// server.send(200, "text/plain", message);
if(server.argName(0) == "favcolor")
{
String newColor = String(server.arg(0));//get the GET ardument 0 and convert it to string
theColor = newColor.substring(1);//remove the # sybmot from the begining of color like #B2a48d
theColorR = newColor.substring(1, 3);//extract B2 from #B2a48d for example
theColorG = newColor.substring(3, 5);//extract a4 from #B2a48d for example
theColorB = newColor.substring(5, 7);//extract 8d from #B2a48d for example
valueR = StrToHex(theColorR.c_str());//convert String to HEX for R
valueG = StrToHex(theColorG.c_str());//convert String to HEX for G
valueB = StrToHex(theColorB.c_str());//convert String to HEX for B
if(showSerialData)
{
Serial.print("valueR: ");
Serial.println(valueR);
Serial.print("valueG: ");
Serial.println(valueG);
Serial.print("valueB: ");
Serial.println(valueB );
}
}
showColorPicker();//make sure the color picker is shown
//server.send(200, "text/plain", message);
}
void setColor()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Set the color of the i-th LED to red
strip.show(); // Update the LED strip with the new colors
delay(10); // Wait for 100 milliseconds
}
}//
void noConnection()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 255, 45, 0); // Set the color of the i-th LED to red
strip.show(); // Update the LED strip with the new colors
delay(50); // Wait for 100 milliseconds
}
delay(200);
for (int i = NUM_LEDS-1; i >=0; i--) {
strip.setPixelColor(i, 0, 255, 180); // Set the color of the i-th LED to red
strip.show(); // Update the LED strip with the new colors
delay(50); // Wait for 100 milliseconds
}
}
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
noConnection();
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Open: http://");
Serial.print(WiFi.localIP());
Serial.println(" to read temperature");
if (MDNS.begin("robojaxRGB")) {
Serial.println("MDNS responder started");
}
}
void setup(void) {
Serial.begin(115200);
strip.begin(); // Initialize the NeoPixel strip
strip.show(); // Set initial color to black
setup_wifi();
server.on("/", showColorPicker);//show the main page with color picker
//server.on("/color", setColor);//changes teh color on WS2812 RGB LED
server.on("/color", HTTP_GET, getColor);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
//Robojax.com
while (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
server.handleClient();
//showColorPicker();
setColor();
delay(300);// change this to larger value (1000 or more) if you don't need very often reading
// Robojax.com code for ESP32 and DHT11 DHT22
}
Common Course Links
Common Course Files
Kaynaklar ve referanslar
Henüz kaynak yok.
Dosyalar📁
Dosya mevcut değil.