ESP32 Eğitimi 50/55 - RGB LED'i dünyanın her yerinden kontrol edin | SunFounder'ın ESP32 kiti
Bu eğitimde, MQTT protokolünü ve Adafruit IO hizmetini kullanarak Wi-Fi üzerinden ESP32 mikrodenetleyicisini kullanarak bir RGB LED'in rengini nasıl kontrol edeceğimizi öğreneceğiz. Bu kurulum, dünyanın her yerinden RGB LED'in rengini değiştirmenize olanak tanıyarak IoT teknolojisinin pratik bir uygulamasını sağlar. Ayrıca, istenen rengi seçmek için kaydırıcıları ve bir renk seçiciyi nasıl kullanacağımızı da keşfedeceğiz.

ESP32, yerleşik Wi-Fi ve Bluetooth özelliklerine sahip güçlü bir mikrodenetleyicidir ve bu da onu IoT projeleri için ideal kılar. Bu yapımda, ESP32'ye bir RGB LED bağlayacağız ve rengini Adafruit tarafından sağlanan bir MQTT broker aracılığıyla kontrol edeceğiz. Eğitim, donanım kurulumu, bağlantı talimatları ve her şeyin sorunsuz çalışmasını sağlamak için gerekli kod konusunda size rehberlik edecektir (videoda 00:00'da).
Donanım Açıklaması
Bu proje için kullanacağımız ana bileşenler ESP32 mikrodenetleyicisi ve RGB LED'dir. ESP32, Wi-Fi ağlarına bağlanabilme özelliğine sahiptir ve bu da Adafruit IO hizmetiyle iletişim kurmasını sağlar. RGB LED, geniş bir renk yelpazesi oluşturmak için karıştırılabilen üç ayrı LED (kırmızı, yeşil ve mavi) içerir.
RGB LED, ortak anot veya ortak katot prensibiyle çalışır; bu, tek tek LED'lerin anotunun (pozitif) veya katodunun (negatif) çalışmaları için doğru şekilde bağlanması gerektiği anlamına gelir. Her renk, görev döngüsünü değiştirerek her LED'in parlaklığını ayarlayan Darbe Genişliği Modülasyonu (PWM) kullanılarak kontrol edilebilir.
Veri Sayfası Detayları
| Üretici | SunFounder |
|---|---|
| Parça numarası | RGB LED |
| İletim voltajı (VF) | 2.0–3.4 V |
| İletim akımı (IF) | 20 mA |
| Tepe dalga boyu (nm) | Kırmızı: 620, Yeşil: 525, Mavi: 465 |
| Paket | Standart 4 pinli |
| Notlar / varyantlar | Ortak anot veya ortak katot seçenekleri mevcuttur |
- Akımı sınırlamak için her LED rengi için 220 ohm direnç kullanın.
- Ortak anot veya katot yapılandırması için doğru bağlantıyı sağlayın.
- Kesintileri önlemek için ESP32'nin güç kaynağını kontrol edin.
- Pürüzsüz renk geçişleri için PWM frekansını sınırlar içinde tutun.
- Adafruit IO hizmetine bağlanmak için Wi-Fi kimlik bilgilerinin doğru olduğundan emin olun.
Bağlantı Talimatları

RGB LED'i ESP32'ye bağlamak için önce RGB LED üzerindeki pinleri tanımlayarak başlayın. En uzun pin ortak pindir. Ortak anot yapılandırması için bu pini pozitif voltaj kaynağına (3.3V) bağlayın. Diğer üç pin kırmızı, yeşil ve mavi LED'lere karşılık gelir. Kırmızı pini GPIO 27'ye, yeşil pini GPIO 26'ya ve mavi pini GPIO 25'e bağlayın. Bu bağlantıların her biri, LED'lerden geçen akımı sınırlamak için 220 ohm'luk bir direnç üzerinden yapılmalıdır.
Ardından, ESP32'nin toprağını (GND) devrenizin toprak hattına bağlayın. Gevşek bağlantıları önlemek için kablolamanın güvenli olduğundan emin olun. Ortak katotlu bir RGB LED kullanıyorsanız, ortak pini toprağa bağlayın ve tek tek renk pinlerini dirençler üzerinden pozitif kaynağa bağlayın. Devreye güç vermeden önce tüm bağlantıları tekrar kontrol edin.
Kod Örnekleri ve Açıklama
Arduino kodunda, kırmızı, yeşil ve mavi LED'ler için pinleri redPin, greenPin ve bluePin tanımlayıcılarını kullanarak tanımlayarak başlıyoruz. Ayrıca, her renk için PWM kanallarını redChannel, greenChannel ve blueChannel kullanarak tanımlıyoruz. PWM frekansı 8 bit çözünürlükle 5000 Hz olarak ayarlanmıştır.
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
setup() fonksiyonunda, PWM kanallarını başlatıyor ve ilgili pinleri bağlıyoruz. Ayrıca, tanımlanan kimlik bilgilerini kullanarak Wi-Fi ağına bağlanıyor ve Adafruit IO ile iletişim için MQTT istemcisini kuruyoruz.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Wi-Fi'ye bağlan
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Ana döngü MQTT bağlantısını kontrol eder ve gelen mesajları işler. Ayrıca mevcut RGB değerlerini seri monitöre yazdırır. LED'in rengi, MQTT abonelikleri aracılığıyla alınan değerlere göre güncellenir.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Tam kod hakkında daha fazla ayrıntı için lütfen makalenin altında yüklenen eksiksiz koda bakın.
Gösterim / Beklentiler
Her şey kurulduktan ve kod yüklendikten sonra, RGB LED'in Adafruit IO paneli üzerinden yapılan renk değişikliklerine tepki verdiğini görmelisiniz. Kırmızı, yeşil ve mavi için kaydırıcıları ayarladıkça, LED buna göre rengini değiştirmelidir. Herhangi bir sorunla karşılaşırsanız, Wi-Fi bağlantısının stabil olduğundan ve MQTT konu adlarının kodda tanımlananlarla (videoda 17:30'da) eşleştiğinden emin olun.
Yaygın hatalar arasında yanlış kablo bağlantısı, uyumsuz konu adları ve doğru Wi-Fi kimlik bilgilerini ayarlamayı unutmak yer alır. LED yanmazsa, direnç bağlantılarını tekrar kontrol edin ve ESP32'nin doğru şekilde güç aldığından emin olun.
Video Zaman Damgaları
- 00:00 Başlangıç
- 2:23 Projeye giriş
- 4:43 MQTT nedir
- 7:55 Adafruit IO kurulumu
- 14:09 Kablo bağlantısı açıklandı
- 16:07 Kod açıklandı
- 27:03 Arduino IDE'de ESP32 kartı ve COM portu seçimi
- 29:12 Proje gösterimi
- 31:25 RGB LED nedir?
- 35:26 RGB Renk
/***********************************************************************
This is Arduino sketch for ESP32 to control RGB LED using MQTT service of Adafruit
video instruction https://youtu.be/-9q1GfGsnr0
📚⬇️ Download and resource page https://robojax.com/RJT672
Written By Ahamd Shamshiri
on Feb 18, 2024
Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
// Define RGB LED pins
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
// Define PWM channels
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
// Define PWM frequency and resolution
const int freq = 5000;
const int resolution = 8;
int colorR, colorG, colorB;
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "Book"
#define WLAN_PASS "888-888"
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
// Using port 8883 for MQTTS
#define AIO_SERVERPORT 8883
// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
// #define AIO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"
// #define AIO_KEY "YOUR_ADAFRUIT_IO_KEY"
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_NBQQ75Rn7liRNcRn5uGUBMsBYmjD"
/************ Global State (you don't need to change this!) ******************/
// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// io.adafruit.com root CA
const char* adafruitio_root_ca = \
"-----BEGIN CERTIFICATE-----\n"
"MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
"MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
"b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
"DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
"yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
"gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
"DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
"fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
"6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
"PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
"IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
"AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
"BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
"HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
"b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
"HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
"AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
"c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
"ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
"jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
"TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
"7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
"-----END CERTIFICATE-----\n";
/****************************** Feeds ***************************************/
// Setup a feed called 'test' for publishing and 'test2' for subscription.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe COLOR_R = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rgb-led-color.red");
Adafruit_MQTT_Subscribe COLOR_G = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rgb-led-color.green");
Adafruit_MQTT_Subscribe COLOR_B = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rgb-led-color.blue");
Adafruit_MQTT_Subscribe COLOR_RGB = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/color-picker");
/*************************** Sketch Code ************************************/
void setup() {
// Set up PWM channels
ledcSetup(redChannel, freq, resolution);
ledcSetup(greenChannel, freq, resolution);
ledcSetup(blueChannel, freq, resolution);
// Attach pins to corresponding PWM channels
ledcAttachPin(redPin, redChannel);
ledcAttachPin(greenPin, greenChannel);
ledcAttachPin(bluePin, blueChannel);
Serial.begin(115200);
delay(10);
Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));
// Connect to WiFi access point.
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
delay(1000);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set Adafruit IO's root CA
client.setCACert(adafruitio_root_ca);
// register callback for feed
COLOR_R.setCallback(color_R_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_R);
// register callback for feed
COLOR_G.setCallback(color_G_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_G);
// register callback for feed
COLOR_B.setCallback(color_B_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_B);
// register callback for feed
COLOR_RGB.setCallback(color_RGB_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_RGB);
}
// uint32_t x=0;
void loop() {
// Ensure the connection to the MQTT server is alive (this will make the first
// connection and automatically reconnect when disconnected). See the MQTT_connect
// function definition further below.
MQTT_connect();
Serial.print("R: ");
Serial.print (colorR);
Serial.print(" G: ");
Serial.print (colorG);
Serial.print(" B: ");
Serial.println(colorB);
// wait 0.5 seconds for subscription messages
mqtt.processPackets(500);
setColor();
// wait a couple seconds to avoid rate limit
//delay(2000);
}
void color_R_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
colorR = inString.toInt();//convert the message to Integer
if(colorR >255 || colorR < 0)
{
colorR = 0;
}
}
void color_G_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
colorG = inString.toInt();//convert the message to Integer
if(colorG >255 || colorG < 0)
{
colorG = 0;
}
}
void color_B_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
colorB = inString.toInt();//convert the message to Integer
if(colorB >255 || colorB < 0)
{
colorB = 0;
}
}
void color_RGB_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String newColor = String( message);//
if(newColor.length() == 7)
{
String theColorR = newColor.substring(1, 3);//extract B2 from #B2a48d for example
String theColorG = newColor.substring(3, 5);//extract a4 from #B2a48d for example
String theColorB = newColor.substring(5, 7);//extract 8d from #B2a48d for example
colorR = StrToHex(theColorR.c_str());//convert String to HEX for R
colorG = StrToHex(theColorG.c_str());//convert String to HEX for G
colorB = StrToHex(theColorB.c_str());//convert String to HEX for B
}
}
//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 setColor() {
// For common-anode RGB LEDs, use 255 minus the color value
ledcWrite(redChannel, colorR);
ledcWrite(greenChannel, colorG);
ledcWrite(blueChannel, colorB);
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1)
;
}
}
Serial.println("MQTT Connected!");
}
Common Course Links
Common Course Files
İhtiyacın olabileceğini düşünüyor
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Kaynaklar ve referanslar
Henüz kaynak yok.
Dosyalar📁
Veri Sayfası (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB