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:
PubSubClientArduinoJsonDHT sensor libraryAdafruit Unified Sensor
Wiring DHT11 ke ESP32
Hubungkan DHT11 ke ESP32 seperti berikut:
| DHT11 | ESP32 |
|---|---|
| VCC | 3.3V |
| DATA | GPIO 4 |
| GND | GND |
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:
| Datastream | Keterangan |
|---|---|
temperature | Suhu dari DHT11 dalam °C |
humidity | Kelembapan 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:
| Waktu | Suhu | Kelembapan |
|---|---|---|
| 10:00 | 32.8 °C | 68% |
| 10:05 | 33.1 °C | 67% |
| 10:10 | 33.4 °C | 67% |
| 10:15 | 33.6 °C | 66% |
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.