Minggu, 11 Oktober 2026

SISTEM MONITORING LINGKUNGAN DAN KONTROL OTOMATIS BERBASIS ESP32 TERINTEGRASI THINGSBOARD CLOUD VIA PROTOKOL MQTT

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:

  1. Pendaftaran perangkat uts_iot dan pengaturan kredensial otentikasi di ThingsBoard Cloud. 
  2. Eksekusi program di Wokwi untuk menghubungkan ESP32 ke Wi-Fi Wokwi-GUEST dan broker mqtt.thingsboard.cloud. 
  3. 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. 
  4. 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

  1. Buka peramban web (browser) dan lakukan login ke akun ThingsBoard Cloud. 
  2. Navigasi ke menu Entities > Devices, lalu klik tombol + (Add new device). 
  3. Masukkan nama perangkat uts_iot. 
  4. Pada jendela pengaturan kredensial, pilih metode otentikasi Access Token atau MQTT Basic dan salin kredensial rahasia perangkat. 
  5. 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

  1. Buka lembar kerja proyek simulasi ESP32 pada platform Wokwi. 
  2. Masukkan kode program C++ lengkap yang sudah memuat kredensial ThingsBoard Cloud ke dalam file sketch.ino. 
  3. Tekan tombol Start Simulation (ikon Play hijau). 
  4. Amati tampilan layar LCD 16x2 hingga menampilkan status inisialisasi awal dan masuk ke tampilan utama. 
  5. 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)

  1. Pastikan sistem berada dalam mode AUTO (ditandai huruf A pada pojok kanan atas layar LCD).
  2. 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. 
  3. Naikkan suhu melebihi 32.0°C untuk memicu kondisi alarm kritis. Amati LED Alarm menyala merah dan Buzzer berbunyi peringatan.
  4. 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.
  5. 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

  1. Navigasi ke menu Dashboards di ThingsBoard Cloud, lalu buat dashboard baru dengan nama UTS IoT Dashboard.
  2. Tambahkan widget Timeseries Line Chart untuk memvisualisasikan grafik histori parameter suhu, kelembaban, dan cahaya.
  3. Tambahkan dua widget Switch Control dari kategori Control Widgets.
  4. Konfigurasikan sakelar pertama sebagai Kontrol Kipas dengan RPC set value method: setFan.
  5. Konfigurasikan sakelar kedua sebagai Kontrol Lampu dengan RPC set value method: setLamp.
  6. 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)

  1. Tekan tombol push button fisik pada papan Wokwi untuk berpindah dari mode AUTO ke mode MANUAL (ditandai huruf M pada pojok kanan atas LCD).
  2. Buka UTS IoT Dashboard di ThingsBoard Cloud secara berdampingan dengan layar Wokwi.
  3. Tekan sakelar Kontrol Kipas ke posisi ON. Amati indikator di LCD Wokwi berubah menjadi F:1 dan modul Relay menyala. 
  4. Tekan sakelar Kontrol Lampu ke posisi ON. Amati indikator di LCD Wokwi berubah menjadi L:1 dan LED Lampu menyala. 
  5. 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: 

  1. 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. 
  2. 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. 
  3. 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. 
  4. 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: 

  1. 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. 
  2. 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. 
  3. 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