Search Code

ESP32 Eğitimi 50/55 - RGB LED'i dünyanın her yerinden kontrol edin | SunFounder'ın ESP32 kiti

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-50-RGB-led-mqtt-main

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ı

esp32-50-RGB-led
esp32-50-RGB-led

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.

ES32-38_RGB_LED-wiring

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ı

ES32-38_RGB_LED-wiring

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

Görseller

ESP32_rgb_pin
ESP32_rgb_pin
ESP32_RGB_led_wires
ESP32_RGB_led_wires
ES32-38_RGB_LED-wiring
ES32-38_RGB_LED-wiring
esp32-50-RGB-led
esp32-50-RGB-led
esp32-50-RGB-led-mqtt-main
esp32-50-RGB-led-mqtt-main
852-ESP32 Tutorial 50/55- Arduino code to control RGB LED using MQTT service of Adafruit
Dil: C++
/***********************************************************************
 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!");
}

İhtiyacın olabileceğini düşünüyor

Kaynaklar ve referanslar

Henüz kaynak yok.

Dosyalar📁

Veri Sayfası (pdf)