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
- 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.
-
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?
-
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.
-
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.
- 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.
-
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. |
- Penjelasan simulasi
BAB III PEMBAHASAN
-
Sistem Deteksi Jarak Lokal Berbasis Arduino Uno
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°).
-
Sistem Komunikasi Dua Arah Berbasis ESP32 dan MQTT
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:
- 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'.
- 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)).
-
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:
- 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.
- 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.
- 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.
-
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)
- Kesimpulan
BAB IV PENUTUP
Berdasarkan hasil perancangan, implementasi program, dan simulasi yang telah dilaksanakan, dapat ditarik beberapa kesimpulan akademis sebagai berikut:
- 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.
- 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.
- 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.
-
Saran
Untuk pengembangan dan penelitian sistem lebih lanjut, beberapa saran konstruktif yang dapat diajukan adalah:
- 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.
- 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.
- 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