LAPORAN PRAKTIKUM
SISTEM MONITORING LINGKUNGAN DAN
KONTROL OTOMATIS BERBASIS ESP32 TERINTEGRASI THINGSBOARD CLOUD VIA PROTOKOL
MQTT
Disusun oleh:
Indina Anisa Zahrah 24051204213
Alfan Mahardhika Yuda Prajakusuma 24051204182
Dhani Rakha Aditya Rahma 24051204113
Bee Nayaka Athalah Muchamad 24051204125
BAB I
PENDAHULUAN
1.1
Latar Belakang
Perkembangan teknologi Internet of
Things (IoT) telah mengubah cara manusia berinteraksi dengan perangkat fisik di
lingkungan sekitarnya. Arsitektur IoT memungkinkan pengumpulan data secara
real-time dari berbagai jenis sensor (telemetri) serta eksekusi aksi secara
otomatis maupun jarak jauh melalui jaringan internet. Dalam pemantauan
lingkungan cerdas, keandalan transmisi data dan efisiensi biaya infrastruktur
menjadi perhatian utama.
Banyak platform IoT komersial
menetapkan biaya langganan yang relatif tinggi atau membatasi alokasi kuota
data pada versi uji coba. Sebagai solusinya, ThingsBoard Cloud hadir
menyediakan platform open-source yang efisien, scalable, dan hemat biaya. ThingsBoard
menyediakan infrastruktur MQTT Broker terintegrasi, visualisasi dashboard
interaktif, serta mendukung protokol Remote Procedure Call (RPC) untuk kontrol
dua arah.
Pada Praktikum Modul 5 ini,
dirancang sistem pemantauan lingkungan dan kontrol otomatis menggunakan
mikrokontroler ESP32 pada platform simulasi Wokwi. Sistem ini mengintegrasikan
sensor suhu/kelembapan DHT22, sensor cahaya LDR, sensor gerak PIR, serta aktuator
LCD 16x2 I2C, Servo, Relay Kipas, LED, dan Buzzer. Seluruh data dikirimkan ke
ThingsBoard Cloud via MQTT, dan perintah kontrol dieksekusi secara otomatis
maupun manual.
1.2
Rumusan Masalah
- Bagaimana mengoneksikan
simulator ESP32 pada Wokwi ke platform ThingsBoard Cloud menggunakan
protokol MQTT?
- Bagaimana merancang logika
otomatisasi sensor lokal (mode AUTO) serta kontrol jarak jauh via Remote
Procedure Call (mode MANUAL)?
- Bagaimana menampilkan data
telemetri sensor dan status sistem pada LCD 16x2 serta dashboard
ThingsBoard Cloud?
1.3
Tujuan Praktikum
- Memahami proses integrasi dan
autentikasi perangkat ESP32 ke ThingsBoard Cloud melalui protokol MQTT.
- Mengimplementasikan pemrosesan
data sensor lokal (edge computing) serta fitur RPC untuk kendali
aktuator jarak jauh.
- Menganalisis alur komunikasi
data telemetri sensor secara real-time pada LCD dan dashboard
IoT.
1.4
Manfaat Praktikum
- Meningkatkan pemahaman teknis
mengenai arsitektur komunikasi cloud IoT, protokol MQTT, dan
pemrograman mikrokontroler berbasis sistem tertanam.
- Menjadikan hasil simulasi
sebagai acuan rancang bangun sistem pemantauan lingkungan dan keselamatan
industri (smart environmental & safety monitoring) yang
efisien.
BAB II
TINJAUAN PUSTAKA
2.1
Dasar Teori
2.1.1
Platform IoT Cloud dan Realitas Industri
Sebagian besar platform IoT
komersial di industri menarik biaya penggunaan untuk alokasi resource server.
Fasilitas free trial yang disediakan umumnya sangat dibatasi pada
fungsi-fungsi dasar. Solusi alternatif untuk menguji arsitektur IoT secara
efisien adalah memanfaatkan platform IoT open-source atau layanan cloud publik
gratisan seperti ThingsBoard Cloud, yang menyediakan perantara (broker) MQTT
terintegrasi serta antarmuka visualisasi dashboard.
2.1.2
Protokol MQTT
MQTT (Message Queuing Telemetry
Transport) adalah protokol komunikasi jaringan ringan berbasis arsitektur Publish/Subscribe
yang beroperasi di atas protokol TCP/IP. Perangkat (client) mengirimkan
data (publish) atau menerima perintah (subscribe) melalui broker
perantara. ThingsBoard bertindak sebagai broker sekaligus server IoT Cloud.
Pengiriman data telemetri pada ThingsBoard menggunakan topik standar: v1/devices/me/telemetry
dengan isi data (payload) berformat JSON (JavaScript Object Notation).
2.1.3
Autentikasi MQTT Basic / Access Token pada ThingsBoard
ThingsBoard mendukung berbagai
metode otentikasi perangkat, salah satunya adalah MQTT Basic atau Access
Token. Metode ini memerlukan kredensial otentikasi agar client
diizinkan terhubung ke broker:
- Client ID: Identitas unik
perangkat saat terhubung.
- Username / Access Token: Akses
otentikasi perangkat.
- Password: Kata sandi
otentikasi.
2.1.4
ESP32, Sensor DHT22, Sensor LDR, dan Sensor PIR
ESP32 adalah mikrokontroler System-on-Chip
(SoC) yang dilengkapi dengan modul Wi-Fi dan Bluetooth terintegrasi,
menjadikannya ideal untuk aplikasi IoT.
- Sensor DHT22: Sensor digital
untuk mengukur suhu (°C) dan kelembaban udara (%) dengan tingkat akurasi
presisi.
- Sensor LDR: Sensor
fotoresistor analog yang mengukur tingkat intensitas cahaya lingkungan (Lux).
- Sensor PIR Motion: Sensor Passive
Infrared yang bertugas mendeteksi pergerakan objek atau manusia di
sekitar area pemantauan.
2.1.5
LCD 16x2 I2C, Relay, Push Button, LED, dan Buzzer
- LCD 16x2 I2C: Menampilkan
status operasional sistem, mode kontrol, dan pembacaan sensor secara lokal
melalui dua jalur komunikasi I2C (SDA dan SCL).
- Relay Module: Aktuator sakelar
elektronik untuk menyimulasikan kontrol Kipas Pendingin berdaya tinggi
secara otomatis atau manual.
- Push Button: Berfungsi sebagai
input sakelar fisik untuk mengalihkan mode kontrol sistem antara AUTO dan MANUAL.
- LED & Buzzer: Berperan
sebagai indikator visual dan peringatan audio (beep) saat pemicu
alarm bahaya atau kondisi suhu/lingkungan kritis terdeteksi.
2.1.6
Wokwi Simulator dan ThingsBoard Cloud Dashboard
Wokwi adalah platform simulator
elektronik online berbasis web yang memungkinkan pengujian
mikrokontroler ESP32, sensor, dan koneksi jaringan virtual (Wi-Fi Wokwi-GUEST)
secara real-time. Sementara ThingsBoard Cloud Dashboard bertindak
sebagai antarmuka pemantauan jarak jauh yang memvisualisasikan data telemetri
serta menyediakan fitur Remote Procedure Call (RPC) untuk mengendalikan
aktuator fisik melalui widget Switch Control.
2.2
Perangkat dan Software yang Digunakan
|
No |
Perangkat
/ Software |
Jumlah |
Fungsi |
|
1 |
ThingsBoard
Cloud |
1 |
Server
IoT Cloud, Broker MQTT, visualisasi dashboard, dan pengontrol RPC |
|
2 |
Wokwi
Simulator |
1 |
Simulator
rangkaian elektronik virtual dan eksekusi kode C++ Arduino |
|
3 |
ESP32
DevKit V1 |
1 |
Mikrokontroler
utama pemproses data sensor dan pengirim MQTT |
|
4 |
Sensor
DHT22 |
1 |
Sensor
pengukur suhu dan kelembaban udara |
|
5 |
Sensor
LDR |
1 |
Sensor
pengukur intensitas cahaya analog (Lux) |
|
6 |
Sensor
PIR Motion |
1 |
Sensor
pendeteksi pergerakan objek/manusia |
|
7 |
LCD 16x2
I2C |
1 |
Display
informasi status lingkungan dan mode kontrol secara lokal |
|
8 |
Relay
Module & Kipas |
1 |
Aktuator
sakelar pendingin udara otomatis/manual |
|
9 |
Push
Button |
1 |
Tombol
fisik pemicu beralihnya mode (AUTO / MANUAL) |
|
10 |
LED
& Buzzer |
1 |
Indikator
visual dan suara peringatan alarm |
BAB III
PEMBAHASAN
3.1
Deskripsi Praktikum dan Alur Kerja
Sistem pemantauan lingkungan dan
kontrol otomatis berbasis ESP32 ini bertujuan mengintegrasikan pembacaan data
telemetri multi-sensor (suhu, kelembaban, cahaya, dan gerakan), pemrosesan
lokal (edge computing), kontrol otomatisasi aktuator (Relay Kipas,
Lampu, Buzzer), serta pemantauan dan kendali jarak jauh melalui ThingsBoard
Cloud via protokol MQTT.

Gambar
3.1: Tampilan Struktur Rangkaian Wokwi ESP32 dengan Sensor dan Perangkat
Peripheral.
Alur kerja
sistem secara keseluruhan meliputi:
- Pendaftaran perangkat uts_iot dan
pengaturan kredensial otentikasi di ThingsBoard Cloud.
- Eksekusi program di Wokwi
untuk menghubungkan ESP32 ke Wi-Fi Wokwi-GUEST dan broker mqtt.thingsboard.cloud.
- Pembacaan berkala sensor
DHT22, LDR, dan PIR, pembaruan tampilan LCD 16x2, eksekusi logika otomasi
lokal (Mode AUTO), penyusunan payload JSON, serta publikasi
telemetri ke ThingsBoard Cloud.
- Penerimaan perintah Remote
Procedure Call (RPC) dari Dashboard ThingsBoard untuk mengendalikan
Relay Kipas dan Lampu secara manual (Mode MANUAL).
3.2
Program
|
#include <WiFi.h> #include <PubSubClient.h> #include <DHT.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define PIN_DHT
15 #define PIN_LDR
34 #define PIN_PIR
27 #define PIN_LED_LAMPU 25 #define PIN_LED_ALARM 26 #define PIN_BUZZER 33 #define PIN_RELAY 32 #define PIN_BUTTON 14 #define DHTTYPE
DHT22 #define LDR_DARK_IS_HIGH true const char* ssid
= "Wokwi-GUEST"; const char* password =
""; const int wifiChannel = 6; const char* mqtt_server =
"mqtt.thingsboard.cloud"; const int mqtt_port = 1883; const char* mqtt_clid =
"uts_iot"; const char* mqtt_user =
"alfan"; const char* mqtt_pass =
"passwordkuat123"; const char* TOPIC_TELEMETRY =
"v1/devices/me/telemetry"; const char* TOPIC_ATTRIBUTE =
"v1/devices/me/attributes"; const char* TOPIC_RPC_REQ =
"v1/devices/me/rpc/request/+"; WiFiClient espClient; PubSubClient client(espClient); DHT dht(PIN_DHT, DHTTYPE); LiquidCrystal_I2C lcd(0x27, 16, 2); float suhu = 0, hum = 0, heatIndex = 0; int ldrRaw = 0, cahayaPct = 0; bool gerak = false; bool sensorError = false; uint8_t dhtFail = 0; float suhuMax = 32.0; float humMax = 85.0; int cahayaMin = 30; bool modeAuto = true; bool fanOn = false, lampOn = false; bool fanManual = false, lampManual = false; uint8_t alarmLevel = 0; const char* alarmMsg = "NORMAL"; bool buzzerMuted = false; bool eventPending = false; unsigned long lastMotion = 0; const unsigned long LAMP_HOLD_MS = 10000; unsigned long tSensor = 0, tTelemetry = 0,
tLcd = 0, tWifi = 0, tMqtt = 0; const unsigned long SENSOR_INTERVAL
= 2000; const unsigned long TELEMETRY_INTERVAL =
5000; const unsigned long LCD_INTERVAL
= 1000; void buzzerTone(int freq) { if (freq > 0) tone(PIN_BUZZER,
freq); else noTone(PIN_BUZZER); } float r1(float x) { return round(x * 10.0)
/ 10.0; } String buildTelemetryJson() { String p = "{"; p += "\"suhu\":"
+ String(r1(suhu), 1) + ","; p +=
"\"kelembaban\":" + String(r1(hum), 1) + ","; p +=
"\"heat_index\":" + String(r1(heatIndex), 1) +
","; p +=
"\"cahaya\":" + String(cahayaPct) + ","; p +=
"\"gerakan\":" + String(gerak ? "true" :
"false") + ","; p +=
"\"kipas\":" + String(fanOn ? "true" :
"false") + ","; p +=
"\"lampu\":" + String(lampOn ? "true" :
"false") + ","; p +=
"\"mode\":\"" + String(modeAuto ? "AUTO" :
"MANUAL") + "\","; p +=
"\"alarm_level\":" + String(alarmLevel) + ","; p +=
"\"alarm_msg\":\"" + String(alarmMsg) +
"\","; p +=
"\"sensor_ok\":" + String(!sensorError ? "true"
: "false") + ","; p += "\"rssi\":"
+ String(WiFi.status() == WL_CONNECTED ? WiFi.RSSI() : 0) + ","; p +=
"\"uptime_s\":" + String(millis() / 1000); p += "}"; return p; } void publishTelemetry() { if (!client.connected()) return; String payload =
buildTelemetryJson(); bool ok =
client.publish(TOPIC_TELEMETRY, payload.c_str()); Serial.print("[MQTT] Telemetry
"); Serial.print(ok ? "OK: " : "GAGAL: "); Serial.println(payload); } void publishAttributes() { if (!client.connected()) return; String p = "{"; p +=
"\"firmware\":\"1.0.0\","; p +=
"\"board\":\"ESP32 DevKit\","; p +=
"\"ip\":\"" + WiFi.localIP().toString() +
"\","; p +=
"\"suhuMax\":" + String(suhuMax, 1) + ","; p +=
"\"kelembabanMax\":" + String(humMax, 1) + ","; p +=
"\"cahayaMin\":" + String(cahayaMin) + ","; p += "\"mode\":\""
+ String(modeAuto ? "AUTO" : "MANUAL") +
"\""; p += "}"; client.publish(TOPIC_ATTRIBUTE,
p.c_str()); } void setMode(bool autoMode) { modeAuto = autoMode; if (!modeAuto) { fanManual = fanOn;
lampManual = lampOn; } Serial.print("[MODE] "); Serial.println(modeAuto
? "AUTO" : "MANUAL"); publishAttributes(); eventPending = true; } void updateControl() { unsigned long now = millis(); if (gerak) lastMotion = now; if (modeAuto) { if (sensorError)
fanOn = true; else if (suhu >= suhuMax)
fanOn = true; else if (suhu <= suhuMax -
1) fanOn = false; bool gelap = cahayaPct <
cahayaMin; lampOn = gelap &&
lastMotion != 0 && (now - lastMotion < LAMP_HOLD_MS); } else { fanOn = fanManual; lampOn = lampManual; } digitalWrite(PIN_RELAY, fanOn ? HIGH
: LOW); digitalWrite(PIN_LED_LAMPU, lampOn ?
HIGH : LOW); } void updateAlarm() { uint8_t lvl = 0; const char* msg =
"NORMAL"; if (sensorError)
{ lvl = 2; msg = "KRITIS: DHT
Error"; } else if (suhu >= suhuMax + 5)
{ lvl = 2; msg = "KRITIS: Suhu Tinggi"; } else if (suhu > suhuMax)
{ lvl = 1; msg = "WARN: Suhu Tinggi"; } else if (hum > humMax)
{ lvl = 1; msg = "WARN: Hum Tinggi"; } if (lvl != alarmLevel) { alarmLevel = lvl; alarmMsg = msg; if (lvl == 0) buzzerMuted =
false; eventPending = true; Serial.print("[ALARM]
"); Serial.println(msg); } else { alarmMsg = msg; } } void updateOutputs() { unsigned long now = millis(); if (alarmLevel == 0)
digitalWrite(PIN_LED_ALARM, LOW); else if (alarmLevel == 1)
digitalWrite(PIN_LED_ALARM, (now / 500) % 2); else
digitalWrite(PIN_LED_ALARM,
(now / 150) % 2); if (alarmLevel == 2 &&
!buzzerMuted) buzzerTone(((now / 250) % 2) ? 2000 : 0); else buzzerTone(0); } void handleButton() { static bool lastState = HIGH; static unsigned long pressT = 0; static bool longDone = false; bool s = digitalRead(PIN_BUTTON); unsigned long now = millis(); if (lastState == HIGH && s
== LOW) { pressT = now; longDone = false; } if (s == LOW && !longDone
&& now - pressT >= 1500) { longDone = true; setMode(!modeAuto); } if (lastState == LOW && s ==
HIGH && !longDone && now - pressT >= 40) { buzzerMuted = true; Serial.println("[BUTTON]
Alarm Muted"); } lastState = s; } void readSensors() { float t = dht.readTemperature(); float h = dht.readHumidity(); if (isnan(t) || isnan(h)) { if (dhtFail < 255)
dhtFail++; if (dhtFail >= 3)
sensorError = true; } else { dhtFail = 0; sensorError =
false; suhu = t; hum = h; heatIndex =
dht.computeHeatIndex(t, h, false); } long sum = 0; for (int i = 0; i < 8; i++) sum
+= analogRead(PIN_LDR); ldrRaw = sum / 8; cahayaPct = map(ldrRaw, 0, 4095, 0,
100); if (LDR_DARK_IS_HIGH) cahayaPct =
100 - cahayaPct; cahayaPct = constrain(cahayaPct, 0,
100); gerak = digitalRead(PIN_PIR); } void mqttCallback(char* topic, byte*
payload, unsigned int length) { String t(topic); String p = ""; for (int i = 0; i < length; i++)
p += (char)payload[i]; p.toLowerCase(); if
(t.startsWith("v1/devices/me/rpc/request/")) { String reqId =
t.substring(26); String respTopic = "v1/devices/me/rpc/response/"
+ reqId; if
(p.indexOf("getstatus") >= 0 || p.indexOf("getvalue")
>= 0) {
client.publish(respTopic.c_str(), buildTelemetryJson().c_str()); } else if
(p.indexOf("setfan") >= 0 || p.indexOf("setvalue")
>= 0) { if (!modeAuto) { fanManual =
(p.indexOf("true") >= 0 || p.indexOf("1") >= 0 ||
p.indexOf("on") >= 0);
updateControl(); eventPending = true;
client.publish(respTopic.c_str(), "{\"ok\":true}"); } else {
client.publish(respTopic.c_str(),
"{\"ok\":false,\"msg\":\"Mode is
AUTO\"}"); } } else if
(p.indexOf("setlamp") >= 0) { if (!modeAuto) { lampManual =
(p.indexOf("true") >= 0 || p.indexOf("1") >= 0 ||
p.indexOf("on") >= 0);
updateControl(); eventPending = true;
client.publish(respTopic.c_str(), "{\"ok\":true}"); } else {
client.publish(respTopic.c_str(),
"{\"ok\":false,\"msg\":\"Mode is
AUTO\"}"); } } else if
(p.indexOf("setmode") >= 0) { bool targetAuto =
(p.indexOf("auto") >= 0 || p.indexOf("true") >= 0); setMode(targetAuto);
client.publish(respTopic.c_str(), "{\"ok\":true}"); } else if
(p.indexOf("mutebuzzer") >= 0) { buzzerMuted = true;
client.publish(respTopic.c_str(), "{\"ok\":true}"); } else if
(p.indexOf("reboot") >= 0) {
client.publish(respTopic.c_str(), "{\"ok\":true}"); delay(500);
ESP.restart(); } } } void wifiMaintain() { if (WiFi.status() == WL_CONNECTED)
return; if (millis() - tWifi < 10000)
return; tWifi = millis(); WiFi.disconnect(); WiFi.begin(ssid, password,
wifiChannel); } void mqttMaintain() { if (client.connected()) {
client.loop(); return; } if (WiFi.status() != WL_CONNECTED)
return; if (millis() - tMqtt < 5000)
return; tMqtt = millis(); if (client.connect(mqtt_clid,
mqtt_user, mqtt_pass)) { Serial.println("[MQTT]
Connected!");
client.subscribe(TOPIC_RPC_REQ);
client.subscribe(TOPIC_ATTRIBUTE); publishAttributes(); } } void drawLcd() { lcd.setCursor(0, 0); lcd.print("T:");
lcd.print(suhu, 1); lcd.print("C H:");
lcd.print(hum, 0); lcd.print("% ");
lcd.print(modeAuto ? "A" : "M"); lcd.setCursor(0, 1); if (alarmLevel > 0) { lcd.print("ALM:");
lcd.print(alarmMsg); } else { lcd.print("F:");
lcd.print(fanOn ? "1" : "0"); lcd.print(" L:");
lcd.print(lampOn ? "1" : "0"); lcd.print(" Lux:");
lcd.print(cahayaPct); lcd.print("%
"); } } void setup() { Serial.begin(115200); pinMode(PIN_PIR, INPUT); pinMode(PIN_BUTTON, INPUT_PULLUP); pinMode(PIN_RELAY, OUTPUT); pinMode(PIN_LED_LAMPU, OUTPUT); pinMode(PIN_LED_ALARM, OUTPUT); pinMode(PIN_BUZZER, OUTPUT); Wire.begin(21, 22); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("IoT UTS
Station"); lcd.setCursor(0, 1);
lcd.print("Connecting..."); dht.begin(); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password,
wifiChannel); client.setServer(mqtt_server,
mqtt_port); client.setCallback(mqttCallback); readSensors(); updateAlarm(); updateControl(); delay(1000); lcd.clear(); } void loop() { unsigned long now = millis(); wifiMaintain(); mqttMaintain(); handleButton(); if (now - tSensor >=
SENSOR_INTERVAL) { tSensor = now; readSensors(); updateAlarm(); updateControl(); } updateOutputs(); if (now - tTelemetry >=
TELEMETRY_INTERVAL || eventPending) { tTelemetry = now; eventPending = false; publishTelemetry(); } if (now - tLcd >= LCD_INTERVAL) { tLcd = now; drawLcd(); } } |
3.3
Langkah-Langkah Kerja Praktikum
Langkah 1:
Membuat Perangkat & Kredensial di ThingsBoard Cloud
- Buka peramban web (browser)
dan lakukan login ke akun ThingsBoard Cloud.
- Navigasi ke menu Entities >
Devices, lalu klik tombol + (Add new device).
- Masukkan nama perangkat uts_iot.
- Pada jendela pengaturan
kredensial, pilih metode otentikasi Access Token atau MQTT Basic dan salin
kredensial rahasia perangkat.
- Simpan konfigurasi perangkat
dan pastikan status indikator perangkat muncul di daftar entitas.

Gambar
3.2: Konfigurasi Device Credentials dan Indikator Status Aktif Perangkat
uts_iot di ThingsBoard Cloud.
Langkah 2:
Pengujian Koneksi & Pengiriman Telemetri dari Wokwi
- Buka lembar kerja proyek
simulasi ESP32 pada platform Wokwi.
- Masukkan kode program C++
lengkap yang sudah memuat kredensial ThingsBoard Cloud ke dalam file sketch.ino.
- Tekan tombol Start Simulation
(ikon Play hijau).
- Amati tampilan layar LCD 16x2
hingga menampilkan status inisialisasi awal dan masuk ke tampilan
utama.
- Buka tab Latest Telemetry pada
detail perangkat uts_iot di ThingsBoard Cloud dan verifikasi bahwa
parameter suhu, kelembaban, cahaya, gerakan, mode, kipas, lampu, rssi
telah masuk secara real-time.

Gambar
3.3: Pengujian Koneksi Wokwi ESP32 dan Verifikasi Data Telemetri Real-Time di
ThingsBoard Cloud.
Langkah 3:
Pengujian Otomatisasi Edge Computing & Alarm (Mode AUTO)
- Pastikan sistem berada dalam
mode AUTO (ditandai huruf A pada pojok kanan atas layar LCD).
- Geser slider suhu
sensor DHT22 hingga melebihi 30.0°C. Amati modul Relay Kipas otomatis
aktif dan huruf indikator di LCD berubah menjadi F:1.
- Naikkan suhu melebihi 32.0°C
untuk memicu kondisi alarm kritis. Amati LED Alarm menyala merah dan
Buzzer berbunyi peringatan.
- Geser slider sensor LDR
ke kondisi gelap (Lux < 30%), lalu klik sensor PIR untuk mensimulasikan
pemicu gerakan. Amati indikator LCD berubah menjadi L:1 dan LED Lampu
menyala.
- Periksa pembaruan data
telemetri otomatis pada ThingsBoard Cloud.

Gambar
3.4: Hasil Pengujian Otomatisasi Sensor Lokal, Aktivasi Relay Kipas, dan Alarm
Peringatan Suhu Kritis.
Langkah 4:
Pembuatan Dashboard Visualisasi & Kontrol RPC di ThingsBoard
- Navigasi ke menu Dashboards di
ThingsBoard Cloud, lalu buat dashboard baru dengan nama UTS IoT Dashboard.
- Tambahkan widget Timeseries
Line Chart untuk memvisualisasikan grafik histori parameter suhu,
kelembaban, dan cahaya.
- Tambahkan dua widget Switch
Control dari kategori Control Widgets.
- Konfigurasikan sakelar pertama
sebagai Kontrol Kipas dengan RPC set value method: setFan.
- Konfigurasikan sakelar kedua
sebagai Kontrol Lampu dengan RPC set value method: setLamp.
- Simpan seluruh susunan widget
pada dashboard.

Gambar
3.5: Tampilan Keseluruhan Dashboard (Visualisasi Grafik Telemetri dan Sakelar
Kontrol RPC).
Langkah 5:
Pengujian Kontrol Jarak Jauh / RPC (Mode MANUAL)
- Tekan tombol push button
fisik pada papan Wokwi untuk berpindah dari mode AUTO ke mode MANUAL
(ditandai huruf M pada pojok kanan atas LCD).
- Buka UTS IoT Dashboard di
ThingsBoard Cloud secara berdampingan dengan layar Wokwi.
- Tekan sakelar Kontrol Kipas ke
posisi ON. Amati indikator di LCD Wokwi berubah menjadi F:1 dan modul
Relay menyala.
- Tekan sakelar Kontrol Lampu ke
posisi ON. Amati indikator di LCD Wokwi berubah menjadi L:1 dan LED Lampu
menyala.
- Tekan kembali sakelar ke
posisi OFF untuk mematikan aktuator secara real-time.

Gambar
3.6: Pengujian Kontrol Aktuator Jarak Jauh (RPC Switch) pada Mode MANUAL.
3.4 Link
Wokwi
https://wokwi.com/projects/477397826956889089
BAB IV
PENUTUP
4.1
Kesimpulan
Berdasarkan
hasil perancangan, pengodean program, serta pengujian sistem pemantauan
lingkungan dan kontrol otomatis berbasis ESP32 pada platform simulasi Wokwi dan
ThingsBoard Cloud, diperoleh kesimpulan sebagai berikut:
- Mikrokontroler ESP32 berhasil
diintegrasikan dengan sensor DHT22, LDR, dan PIR, LCD 16x2 I2C, serta
aktuator (Relay Kipas, LED Lampu, LED Alarm, Buzzer, dan Push Button)
pada lingkungan simulasi Wokwi.
- Pemrosesan logika lokal (edge
computing) pada mode AUTO berjalan secara real-time: Relay
Kipas aktif otomatis saat suhu melebihi 30,0°C, LED Lampu aktif saat
kondisi ruangan gelap (Lux < 30%) dan terdeteksi gerakan, serta LED
Alarm dan Buzzer aktif memperingatkan bahaya saat suhu kritis melampaui
32,0°C.
- Pengiriman data telemetri
multi-parameter berbasis JSON ke ThingsBoard Cloud via protokol MQTT pada
topik v1/devices/me/telemetry berjalan stabil dengan interval pembaruan
setiap 2 detik.
- Layanan Remote Procedure
Call (RPC) ThingsBoard Cloud pada mode MANUAL berhasil mengendalikan
sakelar Relay Kipas (setFan) dan LED Lampu (setLamp) secara jarak jauh
dari UTS IoT Dashboard.
4.2
Saran
Beberapa
saran yang dapat diterapkan untuk pengembangan sistem lebih lanjut
meliputi:
- Pengujian dapat dilanjutkan
menggunakan perangkat keras (hardware) ESP32 fisik untuk menguji
performa sensor, keterlambatan (latency) jaringan Wi-Fi, dan
responsivitas aktuator pada kondisi lingkungan riil.
- Penggunaan protokol komunikasi
terenkripsi MQTT over TLS/SSL (Port 8883) untuk meningkatkan keamanan
enkripsi data telemetri dan kendali RPC dari ancaman penyadapan data pada
jaringan publik.
- Penambahan modul penyimpanan
lokal seperti MicroSD Card untuk mencatat riwayat data sensor (data
logging) secara mandiri apabila koneksi jaringan internet terputus.
DAFTAR PUSTAKA
Arduino.
(2026). Arduino ESP32 Core Documentation. Dokumentasi Resmi
Arduino.
Espressif
Systems. (2024). ESP32 Series Technical Reference Manual. Espressif
Systems Documentation.
Fielding,
R., & Reschke, J. (2014). Hypertext Transfer Protocol (HTTP/1.1):
Semantics and Content. RFC 7231.
Gubbi, J.,
Buyya, R., Marusic, S., & Palaniswami, M. (2013). Internet of Things
(IoT): A vision, architectural elements, and future directions. Future
Generation Computer Systems, 29(7), 1645-1660.
Kurniawan,
N. Y. (2026). Modul 04: Mengenal ESP32 dan Mode WiFi - Bluetooth (Praktek
WebServer & MQTT). Materi Praktikum Internet of Things.
ThingsBoard.
(2026). ThingsBoard IoT Platform Documentation: MQTT Device API & RPC
Reference. ThingsBoard Cloud Docs.
Wokwi.
(2026). Wokwi Online ESP32 Simulator Documentation. Dokumentasi
Simulator Wokwi.
Tidak ada komentar:
Posting Komentar