Minggu, 06 September 2026

SISTEM DETEKSI OBJEK BERBASIS ARDUINO UNO DAN SISTEM KOMUNIKASI DUA ARAH BERBASIS ESP32 DAN PROTOKOL MQTT

SISTEM DETEKSI OBJEK BERBASIS ARDUINO UNO DAN SISTEM

KOMUNIKASI DUA ARAH BERBASIS ESP32 DAN PROTOKOL MQTT

Mata Kuliah Internet of Things

 

 

 

 

 

 

 

 

 

 

 

 

 

Disusun Oleh:

 

1. Muhammad Naufal Aziz

(24051204001)

2. Muhammad Rifqi Al Hafidh

(24051204009)

3. Ig. Krisna Wijaya Prihandono

(24051204032)

4. Ahmad Syihan Arijuddin

(24051204035)

 

Link Video : https://drive.google.com/file/d/1_4ZpnuIB_nOG-MnX3LqHAPLYgpz02e_z/view?usp=sharing

 

Prodi S1 Teknik Informatika UNIVERSITAS NEGERI SURABAYA


 

 

 

 

  1. Latar Belakang


 

BAB I PENDAHULUAN


 

Perkembangan teknologi komputasi dan mikroelektronika saat ini telah mendorong adopsi sistem cerdas dalam berbagai aspek kehidupan manusia. Dua konsep utama yang terus berkembang adalah sistem otomatisasi lokal berbasis sensor dan sistem komunikasi nirkabel berbasis Internet of Things (IoT). Melalui pemahaman yang mendalam mengenai Organisasi dan Arsitektur Komputer, mahasiswa Teknik Informatika dapat menganalisis bagaimana instruksi program dieksekusi secara efisien oleh prosesor pada unit mikrokontroler.

Laporan ini membahas implementasi dua sistem IoT yang dikembangkan oleh Kelompok 1. Sistem pertama adalah sistem deteksi objek lokal berbasis Arduino Uno. Sistem ini memanfaatkan sensor ultrasonik HC-SR04 untuk membaca jarak, motor servo sebagai aktuator fisik, dan LED sebagai indikator visual. Keunggulan teknis sistem pertama ini terletak pada penerapan algoritma timer non-blocking berbasis fungsi 'millis()'. Pendekatan non-blocking sangat penting dalam arsitektur komputer untuk menghindari pemborosan siklus clock CPU akibat instruksi tunggu (blocking delay) yang biasa ditimbulkan oleh fungsi 'delay()'.

Sistem kedua adalah arsitektur IoT dua arah berbasis ESP32 dan protokol MQTT (Message Queuing Telemetry Transport). Dalam sistem ini, ESP32 berperan sebagai node sensor nirkabel yang membaca suhu dan kelembaban udara melalui sensor DHT22, kemudian mengirimkannya dalam format JSON ke broker publik (broker.emqx.io) pada topik 'publish'. Di saat yang bersamaan, ESP32 juga dapat menerima perintah kontrol eksternal dari aplikasi pusat kendali MQTTX pada topik 'led' secara real-time. Kombinasi kedua sistem ini memberikan gambaran komparatif yang komprehensif antara sistem kontrol waktu nyata lokal dan sistem terdistribusi berbasis cloud.

 

 

  1. Rumusan Masalah

    • Bagaimana arsitektur dan konfigurasi pin sistem deteksi objek ultrasonik berbasis Arduino Uno dengan aktuator motor servo dan LED?
    • Bagaimana cara kerja algoritma non-blocking menggunakan fungsi 'millis()' pada Arduino Uno untuk mengendalikan beberapa periferal secara simultan?
    • Bagaimana struktur komunikasi data dua arah berbasis protokol MQTT pada perangkat ESP32 dengan sensor DHT22 dan aktuator LED?
    • Bagaimana mengonfigurasi MQTTX sebagai pusat kendali untuk memantau data sensor serta mengontrol LED pada ESP32 menggunakan payload plaintext maupun JSON?


 

  1. Tujuan Laporan

    • Mendokumentasikan konfigurasi perangkat keras dan pemrograman sistem deteksi objek berbasis Arduino Uno secara presisi.
    • Menganalisis efisiensi algoritma multi-tasking non-blocking menggunakan penunjuk waktu 'millis()' sebagai pengganti 'delay()'.
    • Menjelaskan mekanisme pertukaran data dua arah menggunakan protokol MQTT dengan arsitektur publish dan subscribe.
    • Menyediakan panduan pengaturan MQTTX untuk visualisasi data sensor DHT22 dan pengiriman pesan perintah kontrol ke ESP32.

 

 

  1. Manfaat Penulisan

Penulisan laporan ini diharapkan memberikan manfaat akademis dan praktis. Secara akademis, laporan ini memperjelas keterkaitan teori arsitektur komputer (seperti manajemen interupsi, polling, dan siklus instruksi) dengan penerapannya pada mikrokontroler AVR dan chip Tensilica Xtensa pada ESP32. Secara praktis, rancangan sistem ini dapat menjadi acuan dalam pengembangan sirkuit otomatisasi industri skala kecil atau media pembelajaran sistem tertanam terdistribusi.


 

 

 

 

  1. Dasar Teori


 

BAB II TINJAUAN PUSTAKA


 

Sistem mikrokomputer modern tersusun atas unit pemroses pusat (CPU), memori, serta modul masukan/keluaran (I/O). Pada mikrokontroler tipe sistem chip tunggal (system-on-chip/SoC) seperti ESP32 atau papan pengembangan seperti Arduino Uno, seluruh modul tersebut terintegrasi dalam satu papan sirkuit terpadu. Pengolahan data dari sensor fisik ke sistem kontrol lokal maupun jaringan global memerlukan pemahaman mendalam tentang prinsip-prinsip komunikasi data.

Dalam komunikasi data IoT, protokol MQTT menempati posisi yang sangat penting. MQTT dirancang khusus untuk kondisi bandwidth rendah dan latensi tinggi dengan mengandalkan sebuah 'broker' sebagai mediator pesan. Alur kerjanya terbagi menjadi dua peran utama: 1) Publish, yaitu aksi mengirim pesan dari pengirim ke topik tertentu di broker; dan 2) Subscribe, yaitu mendaftarkan diri pada broker untuk menerima pesan dari topik tertentu secara real-time. Melalui pola ini, perangkat IoT tidak perlu menjaga koneksi peer-to-peer secara langsung, sehingga sangat menghemat daya dan meningkatkan skalabilitas sistem jaringan.

 

 

  1. Komponen

Berikut adalah rincian komponen perangkat keras (hardware) dan

perangkat lunak (software) yang digunakan dalam implementasi kedua sistem simulasi berbasis Wokwi ini:

 

 

No

Nama Perangkat /

Komponen

Fungsi Utama dalam Sistem

1

Arduino Uno

Mikrokontroler 8-bit berbasis ATmega328P untuk kendali lokal

deteksi objek.

2

Sensor HC-SR04

Sensor jarak ultrasonik yang memancarkan gelombang suara 40

kHz.

3

Motor Servo

(SG90)

Aktuator putar untuk merespons objek terdeteksi (gerakan 20°

hingga 160°).

4

LED Indikator

Output visual untuk kedipan (250 ms) di Arduino dan indikator

status di ESP32.

5

Resistor

Hambatan pengaman arus listrik yang mengalir ke LED indikator.

6

ESP32 Board

Mikrokontroler 32-bit dual-core  dengan transceiver Wi-Fi

internal.

7

Sensor DHT22

Sensor digital pengukur suhu (°C) dan kelembaban (%) dengan

protokol serial.

8

Koneksi Wi-Fi

Infrastruktur jaringan nirkabel (SSID: 'Wokwi-GUEST') untuk

ESP32.


 

9

Broker EMQX

Broker MQTT publik (broker.emqx.io) sebagai perantara paket

data.

10

Aplikasi MQTTX

Klien visual untuk pengujian subskripsi data sensor dan kontrol

LED.

11

Kabel Jumper /

Breadboard

Komponen interkoneksi sinyal dan daya antar modul sirkuit.


 

 

 

 

  1. Penjelasan simulasi


 

BAB III PEMBAHASAN


 

 

 

  1. Sistem Deteksi Jarak Lokal Berbasis Arduino Uno

 

 



image


 

Gambar 1. Rangkaian Arduino dan alat-alat lain

Sistem deteksi objek lokal dikembangkan menggunakan papan pengembang Arduino Uno sebagai pusat kendali. Modul sensor jarak ultrasonik HC-SR04 dihubungkan secara elektrik ke pin digital mikrokontroler, dengan pin 'Trigger' dihubungkan ke pin digital 7 dan pin 'Echo' dihubungkan ke pin digital 6. Output dari sistem ini berupa aktuator motor servo pada pin digital 9 dan LED indikator visual pada pin digital 4.

Alur kerja sirkuit ini didasarkan pada interval waktu non-blocking (timer berbasis millis) untuk memastikan bahwa eksekusi loop utama program tidak terganggu oleh jeda waktu (delay). Sensor HC-SR04 diprogram untuk melakukan pembacaan setiap 60 milidetik. Pembacaan dilakukan dengan mengirimkan pulsa HIGH pada pin Trigger selama 10 mikrodetik. Durasi waktu perjalanan pulsa suara balik dibaca menggunakan fungsi 'pulseIn' dengan batas timeout 30.000 mikrodetik. Konversi dari waktu perjalanan pulsa menjadi jarak fisik menggunakan persamaan fisis:

Jarak = (Durasi × 0.0343) / 2

Di mana konstanta 0.0343 merepresentasikan kecepatan rambat gelombang suara di udara dalam satuan cm/μs. Hasil perhitungan dibagi dua karena pulsa menempuh perjalanan bolak-balik dari pemancar menuju permukaan objek lalu memantul kembali ke penerima. Jika jarak objek terdeteksi berada di antara 0 cm hingga batas aktif 20 cm, maka status 'objekTerdeteksi' bernilai 'true'. Kondisi ini memicu motor servo untuk bergerak memutar bolak-balik antara posisi sudut


 

minimal 20° dan sudut maksimal 160° dengan interval pembaruan 15 milidetik (setiap pembaruan merubah posisi sudut sebanyak 2°), serta membuat LED berkedip secara periodik setiap 250 milidetik. Sebaliknya, bila tidak ada objek yang berada di dalam batas jangkauan (≤ 20 cm), status LED langsung diset 'LOW' dan motor servo secara dinamis kembali ke posisi awalnya (20°).

 

 

  1. Sistem Komunikasi Dua Arah Berbasis ESP32 dan MQTT

 

 



image


 

Gambar 2. Rangkaian ESP32 dan alat-alat lain

Sistem komunikasi IoT dua arah memanfaatkan papan pengembang ESP32 yang terhubung ke jaringan nirkabel lokal Wi-Fi. Dalam simulasi ini, ESP32 dikonfigurasi untuk terhubung ke jaringan virtual 'Wokwi-GUEST' tanpa kata sandi. Perangkat keras sensor DHT22 dihubungkan ke pin digital 15 ESP32 untuk mendeteksi suhu dan kelembaban udara. Selain itu, LED indikator eksternal dihubungkan ke pin digital 2 sebagai target kontrol kendali.

ESP32 menjalankan program berbasis MicroPython yang menggunakan pustaka 'umqtt.simple' untuk mengelola koneksi soket ke broker MQTT publik 'broker.emqx.io' pada port 1883. Identifikasi unik klien diatur menggunakan Client ID 'wokwi-micropython'. Alur kerja utama sistem terbagi menjadi dua mekanisme simultan:

  1. Monitoring Lingkungan (Publish): Secara periodik setiap 1 detik, ESP32 menginstruksikan sensor DHT22 untuk melakukan pengukuran fisik. Data suhu (°C) dan kelembaban (%) dibaca secara digital, kemudian disusun ke dalam sebuah variabel dictionary. Dictionary tersebut dikonversi menjadi


 

representasi string dalam format JSON (misalnya, {"temperature": 24.5, "humidity": 60.0}) melalui fungsi 'ujson.dumps()' sebelum dipublikasikan ke   broker   EMQX   pada   topik   bernama 'publish'.

 

  1. Penerimaan Kontrol (Subscribe): Pada waktu yang bersamaan, ESP32 berlangganan (subscribe) secara aktif ke topik bernama 'led'. Ketika broker meneruskan paket data dari topik tersebut, fungsi 'control_callback()' dipicu untuk membaca isi pesan (payload). Logika pemrograman callback dirancang sangat fleksibel dengan menangani dua format pesan: Format Plaintext ('on' / 'off', 'led:on' / 'led:off') dan Format terstruktur JSON (contoh payload: {"device": "led", "action": "on"}). Ketika sinyal 'on' terdeteksi, pin LED diset HIGH (led.value(1)). Sebaliknya, sinyal 'off' diset LOW (led.value(0)).

 

 

 

 

 

  1. Prosedur Pengujian dan Pengaturan MQTTX

Aplikasi klien MQTTX bertindak sebagai pusat pemantauan dan kontrol dalam sistem IoT ini. Berikut adalah langkah-langkah sistematis konfigurasi koneksi dan pengujian:

  1. Inisiasi Koneksi: Buat profil koneksi baru di MQTTX dengan parameter Host 'mqtt://broker.emqx.io' dan Port '1883'. Pastikan Client ID dibiarkan sesuai nilai acak default bawaan (misalnya 'mqttx_3ba6bb31') dan TIDAK

diubah menjadi 'wokwi-micropython' untuk mencegah terjadinya kegagalan koneksi (connection crash) akibat bentrok identitas di broker. Username, Password, dan SSL/TLS dinonaktifkan.

  1. Pemantauan Sensor: Lakukan subscribe ke topik 'publish'. Setelah berhasil terhubung, MQTTX akan menerima paket data suhu dan kelembaban dalam bentuk pesan JSON secara berkala dan menampilkannya di panel obrolan.
  2. Pengiriman Perintah (Kontrol LED): Di area pengiriman pesan (Publish

panel), atur target topik ke 'led'. Atur format pesan ke 'Plaintext' dan kirimkan string 'on' untuk menyalakan LED fisik di simulator, atau 'off' untuk

mematikannya. Selain itu, pengujian juga dapat dilakukan dengan mengubah format payload menjadi 'JSON' dan mengirimkan instruksi berupa '{"device": "led", "action": "on"}' atau '{"device": "led", "action": "off"}' yang akan langsung diparsing oleh fungsi callback ESP32.


 

  1. Progam

Berikut adalah kode program lengkap yang digunakan dalam proyek implementasi sistem IoT ini. Kode program ditulis dan didefinisikan secara presisi untuk masing-masing mikrokontroler.

 

Kode Sumber 1. Pemrograman Non-Blocking Arduino Uno (C++)

 #include <Servo.h>


// =============================

// KONFIGURASI PIN

// =============================


const int trigPin = 7; const int echoPin = 6; const int ledPin = 4; const int servoPin = 9;


// Jarak aktivasi dalam centimeter const int jarakAktif = 20;


// =============================

// SERVO

// =============================


Servo servoMotor;


int posisiServo = 20; int arahServo = 1;


// Batas gerakan servo const int servoMin = 20; const int servoMax = 160;


// =============================

// TIMER

// =============================


unsigned long waktuServoTerakhir = 0; unsigned long waktuLedTerakhir = 0; unsigned long waktuSensorTerakhir = 0;


// Kecepatan gerakan servo

const unsigned long intervalServo = 15;


// Kecepatan kedip LED

const unsigned long intervalLed = 250;


// Interval pembacaan sensor

const unsigned long intervalSensor = 60;

// =============================

// STATUS

// =============================


bool statusLed = false;

bool objekTerdeteksi = false; float jarak = 0;

// =============================

// SETUP

// =============================


void setup() {


Serial.begin(9600);


pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);


pinMode(ledPin, OUTPUT); servoMotor.attach(servoPin);

// Posisi awal servo servoMotor.write(servoMin);


// LED awal mati digitalWrite(ledPin, LOW);


Serial.println("Sistem dimulai...");

}


// =============================

// LOOP

// =============================


void loop() { bacaSensor();

if (objekTerdeteksi) { gerakkanServo(); kedipkanLed();

} else {


// Matikan LED digitalWrite(ledPin, LOW);

statusLed = false;


// Servo kembali ke posisi awal posisiServo = servoMin; servoMotor.write(posisiServo);

}

}


// =============================

// MEMBACA HC-SR04

// =============================


void bacaSensor() {


unsigned long waktuSekarang = millis();


if (waktuSekarang - waktuSensorTerakhir >= intervalSensor) { waktuSensorTerakhir = waktuSekarang;

// Pastikan TRIG LOW digitalWrite(trigPin, LOW); delayMicroseconds(2);


// Kirim pulse 10 microsecond digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);


// Membaca pantulan

long durasi = pulseIn(echoPin, HIGH, 30000);


// Jika tidak ada pantulan if (durasi == 0) {


jarak = -1; objekTerdeteksi = false;


} else {


// Mengubah waktu menjadi jarak (cm) jarak = durasi * 0.0343 / 2;


// Mengecek apakah objek berada

// dalam batas jarak

if (jarak > 0 && jarak <= jarakAktif) { objekTerdeteksi = true;

} else {


objekTerdeteksi = false;

}

}


// Tampilkan jarak pada Serial Monitor Serial.print("Jarak: ");


if (jarak == -1) { Serial.println("Tidak terdeteksi");

} else { Serial.print(jarak); Serial.println(" cm");

}

}

}


// =============================

// GERAKAN SERVO

// =============================


void gerakkanServo() {


unsigned long waktuSekarang = millis();


if (waktuSekarang - waktuServoTerakhir >= intervalServo) { waktuServoTerakhir = waktuSekarang;

posisiServo += arahServo * 2;


// Sampai batas kanan

if (posisiServo >= servoMax) {


posisiServo = servoMax; arahServo = -1;

}


// Sampai batas kiri

else if (posisiServo <= servoMin) {


posisiServo = servoMin; arahServo = 1;

}


servoMotor.write(posisiServo);

}

}


// =============================

// LED BERKEDIP

// =============================


void kedipkanLed() {

unsigned long waktuSekarang = millis();


if (waktuSekarang - waktuLedTerakhir >= intervalLed) { waktuLedTerakhir = waktuSekarang;

statusLed = !statusLed;


digitalWrite(ledPin, statusLed);

}

}


Kode Sumber 2. Pemrograman Komunikasi ESP32 & MQTT (MicroPython)

import network import time

from umqtt.simple import MQTTClient import dht

from machine import Pin import ujson


ssid = 'Wokwi-GUEST' password = ''

mqtt_server = 'broker.emqx.io' client_id = 'wokwi-micropython' topic = 'publish'

topic_control = 'led'


DHT_PIN = 15

LED_PIN = 2


dht_pin = Pin(DHT_PIN) sensor = dht.DHT22(dht_pin) led = Pin(LED_PIN, Pin.OUT) led.value(0)


wifi = network.WLAN(network.STA_IF) wifi.active(True)

wifi.connect(ssid, password) while not wifi.isconnected():

time.sleep(0.5)

print('WiFi connected, IP:', wifi.ifconfig()[0]) def control_callback(topic_recv, msg):

try:

print('Control message received:', topic_recv, msg)

text = msg.decode() if isinstance(msg, (bytes, bytearray)) else str(msg)

t = text.strip().lower()

if t == 'on' or t == 'led:on': led.value(1)

print('LED turned ON') return

if t == 'off' or t == 'led:off': led.value(0)

print('LED turned OFF') return


try:

js = ujson.loads(text) if isinstance(js, dict):

if js.get('device') == 'led' and js.get('action')

== 'on':

led.value(1)

print('LED turned ON (json)')

elif js.get('device') == 'led' and js.get('action')

== 'off':

led.value(0)

print('LED turned OFF (json)') except Exception:

pass

except Exception as e:

print('Error in control callback:', e)


client = MQTTClient(client_id, mqtt_server, port=1883) client.set_callback(control_callback)

client.connect() client.subscribe(topic_control)

print('Connected to MQTT broker and subscribed to', topic_control)


while True: try:

try:

client.check_msg()

except Exception as e:

print('MQTT check_msg error:', e)


sensor.measure()

temp = sensor.temperature() hum = sensor.humidity()

data = {'temperature': temp, 'humidity': hum} print('Publish:', data) client.publish(topic, ujson.dumps(data))

except Exception as e:

print('Failed to read/publish:', e) time.sleep(1)


  1. Kesimpulan

BAB IV PENUTUP


 

Berdasarkan hasil perancangan, implementasi program, dan simulasi yang telah dilaksanakan, dapat ditarik beberapa kesimpulan akademis sebagai berikut:

  1. Sistem deteksi objek lokal berbasis Arduino Uno berhasil diimplementasikan dengan memanfaatkan sensor HC-SR04, motor servo, dan LED. Logika non-blocking menggunakan fungsi 'millis()' terbukti efektif menggantikan fungsi 'delay()' yang bersifat blocking. Dengan demikian, prosesor dapat membagi siklus kerjanya untuk menggerakkan servo (setiap 15 ms), mengedipkan LED (setiap 250 ms), dan membaca jarak sensor (setiap 60 ms) secara simultan.
  2. Sistem komunikasi IoT dua arah berbasis ESP32 berhasil dibangun menggunakan protokol MQTT. Data fisik lingkungan berupa suhu dan kelembaban berhasil diukur oleh sensor DHT22 dan dikirimkan secara periodik setiap 1 detik dalam format data JSON yang terstruktur (menggunakan 'ujson.dumps') ke topik 'publish' pada broker EMQX.
  3. Mekanisme subscribe pada topik 'led' dan eksekusi callback pada ESP32 berhasil menerima instruksi dari aplikasi pusat kendali MQTTX. Sistem secara adaptif mengenali input perintah baik dalam format Plaintext standar ('on'/'off') maupun format JSON terstruktur ('{"device": "led", "action": "on"}') untuk memicu perubahan tingkat tegangan (HIGH/LOW) pada pin LED.

 

  1. Saran

Untuk pengembangan dan penelitian sistem lebih lanjut, beberapa saran konstruktif yang dapat diajukan adalah:

  1. Aspek Keamanan: Mengingat broker EMQX publik (broker.emqx.io) tidak mensyaratkan otentikasi kata sandi dan enkripsi data, pengembangan

selanjutnya disarankan menggunakan broker privat yang mendukung protokol MQTTS (MQTT over SSL/TLS) serta otentikasi username/password untuk

mencegah penyadapan data sensor dan pengambilalihan kontrol aktuator.

  1. Antarmuka Pengguna: Integrasi dengan platform visualisasi (dashboard) seperti Node-RED, Blynk, atau Grafana dapat diterapkan untuk menyajikan data sensor secara grafis dan menyediakan tombol kontrol interaktif yang lebih ramah pengguna (user-friendly) dibandingkan antarmuka terminal

MQTTX.

  1. Skalabilitas Sistem: Pemanfaatan mode deep-sleep pada ESP32 dapat dikaji untuk mengoptimalkan efisiensi konsumsi energi, khususnya ketika sistem diimplementasikan pada perangkat bertenaga baterai di lapangan.


 

DAFTAR PUSTAKA

EMQX Team. (2024). MQTTX: Cross-platform MQTT 5.0 Desktop Client. EMQ Technologies Co., Ltd. Retrieved from https://mqttx.app/

Kurniawan, A. (2020). IoT Projects with ESP32 and MicroPython: Learning System-on-Chip Programming. Jakarta: Penerbit Informatika.

Stallings, W. (2018). Computer Organization and Architecture: Designing for Performance (10th ed.). Boston: Pearson Education.

Tanenbaum, A. S., & Austin, T. (2013). Structured Computer Organization (6th ed.).

Boston: Pearson.

Wokwi. (2024). Wokwi: Embedded System Simulator Online. Retrieved from https://wokwi.com/

Tidak ada komentar:

Posting Komentar