Arduino UNO R4 WiFi, tanıdık UNO form faktörüne Wi-Fi getirir; bu da onu bir Arduino UNO R4 WiFi MQTT projesi için harika bir ilk kart yapar. Bu eğitimde WiFiS3 kütüphanesini ve resmi ArduinoMqttClient'ı kullanarak analog sensör okumaları yayınlayacak, dahili LED matrisinde çizim yapan komutlar alacak ve ardından kendi kimlik bilgilerinizle şifreli bir TLS bağlantısına geçeceksiniz.
UNO R4 WiFi Ağ ile Nasıl Konuşur?
UNO R4 WiFi'de iki çip bulunur. Ana mikrodenetleyici, sketch'inizi çalıştıran bir Renesas RA4M1'dir. Ağ işlemleri ise Wi-Fi yardımcı işlemcisi görevi gören bir ESP32-S3 modülü tarafından yürütülür. Sketch'iniz onunla, "Arduino UNO R4 Boards" paketiyle gelen WiFiS3 kütüphanesi üzerinden konuşur.
Bu ayrımın iki pratik sonucu vardır:
- TLS el sıkışması, yaygın kök sertifikalardan oluşan bir paketle gelen ESP32-S3 modülünde çalışır. Let's Encrypt gibi yaygın olarak güvenilen sertifikalara sahip broker'lara şifreli bağlantılar, genellikle hiçbir sertifika yapıştırmadan
WiFiSSLClientile çalışır. - Yardımcı işlemcinin kendi firmware'i vardır. Bağlantılar tuhaf davranırsa, bu firmware'i güncellemek denenecek ilk çözümlerden biridir.
MQTT protokolünün kendisi için Arduino tarafından geliştirilen resmi kütüphane olan ArduinoMqttClient'ı kullanacaksınız. WiFiS3'teki WiFiClient ve WiFiSSLClient dahil herhangi bir Client nesnesiyle çalışır.
Neye İhtiyacınız Var?
| Öğe | Notlar |
|---|---|
| Arduino UNO R4 WiFi | Telsizi olmayan UNO R4 Minima değil |
| Arduino IDE 2.x | Boards Manager üzerinden "Arduino UNO R4 Boards" kurulu olarak |
| ArduinoMqttClient | Library Manager'dan kurun |
| Bir potansiyometre veya herhangi bir analog sensör | A0'a bağlı (isteğe bağlı, kod boşta kalan bir pinle de çalışır) |
| Mosquitto CLI araçları | Bilgisayarınızdan test için |
| 2,4 GHz bir Wi-Fi ağı | Modül 5 GHz ağlara katılmaz |
Başlamadan önce File → Examples → WiFiS3 → CheckFirmwareVersion örneğini açın ve yükleyin. Seri monitör güncel olmayan bir firmware bildirirse, Arduino IDE'deki firmware güncelleyiciyle (Tools → Firmware Updater) veya docs.arduino.cc üzerindeki resmi talimatlarla güncelleyin.
Adım 1: Herkese Açık Broker'a Yayınlayın
İlk sürüm, ConnectMQ tarafından sağlanan herkese açık MQTT test broker'ı broker.connectmq.com adresine 1883 portunda şifrelemesiz bağlanır. Client ID boş olmadığı sürece anonim bağlantılar kabul edilir. Benzersiz bir topic öneki kullanın ve özel veri göndermeyin, çünkü herkes herkese açık alana abone olabilir.
Sketch'te arduino_secrets.h adında ikinci bir sekme oluşturun:
#define SECRET_SSID "YOUR_WIFI"
#define SECRET_PASS "YOUR_WIFI_PASSWORD"
Ardından ana sketch:
#include <WiFiS3.h>
#include <ArduinoMqttClient.h>
#include "Arduino_LED_Matrix.h"
#include "arduino_secrets.h"
const char broker[] = "broker.connectmq.com";
const int port = 1883;
const char deviceId[] = "unor4-8d21f0"; // bunu benzersiz yapın
const char topicTelemetry[] = "connectmq/demo/unor4-8d21f0/telemetry";
const char topicCommand[] = "connectmq/demo/unor4-8d21f0/matrix/set";
const char topicStatus[] = "connectmq/demo/unor4-8d21f0/status";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
ArduinoLEDMatrix matrix;
unsigned long lastPublish = 0;
// 12x8 matris için iki basit kare
const uint32_t FRAME_ON[] = { 0xffffffff, 0xffffffff, 0xffffffff };
const uint32_t FRAME_OFF[] = { 0x00000000, 0x00000000, 0x00000000 };
void connectWifi() {
Serial.print("Connecting to ");
Serial.println(SECRET_SSID);
while (WiFi.begin(SECRET_SSID, SECRET_PASS) != WL_CONNECTED) {
Serial.print(".");
delay(3000);
}
// WiFiS3 kısa süreliğine 0.0.0.0 bildirebilir, gerçek bir adres bekleyin
while (WiFi.localIP() == IPAddress(0, 0, 0, 0)) delay(200);
Serial.print("\nIP address: ");
Serial.println(WiFi.localIP());
}
void onMqttMessage(int messageSize) {
String topic = mqttClient.messageTopic();
String payload;
while (mqttClient.available()) {
payload += (char)mqttClient.read();
}
Serial.print("Received on ");
Serial.print(topic);
Serial.print(": ");
Serial.println(payload);
if (payload == "ON") matrix.loadFrame(FRAME_ON);
if (payload == "OFF") matrix.loadFrame(FRAME_OFF);
}
bool connectMqtt() {
mqttClient.setId(deviceId);
mqttClient.setKeepAliveInterval(30 * 1000L); // milisaniye
// Last Will, connect() öncesinde ayarlanmalı
mqttClient.beginWill(topicStatus, true, 1);
mqttClient.print("offline");
mqttClient.endWill();
Serial.print("Connecting to MQTT broker... ");
if (!mqttClient.connect(broker, port)) {
Serial.print("failed, error = ");
Serial.println(mqttClient.connectError());
return false;
}
Serial.println("connected");
mqttClient.onMessage(onMqttMessage);
mqttClient.subscribe(topicCommand, 1);
mqttClient.beginMessage(topicStatus, true, 1); // retained, QoS 1
mqttClient.print("online");
mqttClient.endMessage();
return true;
}
void setup() {
Serial.begin(115200);
while (!Serial && millis() < 3000) {}
matrix.begin();
connectWifi();
while (!connectMqtt()) delay(5000);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) connectWifi();
if (!mqttClient.connected()) {
delay(5000);
connectMqtt();
return;
}
mqttClient.poll(); // keep alive ping'lerini gönderir ve mesajları iletir
if (millis() - lastPublish > 5000) {
lastPublish = millis();
int raw = analogRead(A0);
mqttClient.beginMessage(topicTelemetry);
mqttClient.print("{\"a0\":");
mqttClient.print(raw);
mqttClient.print(",\"rssi\":");
mqttClient.print(WiFi.RSSI());
mqttClient.print(",\"uptime\":");
mqttClient.print(millis() / 1000);
mqttClient.print("}");
mqttClient.endMessage();
}
}
Mesajları izleyin ve bilgisayarınızdan matris üzerinde çizim yapın:
mosquitto_sub -h broker.connectmq.com -p 1883 -i pc-8d21f0 -t "connectmq/demo/unor4-8d21f0/#" -v
mosquitto_pub -h broker.connectmq.com -p 1883 -i ctl-8d21f0 -t "connectmq/demo/unor4-8d21f0/matrix/set" -m ON
Potansiyometreyi çevirin; a0 değeri beş saniye içinde değişikliği takip etmelidir.
ArduinoMqttClient'ın PubSubClient'tan Farkları
Daha önce PubSubClient kullandıysanız üç şey farklı gelecektir:
- Mesajlar akış (stream) olarak gönderilir.
beginMessage(),print()veendMessage(), büyük bir string buffer'ı olmadan payload'u parça parça oluşturmanıza olanak tanır. Bu, UNO R4'ün RAM'ine çok iyi uyar. - Gelen mesajlar bir akış gibi okunur.
onMessagecallback'i yalnızca boyutu alır;messageTopic()çağırırsınız, ardındanavailable()sıfır döndürene kadarread()çağırırsınız. - QoS 1 ve 2 ile yayınlama desteklenir; retained message'lar ve
beginWill()/endWill()ile oluşturulan bir Last Will de desteklenir.
PubSubClient'ta loop() çağırdığınız gibi poll() fonksiyonunu da düzenli olarak çağırmanız gerekir. loop() içindeki uzun delay() çağrıları keep alive ping'lerini ve gelen mesajları geciktirir. ArduinoMqttClient kütüphane rehberimiz, her connectError() değerinin anlamı dahil tüm API'yi kapsar.
Adım 2: TLS Üzerinden Arduino UNO R4 WiFi MQTT
Denemelerin ötesindeki her şey için kimlik bilgileri ve TLS içeren özel bir broker kullanın. ConnectMQ gibi tam yönetilen bir MQTT servisinde portalda bir broker oluşturur ve bir kullanıcı adı, parola ve client ID alırsınız. Wi-Fi modülündeki sertifika paketi sayesinde TLS'e geçmek yalnızca birkaç satırı değiştirmeyi gerektirir:
WiFiSSLClient wifiClient; // önceden WiFiClient
MqttClient mqttClient(wifiClient);
const char broker[] = "broker.connectmq.com";
const int port = 8883; // TLS üzerinden MQTT
bool connectMqtt() {
mqttClient.setId("YOUR_CLIENT_ID");
mqttClient.setUsernamePassword("YOUR_USERNAME", "YOUR_PASSWORD");
mqttClient.setKeepAliveInterval(30 * 1000L);
if (!mqttClient.connect(broker, port)) {
Serial.print("TLS MQTT failed, error = ");
Serial.println(mqttClient.connectError());
return false;
}
// önceki gibi abone olun ve yayınlayın
return true;
}
Kimlik bilgilerini yanlışlıkla commit etmemek için ana sketch yerine arduino_secrets.h içinde tutun. ConnectMQ client ID'leri verilen kimlik bilgilerine bağlar, bu yüzden client ID'yi birebir kopyalayın. Özel bir broker'da connectmq/demo/ önekini kaldırabilir ve projeniz için bir topic ağacı tasarlayabilirsiniz. MQTT güvenliği en iyi uygulamaları yazısı ek sıkılaştırma adımlarını listeler.
Ölçeklenen Topic ve Payload Tasarımı
Herkese açık broker'daki tek bir kart herhangi bir düzeni kullanabilir, ancak topic'leri gelecek ay on kartınız olacakmış gibi tasarlamak karşılığını verir. Öngörülebilir bir yapı, dashboard'ların wildcard'larla abone olmasını sağlar ve komutları telemetriden net biçimde ayırır.
| Topic | Yön | QoS | Retained | Amaç |
|---|---|---|---|---|
<prefix>/<deviceId>/telemetry |
Kart yayınlar | 0 | Hayır | Periyodik sensör okumaları |
<prefix>/<deviceId>/status |
Kart yayınlar, Will | 1 | Evet | online / offline varlık bilgisi |
<prefix>/<deviceId>/matrix/set |
Kart abone olur | 1 | Hayır | Uygulamalardan veya betiklerden komutlar |
<prefix>/<deviceId>/config |
Kart abone olur | 1 | Evet | Her açılışta uygulanan ayarlar |
Retained config topic'i kullanışlı bir hiledir: istenen yayın aralığını veya eşiği retain bayrağıyla bir kez yayınlayın; kart her yeniden bağlandığında, firmware'inizde ek bir istek mantığı olmadan en güncel ayarları hemen alır.
Payload'ları kompakt tutun. UNO R4'ün RA4M1 işlemcisinde 32 KB SRAM bulunur; bu klasik UNO'ya kıyasla cömert ama yine de küçüktür, bu yüzden uzun süre çalışan sketch'lerde büyük String nesneleri oluşturmaktan kaçının. Örnekte olduğu gibi print() ile akış halinde göndermek bellek kullanımını sabit tutar. Gürültülü analog girişler için yayınlamadan önce birkaç analogRead() örneğinin ortalamasını alın ve yalnızca değer küçük bir eşikten fazla değiştiğinde yayınlamayı düşünün. Daha az ama daha anlamlı mesajlar ağı daha az yorar ve dashboard'da daha kolay okunur.
Sorun Giderme Kontrol Listesi
connectError()-2 (bağlantı reddedildi) döndürüyor veya connect çağrısı hemen başarısız oluyor: yanlış host veya port ya da Wi-Fi yok. Kartın 0.0.0.0 değil, gerçek bir IP adresine sahip olduğunu doğrulayın.- Düz 1883 çalışıyor ama 8883 başarısız: Wi-Fi modülü firmware'ini güncelleyin ve
WiFiClientyerineWiFiSSLClientkullandığınızdan emin olun. - Hata 4 (hatalı kullanıcı adı veya parola) ya da 5 (yetkisiz): client ID dahil üç portal değerini de yeniden kontrol edin.
- Bağlantı bir süre sonra kopuyor:
loop()içindeki engelleyici bir çağrıpoll()fonksiyonunun çalışmasını durdurdu ya da başka bir cihaz aynı client ID'yi kullanıyor. - Gelen mesaj yok:
onMessage()kaydedilmedi veyaconnect()başarılı olmadan önce abone oldunuz. - Yükleme çalışıyor ama seri monitör boş kalıyor: monitörü 115200 baud'a ayarlayın; R4 yerel USB kullanır, bu yüzden monitörü yükleme bittikten sonra açın.
Sırada Ne Var?
Güvenilir bir bağlantınız olduğunda gerçek bir sensör ekleyin ve bir dashboard oluşturun. Daha fazla GPIO'ya, Bluetooth'a veya yerel işlemeye ihtiyacınız varsa bir ESP32 size daha uygun olabilir; ESP32 IoT eğitimi eksiksiz bir projeyi adım adım anlatır. Farklı bir Arduino'nuz varsa Arduino Nano 33 IoT MQTT rehberi, WiFiNINA ile aynı kütüphane desenini izler.
UNO R4'ünüzü ConnectMQ ile Çevrimiçi Yapın
ConnectMQ; MQTT 3.1.1 ve 5.0'ı, 8883'te TLS'i ve tarayıcı dashboard'ları için WebSocket'i destekleyen bir bulut MQTT broker'dır. Portal, UNO'nuzun okumalarının gelişini görebilmeniz için tarayıcı içi bir MQTT client'ı ve canlı bir topic gezgini içerir. app.connectmq.com adresinde kredi kartı olmadan ücretsiz bir Serverless broker oluşturun ve sketch'inizi bugün TLS'e geçirin.
Sık Sorulan Sorular
UNO R4 WiFi'ye bir kök sertifika yüklemem gerekir mi?
Genellikle hayır. ESP32-S3 Wi-Fi modülü yaygın kök sertifikalardan oluşan bir paket taşır; böylece WiFiSSLClient, Let's Encrypt gibi yaygın olarak güvenilen otoriteleri kullanan broker'ları doğrulayabilir. Doğrulama başarısız olursa önce modül firmware'ini güncelleyin.
UNO R4 WiFi'de PubSubClient kullanabilir miyim?
Evet, PubSubClient, WiFiS3'ün client'ları dahil herhangi bir Arduino Client nesnesiyle çalışır. ArduinoMqttClient ise resmi olarak desteklenen seçenektir ve QoS 1 ve 2 ile yayınlama ekler.
UNO R4 WiFi MQTT 5'i destekler mi?
ArduinoMqttClient, ConnectMQ tarafından MQTT 5 ile birlikte tam olarak desteklenen MQTT 3.1.1'i uygular. MQTT 5 dashboard'larınız ve backend'leriniz aynı topic'lere abone olabilir.
UNO R4 WiFi'm neden 0.0.0.0 IP adresi gösteriyor?
WiFiS3, DHCP tamamlanmadan bağlandığını bildirebilir. Örnekte olduğu gibi broker'a bağlanmadan önce WiFi.localIP() gerçek bir adres döndürene kadar bekleyin.



