ESP32 ve Arduino

ESP32 DHT22 MQTT: Sıcaklık ve Nemi JSON Olarak Yayınlayın

DHT22'yi ESP32'ye bağlayın, sıcaklık ve nemi güvenilir şekilde okuyun, JSON'u broker.connectmq.com'a yayınlayın ve canlı ölçümleri ConnectMQ topic gezgininde görüntüleyin.

Bir esp32 dht22 mqtt projesinde ölçümleri buluta gönderen, breadboard üzerinde ESP32'ye bağlı DHT22 sensörü
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

Bir ESP32 DHT22 MQTT sensörü klasik ilk IoT projesidir ve doğru şekilde kurulmaya değer. Bu eğitimde bir DHT22'yi bağlayacak, alışılmış NaN hataları olmadan okuyacak, sıcaklık, nem ve hissedilen sıcaklığı (heat index) JSON olarak broker.connectmq.com'a yayınlayacak ve ardından ölçümleri ConnectMQ topic gezgininde canlı izleyeceksiniz.

Gerekenler

  • Bir ESP32 geliştirme kartı (herhangi bir klasik ESP32, S3, C3 veya C6).
  • Bir DHT22 (AM2302 olarak da satılır); çıplak 4 pinli sensör veya 3 pinli breakout modül.
  • Çıplak sensör kullanıyorsanız 10 kOhm'luk bir direnç. Breakout modüller genellikle bunu içerir.
  • Jumper kablolar ve bir breadboard.
  • esp32 kart paketiyle Arduino IDE 2.x.
  • Library Manager'dan kütüphaneler: Adafruit'in DHT sensor library, Adafruit Unified Sensor ve Nick O'Leary'nin PubSubClient kütüphanesi.

DHT22'yi ESP32'ye Bağlamak

DHT22 pini Çıplak sensör pin numarası ESP32 pini Notlar
VCC 1 3V3 3,3 V çalışır; kabloları kısa tutun
DATA 2 GPIO 4 DATA'dan 3V3'e 10 kOhm pull-up
NC 3 bağlanmaz Yalnızca çıplak sensör
GND 4 GND

GPIO 4, klasik bir ESP32'de boot-strapping görevi olmadığı için güvenli bir seçimdir. Sensörler için GPIO 0, 2, 12 ve 15'ten kaçının; reset anındaki durumları açılışı etkiler. C3 ve C6'da strapping pini olmayan herhangi bir boş GPIO seçin ve DHT_PIN sabitini değiştirin.

Sensörü ESP32'den birkaç santimetre uzakta tutun. Kartın regülatörü ve radyosu çalışma sırasında ısınır; doğrudan karta bantlanmış bir DHT22 bir iki derece yüksek okur.

DHT22 Nasıl Davranır

DHT22, katı zamanlamaya sahip tek telli bir protokol kullanır. Kodu iki özellik şekillendirir:

  1. Yalnızca 2 saniyede bir okunabilir. Daha hızlı okumak önbelleğe alınmış değerler veya hatalar döndürür. MQTT telemetrisi için 10 ila 60 saniyede bir fazlasıyla yeterlidir.
  2. Okumalar ara sıra başarısız olur. Yanlış anda gelen bir Wi-Fi kesmesi bit zamanlamasını bozar ve kütüphane NaN döndürür. Production kodu bunu kontrol etmeli ve anlamsız veri yayınlamak yerine yeniden denemelidir.

Doğruluk kabaca yarım santigrat derece ve birkaç yüzde bağıl nemdir. Daha iyi nem doğruluğuna veya basınç ölçümüne ihtiyacınız varsa ESP32 BME280 eğitimi zamanlamaya daha az duyarlı bir I2C sensör kullanır.

Topic ve Payload Tasarımı

Verilerinizin herkese açık test broker'ının diğer kullanıcılarıyla çakışmaması için benzersiz bir önek kullanın:

Topic Retained Payload
connectmq/demo/dht7w3p/telemetry Hayır {"temperature":22.4,"humidity":48.1,"heatIndex":22.1,"rssi":-61}
connectmq/demo/dht7w3p/status Evet online veya offline (last will)

Ölçüm başına tek bir JSON nesnesi ilgili değerleri bir arada tutar; böylece bir tüketici asla farklı bir andan alınmış bir nem değeriyle eşleşmiş bir sıcaklık görmez.

Eksiksiz ESP32 DHT22 MQTT Sketch'i

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

// ---------- ayarlar ----------
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/dht7w3p";   // kendi rastgele kimliğinizle değiştirin
const uint8_t DHT_PIN     = 4;
const uint32_t INTERVAL_MS = 15000;

DHT dht(DHT_PIN, DHT22);
WiFiClient   net;
PubSubClient mqtt(net);
String clientId, topicTelemetry, topicStatus;
unsigned long lastRead = 0;

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(400);
    Serial.print(".");
  }
  Serial.printf(" connected, IP %s\n", WiFi.localIP().toString().c_str());
}

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

bool readDht(float& t, float& h) {
  for (int attempt = 0; attempt < 3; attempt++) {
    h = dht.readHumidity();
    t = dht.readTemperature();          // Santigrat
    if (!isnan(h) && !isnan(t)) return true;
    delay(2100);                        // DHT22 okumalar arasında 2 sn ister
  }
  return false;
}

void setup() {
  Serial.begin(115200);
  dht.begin();

  clientId       = "esp32-dht22-" + String((uint32_t)ESP.getEfuseMac(), HEX);
  topicTelemetry = String(PREFIX) + "/telemetry";
  topicStatus    = String(PREFIX) + "/status";

  connectWifi();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setBufferSize(512);
  connectMqtt();
}

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

  if (millis() - lastRead < INTERVAL_MS) return;
  lastRead = millis();

  float t, h;
  if (!readDht(t, h)) {
    Serial.println("DHT22 read failed three times, skipping this cycle");
    mqtt.publish(topicStatus.c_str(), "sensor-error", true);
    return;
  }

  float heatIndex = dht.computeHeatIndex(t, h, false);   // false = Santigrat
  char payload[160];
  snprintf(payload, sizeof(payload),
           "{\"temperature\":%.1f,\"humidity\":%.1f,\"heatIndex\":%.1f,\"rssi\":%d}",
           t, h, heatIndex, WiFi.RSSI());

  if (mqtt.publish(topicTelemetry.c_str(), payload)) {
    Serial.println(payload);
  } else {
    Serial.println("publish failed");
  }
}

Status topic'i hakkında bir not: bir sensör hatasından sonra sketch retained durum olarak sensor-error yayınlar ve sonraki başarılı bağlantı bunu online ile üzerine yazar. Ayrı bir sağlık topic'ini tercih ediyorsanız bir tane ekleyin; önemli olan, bozuk bir sensörün sessiz kalmak yerine görünür olmasıdır.

Aralık Seçmek ve Enerji Tasarrufu

Sketch'teki 15 saniyelik aralık bir masa üstü demosu için uygundur. Gerçek odalar için verinin ne amaçla kullanılacağını düşünün. Konfor izleme nadiren dakikada birden fazla ölçüm gerektirir; bir sera veya sunucu dolabı alarmı ise 30 saniyede bir isteyebilir. Daha seyrek yayın yapmak broker trafiğini azaltır ve veriyi grafiğe dökmeyi kolaylaştırır.

Düğüm pille çalışıyorsa, Wi-Fi'ı sürekli bağlı tutmak en büyük tüketim kaynağıdır. Daha iyi bir yapı şöyledir: deep sleep'ten uyan, sensöre güç ver, iki saniye bekle, oku, Wi-Fi'a ve broker'a bağlan, yayınla, bağlantıyı temiz biçimde kes, ardından bir zamanlayıcı uyandırmasıyla esp_deep_sleep_start() çağır. Bu modda last will daha az yararlıdır, çünkü her uyku bir bağlantı kopması gibi görünür; bu yüzden bunun yerine retained bir lastSeen değeri yayınlayın ve birkaç aralık boyunca rapor vermemiş sensörleri dashboard'un işaretlemesine izin verin. Uyku sırasında tamamen kapalı olmasını istiyorsanız DHT22'yi bir GPIO pininden besleyin ve güç verdikten sonra ilk okumadan önce tam iki saniye beklemeyi unutmayın.

Komut Satırıyla Test Etmek

Herhangi bir benzersiz client ID kullanarak Mosquitto istemcisiyle subscribe olun:

mosquitto_sub -h broker.connectmq.com -p 1883 -i dht-viewer-7w3p -t "connectmq/demo/dht7w3p/#" -v

Sensöre nefes verin; nem bir iki ölçüm içinde yükselir. Herkese açık alanın paylaşımlı olduğunu ve herkes tarafından okunabildiğini unutmayın; masa üstü bir demo için uygundur ancak gizli tutmak istediğiniz veriler için uygun değildir. Ücretsiz herkese açık MQTT broker rehberi sınırlarını listeler.

ESP32 DHT22 MQTT Verilerini Topic Gezgininde Görüntülemek

Komut satırı hızlıdır, ancak birkaç sensör çalıştırdığınızda görsel bir görünüm daha hoştur. app.connectmq.com adresinde ücretsiz bir hesap açın, ücretsiz Serverless planını seçin, bir broker oluşturun ve otomatik oluşturulan kullanıcı adını, parolayı ve client ID'yi kopyalayın. Ardından sketch'i TLS üzerinden kimlik bilgileriyle bağlanacak şekilde değiştirin:

#include <WiFiClientSecure.h>

WiFiClientSecure net;              // WiFiClient'ın yerini alır
PubSubClient mqtt(net);

// PEM biçiminde ISRG Root X1 (Let's Encrypt), letsencrypt.org'dan kopyalandı
static const char ROOT_CA[] = R"PEM(
-----BEGIN CERTIFICATE-----
...paste ISRG Root X1 here...
-----END CERTIFICATE-----
)PEM";

// setup() içinde, connectMqtt() öncesinde:
net.setCACert(ROOT_CA);
mqtt.setServer("broker.connectmq.com", 8883);

// connectMqtt() içinde:
mqtt.connect("YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_PASSWORD",
             topicStatus.c_str(), 1, true, "offline");

Broker'ınızı ConnectMQ portalında açın ve canlı topic gezginine gidin. Telemetri topic'iniz ağaçta görünür ve her yeni ölçüm yerinde güncellenir. Aynı portaldan, örneğin yüzde 70'in üzerindeki nem için bir eşik uyarı kuralı ekleyebilir ve tetiklenen uyarıları uyarı günlüğünde inceleyebilirsiniz. Uzun vadeli grafikler için broker'a bir MQTT istemcisi olarak bağlanan ve seçtiğiniz veritabanına yazan Node-RED, Telegraf veya küçük bir Python subscriber'ı çalıştırın.

Sorun Giderme

  1. Her okuma NaN döndürüyor. Pull-up direncini ve DATA'nın gerçekten DHT_PIN ile ayarlanan pine gittiğini kontrol edin. Çıplak sensörlerde en yaygın neden eksik pull-up'tır.
  2. Ara sıra NaN. Wi-Fi yükü altında normaldir. Yeniden deneme döngüsü bunu halleder; 2 saniyelik aralığı azaltmayın.
  3. Sıcaklık takılı kalıyor veya yavaş değişiyor. DHT22 yavaş tepki verir ve oturması onlarca saniye sürer. Bu MQTT'den değil sensörden kaynaklanır.
  4. Ölçümler birkaç derece yüksek. Karttan kaynaklanan kendi kendine ısınma. Sensörü kısa bir kabloyla uzaklaştırın.
  5. Uzun kablolar hata veriyor. Tek telli protokol hassastır. Kabloyu kısa tutun veya pull-up değerini biraz düşürün.
  6. MQTT state -2. TCP bağlantısı başarısız oldu; Wi-Fi'ı ve dışa giden 1883 portuna izin verildiğini kontrol edin.

Daha büyük payload'ları güvenle biçimlendirmek için ESP32 MQTT payload'ları için ArduinoJson yazısına bakın. Nem olmadan birden fazla sıcaklık noktasına ihtiyacınız varsa DS18B20 çoklu sensör projesi daha uygun bir seçimdir.

ConnectMQ ile Başlayın

Bir DHT22 düğümü, verileri güvenilir bir yere ulaştığında yararlı hale gelir. ConnectMQ size 8883 portunda TLS, MQTT 3.1.1 ve 5.0, canlı topic gezgini ve uyarı kurallarıyla bir bulut MQTT broker ve kredi kartı gerektirmeyen ücretsiz bir Serverless plan sunar. Bu sketch'in TLS sürümünü kimlik bilgilerinizle yükleyin ve daha fazla sensör ve cihaz projesi için ESP32 IoT eğitimi ile devam edin.

Sık Sorulan Sorular

Bir ESP32, DHT22 ölçümlerini MQTT üzerinden ne sıklıkta yayınlamalı?

Oda izleme için 10 ila 60 saniyede bir tipiktir. DHT22 2 saniyeden daha sık okunamaz ve yavaş tepkisi daha hızlı yayını anlamsız kılar.

DHT22 yerine DHT11 kullanabilir miyim?

Evet. Constructor'da DHT22 ifadesini DHT11 olarak değiştirin. DHT11'in doğruluğu ve ölçüm aralığı daha düşüktür; bu yüzden demonun ötesindeki her şey için DHT22 veya BME280 daha iyidir.

Sıcaklık ve nemi ayrı topic'lerde mi yayınlamalıyım?

İkisi de çalışır. Tek bir JSON nesnesi aynı andan alınan değerleri bir arada tutar; ayrı topic'ler ise topic başına tek bir sayı bekleyen araçlar için kullanışlıdır.

Neden last will ile birlikte retained bir status topic'i kullanmalı?

ESP32 bağlantıyı kesmeden ortadan kaybolursa broker retained offline mesajını yayınlar; böylece her dashboard ölü bir sensörü sessiz olandan ayırt edebilir.

İ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.