ESP32 ve Arduino

ESP32-C6 MQTT Eğitimi: Arduino ile Wi-Fi 6 Karttan Bulut Broker'a

Bir ESP32-C6'yı Arduino core 3.x ile broker.connectmq.com'a veri yayınlar hale getirin, RGB LED'ini komut satırından kontrol edin ve çift çekirdekli klasik ESP32'den farklarını anlayın.

Bir esp32-c6 mqtt eğitiminde bulut broker'a bağlı, RGB LED'i yanan ESP32-C6 DevKitC-1 kartı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Bu ESP32-C6 MQTT eğitimi, bir C6 kartını yaklaşık on beş dakikada telemetri yayınlar ve komut alır hale getirir. Doğru Arduino core'u kuracak, çipin dahili sıcaklığını broker.connectmq.com'a yayınlayacak, kart üzerindeki RGB LED'i dizüstü bilgisayarınızdan kontrol edecek ve klasik ESP32'den gelen hangi alışkanlıkların artık geçerli olmadığını öğreneceksiniz.

ESP32-C6'yı Farklı Kılan Nedir

ESP32-C6 yalnızca daha yeni bir ESP32 değildir. Farklı bir CPU mimarisi ve farklı bir radyo seti kullanır ve bu değişikliklerin bazıları Arduino sketch'lerinde hemen kendini gösterir.

Özellik Klasik ESP32 ESP32-C6
CPU Çift çekirdekli Xtensa LX6, 240 MHz'e kadar Tek çekirdekli RISC-V, 160 MHz'e kadar, artı düşük güçlü bir RISC-V çekirdek
Wi-Fi 802.11 b/g/n, 2,4 GHz 802.11ax (Wi-Fi 6), yalnızca 2,4 GHz
Bluetooth Classic ve BLE 4.2 Yalnızca BLE 5, Classic yok
802.15.4 Yok Var (Thread, Zigbee)
Arduino core 2.x ve 3.x Yalnızca 3.x
USB Harici USB-UART çipi Çoğu DevKit'te yerel USB Serial/JTAG artı UART
Kart üzerindeki LED (DevKitC-1) Genellikle GPIO 2'de düz bir LED GPIO 8'de adreslenebilir RGB LED

MQTT açısından pratik sonuçları şunlardır:

  • Arduino core 3.x gerekir. C6, 2.x kart paketlerinde mevcut değildir.
  • Yalnızca bir uygulama çekirdeği vardır. Görevleri core 1'e sabitleyen her kod core 0'a göre değiştirilmelidir.
  • Seri çıktı farklı bir portta görünebilir. Hiçbir şey yazdırılmıyorsa "USB CDC On Boot" seçeneğini etkinleştirin veya UART portuna takın.
  • Wi-Fi 6 isteğe bağlıdır, zorunlu değildir. C6 sıradan 802.11n erişim noktalarına da bağlanır. Yine de 5 GHz ağları göremez.

MQTT protokolünün kendisi bunların hiçbirini umursamaz. Bir ESP32'de çalışan aynı PubSubClient kodu bir C6'da da çalışır; bu yüzden bu eğitim insanları zorlayan kurulum ayrıntılarına odaklanır.

Ön Koşullar

  • Bir ESP32-C6 kartı. Adımlar Espressif ESP32-C6-DevKitC-1 varsayılarak yazılmıştır; diğer C6 kartları küçük pin değişiklikleriyle çalışır.
  • Arduino IDE 2.x.
  • Boards Manager'dan Espressif Systems'in esp32 kart paketi, sürüm 3.0 veya üzeri.
  • Library Manager'dan Nick O'Leary'nin PubSubClient kütüphanesi.
  • Bilgisayarınızda Mosquitto komut satırı istemcileri.

Arduino'yu ESP32-C6 İçin Hazırlamak

  1. Boards Manager'ı açın, esp32 arayın ve Espressif paketini bir 3.x sürümüne kurun veya güncelleyin.
  2. Tools > Board > esp32 > ESP32C6 Dev Module seçin.
  3. En basit deneyim için DevKitC-1 üzerinde UART etiketli USB-C portunu bağlayın. USB etiketli portu kullanıyorsanız Serial'ın yerel USB'ye eşlenmesi için Tools > USB CDC On Boot > Enabled ayarını yapın.
  4. Eşleşen COM portunu seçin ve araç zincirinin çalıştığını doğrulamak için bir kez boş bir sketch yükleyin.

Yükleme bağlantı zaman aşımıyla başarısız olursa BOOT tuşunu basılı tutun, RESET tuşuna dokunun, BOOT tuşunu bırakın ve tekrar deneyin. Bu, ROM bootloader'ını zorla başlatır.

ESP32-C6 MQTT Sketch'i

Sketch, dahili sıcaklık sensörü okumasını, Wi-Fi sinyal gücünü ve boş heap miktarını her on saniyede bir yayınlar, bir LED komut topic'ine subscribe olur ve LED durumunu retained bir mesaj olarak bildirir.

#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID     = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST     = "broker.connectmq.com";
const uint16_t MQTT_PORT  = 1883;
const char* PREFIX        = "connectmq/demo/c6x41z";   // kendi rastgele kimliğinizle değiştirin

WiFiClient   net;
PubSubClient mqtt(net);
String clientId;
String topicTelemetry, topicLedSet, topicLedState, topicStatus;
unsigned long lastPublish = 0;
uint8_t ledR = 0, ledG = 0, ledB = 0;

void setLed(uint8_t r, uint8_t g, uint8_t b) {
  ledR = r; ledG = g; ledB = b;
  rgbLedWrite(RGB_BUILTIN, r, g, b);   // Arduino core 3.x API'si
  char state[40];
  snprintf(state, sizeof(state), "{\"r\":%u,\"g\":%u,\"b\":%u}", r, g, b);
  mqtt.publish(topicLedState.c_str(), state, true);
}

void onMessage(char* topic, byte* payload, unsigned int length) {
  String msg;
  for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
  msg.trim();
  msg.toUpperCase();
  Serial.printf("Command on %s: %s\n", topic, msg.c_str());

  if (msg == "OFF")        setLed(0, 0, 0);
  else if (msg == "RED")   setLed(40, 0, 0);
  else if (msg == "GREEN") setLed(0, 40, 0);
  else if (msg == "BLUE")  setLed(0, 0, 40);
  else if (msg == "WHITE") setLed(30, 30, 30);
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nIP %s, RSSI %d dBm\n", WiFi.localIP().toString().c_str(), WiFi.RSSI());
}

void connectMqtt() {
  while (!mqtt.connected()) {
    Serial.print("Connecting to MQTT... ");
    if (mqtt.connect(clientId.c_str(), topicStatus.c_str(), 1, true, "offline")) {
      Serial.println("connected");
      mqtt.publish(topicStatus.c_str(), "online", true);
      mqtt.subscribe(topicLedSet.c_str(), 1);
    } else {
      Serial.printf("failed, state %d, retrying in 5 s\n", mqtt.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  delay(500);

  clientId       = "esp32c6-" + String((uint32_t)ESP.getEfuseMac(), HEX);
  topicTelemetry = String(PREFIX) + "/telemetry";
  topicLedSet    = String(PREFIX) + "/led/set";
  topicLedState  = String(PREFIX) + "/led/state";
  topicStatus    = String(PREFIX) + "/status";

  connectWifi();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setCallback(onMessage);
  mqtt.setBufferSize(512);
  connectMqtt();
  setLed(0, 0, 0);
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) connectWifi();
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();

  if (millis() - lastPublish >= 10000) {
    lastPublish = millis();
    char payload[160];
    snprintf(payload, sizeof(payload),
             "{\"chipTemp\":%.1f,\"rssi\":%d,\"freeHeap\":%lu,\"uptime\":%lu}",
             temperatureRead(), WiFi.RSSI(),
             (unsigned long)ESP.getFreeHeap(), millis() / 1000);
    mqtt.publish(topicTelemetry.c_str(), payload);
    Serial.println(payload);
  }
}

Dahili sıcaklık sensörü odayı değil çip kalıbını ölçer; bu yüzden ortam sıcaklığından birkaç derece yüksek değerler bekleyin. Bir sağlık sinyali ve kablo gerektirmeyen bir demo değeri olarak işe yarar.

ESP32-C6 MQTT Mesajlarını Test Etmek

Bir terminal açın ve önekinizin altındaki her şeye subscribe olun:

mosquitto_sub -h broker.connectmq.com -p 1883 -i c6-viewer-x41z -t "connectmq/demo/c6x41z/#" -v

status online mesajını, retained LED durumunu ve her on saniyede bir telemetri mesajını görmelisiniz. İkinci bir terminalde bir komut gönderin:

mosquitto_pub -h broker.connectmq.com -p 1883 -i c6-cmd-x41z -t "connectmq/demo/c6x41z/led/set" -m "green" -q 1

RGB LED yeşile döner ve yeni bir retained durum görünür. Durum retained olduğu için sonradan subscribe olan her istemci mevcut rengi anında öğrenir. ConnectMQ'nun herkese açık alanı hesap gerektirmez ancak herkes tarafından görülebilir; bu yüzden demo verileriyle sınırlı kalın. Herkese açık MQTT test broker'ı sayfası, istemci başına saniyede 10 mesaj dahil olmak üzere sınırlarını açıklar.

Klasik ESP32 Kodunu C6'ya Taşımak

Çoğu sketch değişiklik olmadan derlenir. En çok ihtiyaç duyacağınız düzenlemeler şunlardır:

  1. Görev sabitleme. xTaskCreatePinnedToCore(..., 1) ifadesini core 0 ile değiştirin veya xTaskCreate çağırın. ESP32 FreeRTOS MQTT rehberi, bu tek değişiklikle her iki çip ailesinde de çalışan bir görev düzeni gösterir.
  2. LED pinleri. digitalWrite(2, HIGH) bir DevKitC-1'de hiçbir şeyi yakmaz. rgbLedWrite(RGB_BUILTIN, r, g, b) kullanın.
  3. ADC pinleri. C6'da GPIO 0 ile 6 arasında tek bir ADC bulunur. Klasik ESP32 örneklerindeki 34 veya 36 gibi pin numaraları mevcut değildir.
  4. Kullanımdan kaldırılmış API'ler. Core 3.x birçok fonksiyonu yeniden adlandırdı veya kaldırdı; örneğin neopixelWrite rgbLedWrite oldu ve LEDC PWM API'si ledcAttach olarak değişti. Derleyici hatalarını Arduino-ESP32 belgelerindeki geçiş notlarıyla karşılaştırın.
  5. Bluetooth Classic. BluetoothSerial desteklenmez. Bunun yerine BLE kullanın.

PlatformIO ile derliyorsanız platformu, C6 için Arduino core 3.x içeren bir sürüme ayarlayın; PlatformIO MQTT kurulumu tekrarlanabilir bir proje dosyasını adım adım anlatır.

Sorun Giderme

  • mqtt.state() -2 döndürüyor. TCP bağlantısı başarısız oldu. Kartın gerçekten bir IP adresi aldığını ve ağınızın dışa giden 1883 portuna izin verdiğini kontrol edin. Bazı misafir ağları bunu engeller; bunun yerine TLS ile 8883 portunu deneyin.
  • mqtt.state() 2 döndürüyor. Broker client ID'yi reddetti. Herkese açık alanda client ID boş olmamalı ve benzersiz olmalıdır; eFuse MAC soneki bunu sağlar.
  • Bağlanıyor, sonra birkaç saniyede bir kopuyor. İki cihaz aynı client ID'yi kullanıyor ve her yeni bağlantı diğerini düşürüyor. Bu genellikle koda gömülü aynı ID'yi iki karta yüklediğinizde olur.
  • Wi-Fi, Wi-Fi 6 modeme hiç bağlanmıyor. 2,4 GHz bandının etkin olduğundan ve istemcileri yalnızca 5 GHz'e yönlendiren bir band-steering ayarının arkasında gizlenmediğinden emin olun. Yalnızca WPA3 kullanan ağlar da sorun çıkarabilir; WPA2/WPA3 karma modunu deneyin.
  • Seri çıktı yok. USB CDC On Boot ayarını değiştirin veya UART portuna geçin.

Bulut Broker ile Production'a Geçiş

Gerçek cihazlar için kimlik bilgileriyle birlikte 8883 portunda TLS'e geçin. app.connectmq.com adresinde bir broker oluşturun ve otomatik oluşturduğu kullanıcı adını, parolayı ve client ID'yi kopyalayın. WiFiClient yerine WiFiClientSecure kullanın, ISRG Root X1 sertifikasını net.setCACert(...) ile yükleyin, portu 8883 yapın ve kimlik bilgilerini mqtt.connect("YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_PASSWORD", ...) çağrısına geçirin. C6, TLS el sıkışmasını rahatça halleder; ancak bu, 240 MHz'lik klasik bir ESP32'ye göre biraz daha uzun sürer.

Bundan sonra portaldaki canlı topic gezgini C6 mesajlarınızı geldikleri anda gösterir; ISA-95 tarzı topic adları kullanıyorsanız cihazlar görünümü kartları tesis ve hatta göre gruplar. Broker'lar konusunda genel olarak yeniyseniz bir MQTT broker'ın ne yaptığı kısa bir giriş sunar; ESP32 IoT eğitimi ise bu serideki tüm projeleri listeler.

ESP32-C6 Filonuzu ConnectMQ Üzerinde Çalıştırın

ESP32-C6 yeni tasarımlar için güçlü bir seçimdir: Wi-Fi 6 verimliliği, BLE 5 ve modern bir araç zinciri. Onu işletmek zorunda olmadığınız bir bulut MQTT broker ile eşleştirin. ConnectMQ size 8883 portunda TLS, MQTT 3.1.1 ve 5.0 ile kredi kartı gerektirmeyen ücretsiz bir Serverless planı sunar; böylece herkese açık demo alanından kimliği doğrulanmış cihazlara dakikalar içinde geçebilirsiniz. C6'da MQTT 5 özelliklerini (properties) kullanmak istiyorsanız doğru yol ESP-IDF'tir; MQTT 5 ile esp-mqtt yazısına göz atın.

Sık Sorulan Sorular

ESP32-C6, Wi-Fi 6 üzerinden MQTT'yi destekliyor mu?

Evet. MQTT TCP üzerinde çalışır; bu yüzden 2,4 GHz'de 802.11ax dahil C6'nın desteklediği her Wi-Fi standardında çalışır. Wi-Fi 6 esas olarak güç verimliliğine ve kalabalık ağlara yardımcı olur.

Bir MQTT broker'a ulaşmak için C6'da Thread veya Zigbee kullanabilir miyim?

C6 radyosu 802.15.4'ü destekler, ancak MQTT broker'a giden bir IP yoluna ihtiyaç duyar. Bir Thread ağı bir border router gerektirir; Zigbee cihazları ise genellikle MQTT'ye çeviri yapan bir gateway'e ihtiyaç duyar.

Eski ESP32 sketch'im neden C6 için derlenmiyor?

C6, birçok API'yi değiştiren Arduino core 3.x'i gerektirir ve Bluetooth Classic ile ikinci çekirdekten yoksundur. Yeniden adlandırılan fonksiyonları güncelleyin ve core 1 sabitlemesini kaldırın.

Dahili sıcaklık sensörü oda sıcaklığı için yeterince doğru mu?

Hayır. Çip kalıbını ölçer ve odadan daha sıcak çalışır. Ortam ölçümleri için DHT22 veya BME280 gibi harici bir sensör kullanın.

İlgili yazılar

ESP32 NTP MQTT Zaman Damgası: Her Mesaja Doğru Zaman Ekleyin

ESP32 saatini NTP ile eşitleyin, ISO 8601 ve epoch milisaniye zaman damgalarını biçimlendirin ve bunları MQTT payload'larına ekleyin; böylece ölçümler geç yayınlansa bile gerçek alınma zamanlarını korur.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.