← Semua artikel

Monitoring Suhu dan Kelembapan ESP32 DHT11 ke AhrarTech IoT via MQTT

Monitoring Suhu dan Kelembapan ESP32 DHT11 ke AhrarTech IoT via MQTT

Monitoring Suhu dan Kelembapan dengan ESP32 dan DHT11

Pendahuluan

Pada project ini, ESP32 digunakan untuk membaca suhu dan kelembapan menggunakan sensor DHT11.

Data hasil pembacaan kemudian dikirim ke AhrarTech IoT melalui protokol MQTT, sehingga nilai suhu dan kelembapan dapat dipantau melalui dashboard.

Alur sederhananya:

DHT11
  │
  ▼
ESP32
  │
  │ Wi-Fi
  ▼
MQTT
  │
  ▼
AhrarTech IoT
  │
  ├── Suhu
  └── Kelembapan

Komponen yang Dibutuhkan

Komponen:

  • ESP32 Development Board
  • Sensor DHT11
  • Breadboard
  • Kabel jumper
  • Kabel USB
  • Jaringan Wi-Fi

Library Arduino:

  • PubSubClient
  • ArduinoJson
  • DHT sensor library
  • Adafruit Unified Sensor

Wiring DHT11 ke ESP32

Hubungkan DHT11 ke ESP32 seperti berikut:

DHT11ESP32
VCC3.3V
DATAGPIO 4
GNDGND

Skema:

DHT11              ESP32

VCC   -----------> 3.3V
DATA  -----------> GPIO 4
GND   -----------> GND

Pada program, GPIO 4 digunakan sebagai pin data DHT11:

#define DHTPIN 4
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

Persiapan AhrarTech IoT

Siapkan informasi device dari AhrarTech IoT:

WORKSPACE_ID
DEVICE_ID
DEVICE_TOKEN

Masukkan informasi tersebut ke dalam program:

const char* WORKSPACE_ID = "YOUR_WORKSPACE_UUID";
const char* DEVICE_ID = "YOUR_DEVICE_UUID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";

Konfigurasi MQTT:

const char* MQTT_HOST = "iot.ahrartech.com";
const int MQTT_PORT = 8883;
const bool USE_TLS = true;

Port 8883 digunakan untuk koneksi MQTT menggunakan TLS.


MQTT Topic

Telemetry dikirim menggunakan topic:

ahrartech/{workspace_id}/{device_id}/telemetry

Contoh data yang dikirim:

{
  "temperature": 33.6,
  "humidity": 66
}

Terdapat dua nilai yang dikirim:

DatastreamKeterangan
temperatureSuhu dari DHT11 dalam °C
humidityKelembapan dari DHT11 dalam %

Program ESP32 + DHT11

Berikut program lengkap untuk membaca DHT11 dan mengirimkan data ke AhrarTech IoT.

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

// =====================================
// WIFI
// =====================================

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";


// =====================================
// AHRARTECH IOT
// =====================================

const char* MQTT_HOST = "iot.ahrartech.com";
const int MQTT_PORT = 8883;
const bool USE_TLS = true;

const char* ROOT_CA = "";

const char* WORKSPACE_ID = "YOUR_WORKSPACE_UUID";
const char* DEVICE_ID = "YOUR_DEVICE_UUID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";


// =====================================
// DHT11
// =====================================

#define DHTPIN 4
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);


// =====================================
// MQTT CLIENT
// =====================================

WiFiClient plainClient;
WiFiClientSecure secureClient;

Client& connection =
  USE_TLS
    ? static_cast<Client&>(secureClient)
    : static_cast<Client&>(plainClient);

PubSubClient mqtt(connection);

String rootTopic;

unsigned long lastTelemetry = 0;
unsigned long lastReconnect = 0;

bool configured = false;


// =====================================
// CONNECT MQTT
// =====================================

void connectMQTT() {

  if (mqtt.connected()) {
    return;
  }

  if (millis() - lastReconnect < 3000) {
    return;
  }

  lastReconnect = millis();

  Serial.println("Connecting MQTT...");

  if (
    mqtt.connect(
      DEVICE_ID,
      DEVICE_ID,
      DEVICE_TOKEN
    )
  ) {

    Serial.println("MQTT connected");

  } else {

    Serial.print("MQTT failed, state=");
    Serial.println(mqtt.state());
  }
}


// =====================================
// SETUP
// =====================================

void setup() {

  Serial.begin(115200);

  dht.begin();

  if (
    USE_TLS &&
    strlen(ROOT_CA) < 100
  ) {

    Serial.println(
      "Install a valid broker CA certificate before enabling TLS."
    );

    return;
  }

  if (USE_TLS) {
    secureClient.setCACert(ROOT_CA);
  }

  WiFi.begin(
    WIFI_SSID,
    WIFI_PASSWORD
  );

  Serial.print("Connecting WiFi");

  while (
    WiFi.status() != WL_CONNECTED
  ) {

    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("WiFi connected");

  rootTopic =
    String("ahrartech/")
    + WORKSPACE_ID
    + "/"
    + DEVICE_ID;

  mqtt.setServer(
    MQTT_HOST,
    MQTT_PORT
  );

  mqtt.setBufferSize(2048);
  mqtt.setKeepAlive(20);

  configured = true;

  Serial.println("ESP32 + DHT11 ready");
}


// =====================================
// LOOP
// =====================================

void loop() {

  if (!configured) {
    delay(100);
    return;
  }

  if (
    WiFi.status() != WL_CONNECTED
  ) {

    Serial.println("WiFi disconnected");

    delay(1000);

    return;
  }

  connectMQTT();

  if (!mqtt.connected()) {
    return;
  }

  mqtt.loop();


  // ===================================
  // READ & SEND DHT11 DATA
  // ===================================

  if (
    millis() - lastTelemetry >= 3000
  ) {

    lastTelemetry = millis();

    float temperature =
      dht.readTemperature();

    float humidity =
      dht.readHumidity();


    // Check DHT11 reading
    if (
      isnan(temperature) ||
      isnan(humidity)
    ) {

      Serial.println(
        "Failed reading DHT11"
      );

      return;
    }


    // Create telemetry
    JsonDocument telemetry;

    telemetry["temperature"] =
      temperature;

    telemetry["humidity"] =
      humidity;


    char output[256];

    serializeJson(
      telemetry,
      output,
      sizeof(output)
    );


    // MQTT topic
    String topic =
      rootTopic
      + "/telemetry";


    // Publish telemetry
    bool success =
      mqtt.publish(
        topic.c_str(),
        output,
        false
      );


    // Serial Monitor
    Serial.print("Temperature: ");
    Serial.print(temperature, 1);
    Serial.print(" °C");

    Serial.print(" | Humidity: ");
    Serial.print(humidity, 1);
    Serial.print(" %");

    Serial.print(" | MQTT: ");

    if (success) {
      Serial.println("Published");
    } else {
      Serial.println("Failed");
    }
  }
}

ROOT CA untuk MQTT TLS

Untuk koneksi TLS, ESP32 memerlukan CA certificate MQTT Broker.

Certificate dapat diambil melalui terminal:

openssl s_client \
  -connect iot.ahrartech.com:8883 \
  -servername iot.ahrartech.com \
  </dev/null 2>/dev/null \
  | openssl x509

Salin hasil certificate:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Kemudian masukkan ke program:

const char* ROOT_CA = R"EOF(
-----BEGIN CERTIFICATE-----

PASTE CERTIFICATE DI SINI

-----END CERTIFICATE-----
)EOF";

Membaca Suhu

Nilai suhu DHT11 dibaca menggunakan:

float temperature =
  dht.readTemperature();

Nilai yang dihasilkan berupa suhu dalam derajat Celsius.

Contoh:

33.6 °C

Membaca Kelembapan

Nilai kelembapan dibaca menggunakan:

float humidity =
  dht.readHumidity();

Contoh hasil:

66 %

Validasi Pembacaan DHT11

Dalam kondisi tertentu sensor dapat gagal memberikan data.

Karena itu dilakukan pengecekan:

if (
  isnan(temperature) ||
  isnan(humidity)
) {

  Serial.println(
    "Failed reading DHT11"
  );

  return;
}

Jika pembacaan gagal, telemetry tidak akan dikirim.


Membuat Telemetry

Data DHT11 dimasukkan ke dalam JSON:

JsonDocument telemetry;

telemetry["temperature"] =
  temperature;

telemetry["humidity"] =
  humidity;

Hasilnya:

{
  "temperature": 33.6,
  "humidity": 66
}

Mengirim Telemetry

Data dikirim ke AhrarTech IoT melalui MQTT:

mqtt.publish(
  topic.c_str(),
  output,
  false
);

Topic:

ahrartech/{workspace_id}/{device_id}/telemetry

Pada contoh program, data dikirim setiap 3 detik:

if (
  millis() - lastTelemetry >= 3000
)

Untuk penggunaan sebenarnya, interval dapat diperbesar misalnya menjadi 10 atau 30 detik.

Contoh 30 detik:

if (
  millis() - lastTelemetry >= 30000
)

Hasil Serial Monitor

Jika ESP32 berhasil terhubung dan DHT11 dapat dibaca, Serial Monitor akan menampilkan:

Connecting WiFi.....
WiFi connected

ESP32 + DHT11 ready

Connecting MQTT...
MQTT connected

Temperature: 33.4 °C | Humidity: 67.0 % | MQTT: Published
Temperature: 33.5 °C | Humidity: 66.0 % | MQTT: Published
Temperature: 33.6 °C | Humidity: 66.0 % | MQTT: Published

Published menunjukkan bahwa telemetry berhasil dikirim ke AhrarTech IoT.


Data pada AhrarTech IoT

Setelah telemetry diterima, device akan memiliki dua data utama:

ESP32 + DHT11

├── temperature
│   └── 33.6 °C
│
└── humidity
    └── 66 %

Nilai tersebut dapat ditampilkan pada dashboard.

Contoh:

┌─────────────────────┐
│        SUHU         │
│                     │
│       33.6 °C       │
└─────────────────────┘

┌─────────────────────┐
│    KELEMBAPAN       │
│                     │
│        66 %         │
└─────────────────────┘

Monitoring Data

Selain melihat nilai terakhir, data DHT11 dapat digunakan untuk melihat perubahan suhu dan kelembapan dari waktu ke waktu.

Contoh data:

WaktuSuhuKelembapan
10:0032.8 °C68%
10:0533.1 °C67%
10:1033.4 °C67%
10:1533.6 °C66%

Dengan data historis tersebut, kondisi lingkungan dapat dipantau melalui dashboard AhrarTech IoT.


Kesimpulan

Pada project ini, sensor DHT11 digunakan untuk membaca suhu dan kelembapan.

ESP32 membaca data sensor dan mengirimkannya ke AhrarTech IoT melalui MQTT.

DHT11
  │
  │ Suhu & Kelembapan
  ▼
ESP32
  │
  │ MQTT
  ▼
AhrarTech IoT
  │
  ├── temperature
  └── humidity

Telemetry yang dikirim berbentuk:

{
  "temperature": 33.6,
  "humidity": 66
}

Dengan project sederhana ini, data suhu dan kelembapan dari DHT11 dapat dipantau secara online melalui AhrarTech IoT.