SISTEM COUNTER ANTREAN ESP32
TERINTEGRASI THINGSBOARD
Disusun Oleh:
Ramdani Mulyadi 24051204137
Naufal Alif Prasetya 24051204126
Syauqi Ihsan Ramadhan 24051204110
Luthfi Fadli Zainuddin 24051204200
BAB I
PENDAHULUAN
1.1 Latar Belakang
Antrean
merupakan bagian dari pelayanan di loket administrasi, klinik, bank, dan kantor
pelayanan publik. Jika dikelola secara manual, misalnya dengan memanggil nomor
secara lisan atau mencatatnya di kertas, antrean mudah menimbulkan kebingungan
karena nomor dapat terlewat atau terpanggil dua kali, dan pengunjung tidak
mengetahui posisinya. Perkembangan Internet of Things (IoT) memungkinkan
perangkat elektronik terhubung ke internet dan mengirim datanya ke server untuk
dipantau dari jarak jauh. ESP32 banyak dipakai untuk keperluan ini karena
memiliki modul WiFi bawaan, banyak pin input/output, dan mudah diprogram dengan
Arduino IDE. Data dari perangkat tersebut dapat diterima, disimpan, dan
ditampilkan oleh platform IoT seperti ThingsBoard Cloud melalui protokol MQTT,
sehingga kondisi perangkat dapat dilihat kapan saja tanpa berada di lokasi.
Pada praktikum ini dirancang Sistem
Counter Antrean berbasis ESP32 yang disimulasikan di Wokwi. Sistem memakai
tombol NEXT untuk menaikkan nomor antrean dan tombol RESET untuk
mengembalikannya ke nol. Nomor antrean ditampilkan pada LCD 16x2, sedangkan buzzer
dan LED memberi tanda setiap kali nomor berubah. Setiap perubahan nomor juga
dikirim ke ThingsBoard Cloud dalam format JSON melalui jaringan WiFi, sehingga
nomor antrean dapat dipantau secara daring. Melalui project ini, mahasiswa
mempelajari perakitan rangkaian, pemrograman mikrokontroler, dan integrasi
layanan IoT dalam satu sistem yang utuh.
1.2 Rumusan Masalah
Berdasarkan
latar belakang yang telah diuraikan, maka rumusan masalah dalam praktikum ini
adalah sebagai berikut:
- Bagaimana merancang rangkaian sistem counter
antrean menggunakan ESP32, LCD 16x2, tombol NEXT dan RESET, buzzer, serta
LED pada simulator Wokwi?
- Bagaimana membuat program pada ESP32 agar
nomor antrean bertambah saat tombol NEXT ditekan dan kembali ke nol saat
tombol RESET ditekan?
- Bagaimana menampilkan nomor antrean pada LCD
serta memberi notifikasi melalui buzzer dan LED setiap kali nomor berubah?
- Bagaimana menghubungkan ESP32 ke jaringan
WiFi dan mengirim data nomor antrean ke ThingsBoard Cloud menggunakan
protokol MQTT?
- Bagaimana menguji bahwa sistem berjalan
sesuai rancangan, baik pada tampilan perangkat maupun pada data yang
diterima ThingsBoard?
1.3 Manfaat Praktikum
Manfaat
yang diperoleh dari praktikum ini antara lain:
- Mahasiswa memahami cara merangkai ESP32
dengan LCD 16x2, tombol, buzzer, dan LED, termasuk penggunaan resistor
pembatas arus pada LED dan konfigurasi INPUT_PULLUP pada tombol.
- Mahasiswa mampu memprogram ESP32 untuk
membaca input tombol dengan penanganan debounce, mengendalikan output, dan
menampilkan teks pada LCD.
- Mahasiswa memahami cara kerja koneksi WiFi
pada ESP32 serta pengiriman data telemetri dengan protokol MQTT
menggunakan library PubSubClient.
- Mahasiswa mengenal platform ThingsBoard
Cloud sebagai tempat menerima dan memantau data dari perangkat IoT.
- Mahasiswa terbiasa menggunakan simulator
Wokwi untuk merancang dan menguji sistem tanpa perangkat keras fisik.
- Hasil praktikum dapat menjadi dasar
pengembangan sistem antrean yang lebih lengkap, misalnya dengan tampilan
dashboard, beberapa loket, atau penyimpanan riwayat antrean.
1.4 Batasan Masalah
Agar
pembahasan lebih terarah, maka batasan masalah dalam praktikum ini adalah:
- Sistem dirancang dan diuji pada simulator
Wokwi menggunakan board ESP32 DevKit C V4, tanpa perangkat keras fisik.
- Sistem hanya mengelola satu loket (Loket 1)
dengan nomor antrean yang dimulai dari 0, dikendalikan oleh dua tombol:
NEXT untuk menaikkan nomor dan RESET untuk mengembalikannya ke 0.
- Output lokal berupa LCD 16x2, satu buzzer,
dan satu LED sebagai penanda saat nomor berubah, tanpa pemanggilan nomor
dengan suara.
- Koneksi internet memakai jaringan WiFi
simulasi Wokwi-GUEST. Jika koneksi gagal, sistem berhenti dan menampilkan
pesan kegagalan.
- Data dikirim satu arah dari perangkat ke
ThingsBoard Cloud melalui protokol MQTT (port 1883) dalam format JSON
dengan satu data telemetri, yaitu nomor_antrean. Pembahasan ThingsBoard
terbatas pada penerimaan dan pemantauan data.
- Pemrograman memakai bahasa C/C++ (Arduino
framework) dengan library LiquidCrystal, WiFi, dan PubSubClient.
BAB II
TINJAUAN PUSTAKA
2.1 Internet of Things
Internet of Things (IoT)
menghubungkan perangkat dengan layanan jaringan agar data dari perangkat dapat
dikirim dan dipantau dari jarak jauh. Pada praktikum ini, data berasal dari
perubahan nomor antrean akibat penekanan tombol. ESP32 mengolah input tersebut,
menampilkan nomor pada LCD, dan mengirimkannya ke ThingsBoard Cloud. Penerapan
IoT pada sistem ini menggabungkan kendali lokal dengan pemantauan daring,
dengan komunikasi data satu arah dari perangkat menuju platform IoT.
2.2 Sistem Counter Antrean
Sistem counter antrean merupakan
sistem pencacah yang menyimpan dan menampilkan nomor pelayanan yang sedang
dipanggil. Nilai pencacah bertambah satu ketika petugas menekan tombol NEXT dan
kembali ke nol ketika tombol RESET ditekan. Dalam rancangan ini, variabel
nomorAntrean menyimpan nilai pencacah untuk satu loket, yaitu Loket 1. Sistem
belum mengelola penerbitan tiket, jumlah pengunjung yang menunggu, ataupun
pembagian antrean ke beberapa loket. Oleh karena itu, nomor yang ditampilkan
menunjukkan urutan panggilan, bukan jumlah orang dalam antrean.
2.3 ESP32 dan GPIO
ESP32 merupakan mikrokontroler
dengan konektivitas WiFi yang dapat digunakan untuk mengolah input digital dan
mengendalikan perangkat keluaran. General Purpose Input/Output (GPIO)
memungkinkan pin dikonfigurasi sebagai input atau output sesuai fungsi rangkaian
(Espressif Systems, n.d.-a, n.d.-b). Pada sistem ini, ESP32 membaca dua tombol,
memperbarui nomor antrean, mengendalikan LCD, LED, dan buzzer, serta
menjalankan klien MQTT. Pemrograman dilakukan menggunakan bahasa C/C++ dengan
framework Arduino. Pembagian fungsi tersebut menjadikan ESP32 sebagai pusat
pengendali sekaligus penghubung sistem antrean dengan layanan cloud.
2.4 Push Button dan INPUT_PULLUP
Push button memberikan input
melalui perubahan kondisi kontak saat ditekan. Konfigurasi INPUT_PULLUP
mengaktifkan resistor pull-up internal sehingga pin berada pada kondisi HIGH
ketika tombol tidak ditekan. Ketika tombol menghubungkan pin ke GND, nilai pembacaan
berubah menjadi LOW (Espressif Systems, n.d.-a). Dengan demikian, input tombol
pada rangkaian ini bersifat aktif rendah. Tombol NEXT terhubung ke GPIO 19,
sedangkan RESET terhubung ke GPIO 18. Konfigurasi ini membantu menjaga
kestabilan nilai input saat tombol dilepas dan tidak memerlukan resistor
pull-up eksternal.
2.5 Debounce dan Edge Detection
Kontak mekanis tombol dapat
menghasilkan beberapa perubahan sinyal singkat ketika ditekan atau dilepas.
Gejala ini disebut bouncing dan dapat menyebabkan satu penekanan terbaca
sebagai beberapa aksi. Debounce digunakan untuk mengonfirmasi bahwa kondisi tombol
telah stabil sebelum diproses. Pada kode Bab III, konfirmasi dilakukan dengan
jeda 50 milidetik dan pembacaan ulang kondisi LOW.
Edge detection mendeteksi perubahan
dari HIGH menjadi LOW dengan membandingkan status tombol sekarang dan
sebelumnya. Setelah aksi diproses, status sebelumnya diperbarui agar tombol
yang terus ditahan tidak langsung dianggap sebagai penekanan baru pada setiap
perulangan. Kedua mekanisme ini mendukung pembacaan satu aksi per penekanan.
Namun, penggunaan delay tetap membatasi respons terhadap penekanan yang sangat
cepat; kestabilannya perlu dinilai melalui pengujian pada interval penekanan
yang berbeda.
2.6 LCD 16x2 dan Library LiquidCrystal
LCD 16x2 merupakan layar karakter
dengan dua baris yang masing-masing dapat menampilkan 16 karakter. Library
LiquidCrystal menyediakan fungsi untuk mengatur ukuran layar, posisi kursor,
pembersihan tampilan, dan penulisan karakter pada LCD yang kompatibel dengan
pengendali HD44780 (Arduino, n.d.). Rangkaian pada praktikum menggunakan mode
paralel empat bit: pin RS dan E sebagai kendali serta D4–D7 sebagai jalur data.
Konstruktor LiquidCrystal lcd(22, 21, 17, 16, 4, 2) mengikuti urutan RS, E, D4,
D5, D6, dan D7. LCD menampilkan salam pembuka, status koneksi WiFi, nomor
antrean, serta pesan saat antrean direset.
2.7 LED Buzzer dan Resistor
LED memberikan indikator visual,
sedangkan buzzer memberikan indikator suara ketika sistem memproses tombol.
Pada rancangan Bab III, LED terhubung ke GPIO 15 dan buzzer ke GPIO 5. Fungsi
notifBunyi() mengaktifkan keduanya selama sekitar 200 milidetik, kemudian
mematikannya kembali. Notifikasi ini menjadi konfirmasi bagi petugas bahwa aksi
telah diterima. Buzzer digunakan sebagai penanda singkat dan belum menghasilkan
pemanggilan nomor dalam bentuk suara manusia. Resistor 220 Ω dipasang pada
jalur LED untuk membatasi arus. Saat koneksi WiFi awal gagal, program
menggunakan kedua indikator sebagai peringatan selama satu detik sebelum
menghentikan proses.
2.8 WiFi pada Simulator Wokwi
WiFi menyediakan koneksi jaringan
agar ESP32 dapat berkomunikasi dengan layanan internet. Library WiFi pada
Arduino-ESP32 menyediakan fungsi untuk memulai koneksi dan memeriksa statusnya
(Espressif Systems, n.d.-b). Simulator Wokwi menyediakan jaringan virtual
Wokwi-GUEST yang dapat digunakan tanpa kata sandi untuk pengujian komunikasi
internet (Wokwi, n.d.-b).
Pada program praktikum, ESP32
memulai koneksi melalui WiFi.begin(ssid, password), kemudian memeriksa apakah
status telah menjadi WL_CONNECTED. Percobaan awal dibatasi oleh penghitung
waktu. Jika gagal, LCD menampilkan pesan kegagalan dan program berhenti pada
perulangan tak berhingga. WiFi menyediakan jalur jaringan, sedangkan pengiriman
nomor antrean ke layanan cloud menggunakan MQTT.
2.9 MQTT dan Library PubSubClient
MQTT menggunakan pola
publish/subscribe, yaitu klien menerbitkan pesan ke suatu topik melalui broker,
kemudian pesan dapat diteruskan kepada pihak yang berlangganan. PubSubClient
menyediakan fungsi klien MQTT untuk mengatur server, membuat koneksi, menerbitkan
pesan, dan memelihara komunikasi melalui loop() (O’Leary, n.d.). Pada kode Bab
III, ESP32 menjadi pengirim telemetri melalui client.publish(). Fungsi
reconnect() mencoba membangun kembali koneksi ketika klien terputus. Percobaan
ulang dilakukan dalam perulangan yang menunggu sampai koneksi berhasil,
sehingga pembacaan tombol dapat tertunda ketika server belum dapat dijangkau.
2.10 ThingsBoard Cloud dan Autentikasi Perangkat
ThingsBoard Cloud menerima data
dari perangkat IoT dan menyediakan antarmuka untuk pemantauannya. Perangkat
pada praktikum didaftarkan dengan nama Antrean-Loket1. Access token digunakan
sebagai identitas autentikasi perangkat dan dikirim sebagai username saat
membentuk koneksi MQTT (ThingsBoard, n.d.-a). Token perlu sesuai dengan
perangkat yang didaftarkan agar data terhubung dengan identitas yang benar. Bab
III menggunakan konfigurasi MQTT pada port 1883 tanpa TLS. Pemantauan yang
didokumentasikan dilakukan melalui status perangkat dan tab Latest Telemetry.
Widget dashboard khusus dan pengelolaan beberapa loket merupakan ruang
pengembangan berikutnya.
2.11 JSON dan Data Telemetri
JavaScript Object Notation (JSON)
menyusun data dalam pasangan kunci dan nilai. Pada sistem ini, kunci
nomor_antrean mewakili nomor panggilan saat ini, sedangkan nilainya berupa
bilangan bulat. Contoh payload {"nomor_antrean":3} menyatakan bahwa
nomor antrean terkini adalah 3. ThingsBoard menerima pesan telemetri melalui
topik v1/devices/me/telemetry dan menampilkan nilai yang diterima pada
perangkat terkait (ThingsBoard, n.d.-b).
Fungsi kirimKeThingsboard()
dipanggil setelah aksi NEXT atau RESET diproses. Pengiriman bersifat berbasis
kejadian, bukan pembacaan sensor secara periodik. Tampilan daring bergantung
pada pesan yang berhasil diterima server; perubahan LCD saja belum membuktikan
bahwa nilai terbaru sudah tersimpan di ThingsBoard. Karena itu, pemeriksaan
nilai dan waktu pembaruan pada Latest Telemetry diperlukan dalam pengujian.
2.12 Simulator Wokwi dan Prinsip Kerja Sistem
Wokwi menyediakan lingkungan
simulasi ESP32 dan komponen pendukung sehingga rangkaian serta program dapat
diuji tanpa perangkat keras fisik (Wokwi, n.d.-a). Dalam praktikum ini,
simulator digunakan untuk merangkai ESP32, LCD, dua tombol, LED, buzzer, dan
resistor. Simulasi membantu pemeriksaan logika program dan komunikasi internet,
sedangkan kinerja pada perangkat nyata tetap memerlukan pengujian tersendiri.
Prinsip kerja sistem dimulai dari inisialisasi pin,
LCD, dan nomorAntrean bernilai 0. ESP32 kemudian menghubungkan diri ke WiFi dan
memelihara koneksi MQTT. Saat tombol NEXT terdeteksi dan dikonfirmasi, nomor
bertambah satu; saat RESET terdeteksi, nomor kembali ke nol. Program
memperbarui LCD, mengaktifkan notifikasi, dan menerbitkan nilai terbaru ke
ThingsBoard. Apabila tidak ada aksi tombol, nomor tetap. Alur ini menghubungkan
input petugas, pengolahan nomor, keluaran lokal, dan pemantauan melalui cloud dalam
satu sistem counter antrean.
BAB III
PEMBAHASAN
3.1
Perancangan Sistem
Sistem yang dirancang pada praktikum ini
merupakan sistem antrean elektronik (queue counter) berbasis Internet of Things
menggunakan ESP32. Sistem ini menggantikan pemanggilan nomor antrean secara
manual dengan sebuah perangkat yang dioperasikan melalui dua tombol tekan,
yaitu tombol NEXT untuk memanggil nomor berikutnya dan tombol RESET untuk
mengembalikan nomor antrean ke posisi awal. Nomor antrean yang sedang berjalan
ditampilkan secara langsung pada layar LCD 16x2, disertai indikator LED dan
buzzer sebagai notifikasi setiap kali tombol ditekan. Selain ditampilkan secara
lokal, nomor antrean juga dikirim secara nirkabel melalui WiFi menuju platform
ThingsBoard Cloud menggunakan protokol MQTT, sehingga kondisi antrean dapat
dipantau dari jarak jauh. Secara umum, sistem terdiri dari empat bagian utama,
yaitu :
- Input,
berupa dua tombol tekan (push button) NEXT dan RESET yang dibaca oleh
ESP32.
- Processing,
berupa ESP32 yang mengolah status tombol dan memperbarui nomor antrean.
- Output,
berupa LCD 16x2, LED, dan buzzer sebagai tampilan dan indikator lokal.
- Monitoring,
berupa dashboard ThingsBoard Cloud yang menerima data nomor antrean
melalui MQTT.
Secara umum, cara kerja sistem Antrean berbasis ESP32
ini dapat dijelaskan melalui langkah-langkah berikut:
- ESP32
dinyalakan, kemudian LCD menampilkan pesan selamat datang pada loket.
- ESP32
mencoba terhubung ke jaringan WiFi, sementara LCD menampilkan status
proses koneksi.
- Jika
koneksi WiFi berhasil, ESP32 terhubung ke server MQTT ThingsBoard Cloud
dan LCD menampilkan tampilan utama “Sistem Antrean Nomor: 0”.
- Jika
koneksi WiFi gagal, sistem menghentikan proses dan memberikan peringatan
melalui LED serta buzzer.
- Petugas
loket menekan tombol NEXT untuk memanggil nomor antrean berikutnya.
- ESP32
mendeteksi perubahan sinyal pada tombol NEXT dan melakukan debounce selama
50 milidetik untuk memastikan penekanan tombol valid.
- Nomor
antrean bertambah satu, LCD memperbarui tampilan nomor, LED dan buzzer
aktif sebentar sebagai notifikasi, dan data nomor antrean terbaru dikirim
ke ThingsBoard Cloud melalui protokol MQTT.
- Jika
tombol RESET ditekan, sistem melakukan proses debounce yang sama, nomor
antrean diatur ulang ke 0, LCD menampilkan pesan “PERHATIAN! Antrean
Direset”, dan data terbaru dikirim kembali ke ThingsBoard Cloud.
- Langkah 5
hingga 8 berulang secara terus-menerus selama sistem dalam keadaan aktif,
sehingga data nomor antrean pada dashboard ThingsBoard selalu sesuai
dengan kondisi terbaru di loket.
3.2
Alat dan Komponen
Komponen yang digunakan dalam simulasi sistem
adalah sebagai berikut :
|
No |
Komponen |
Jumlah |
Fungsi |
|
1 |
ESP32 DevKit V4 |
1 |
Mikrokontroler utama |
|
2 |
LCD 16x2 (mode paralel) |
1 |
Menampilkan status dan nomor antrean |
|
3 |
Push Button |
2 |
Input tombol NEXT dan RESET |
|
4 |
LED |
1 |
Indikator visual saat tombol ditekan |
|
5 |
Buzzer |
1 |
Indikator suara saat tombol ditekan |
|
6 |
Resistor 220 Ω |
1 |
Pembatas arus LED |
|
7 |
Breadboard |
1 |
Media perancangan rangkaian |
|
8 |
Kabel jumper |
Secukupnya |
Penghubung antar-komponen |
|
9 |
Komputer/Laptop |
1 |
Menjalankan simulator Wokwi |
|
10 |
Akun ThingsBoard Cloud |
1 |
Platform monitoring data IoT |
Seluruh komponen tersebut dapat
direpresentasikan secara virtual pada simulator Wokwi sehingga tidak memerlukan
perangkat keras fisik pada tahap praktikum, sedangkan pengiriman data ke
ThingsBoard Cloud tetap dapat diuji karena simulator Wokwi menyediakan akses
internet melalui jaringan Wokwi-GUEST.
3.3
Fungsi Masing-Masing Komponen
3.3.1 ESP32
ESP32 berfungsi sebagai pusat pengendali
sistem. Mikrokontroler membaca status tombol NEXT dan RESET, memperbarui nomor
antrean, menampilkannya pada LCD, mengendalikan LED dan buzzer, serta
mengirimkan data nomor antrean ke ThingsBoard Cloud melalui WiFi dan protokol
MQTT.
3.3.2 LCD 16x2
LCD 16x2 digunakan untuk menampilkan
informasi kepada pengguna secara langsung. LCD dioperasikan dalam mode paralel
menggunakan pin RS, E, dan empat jalur data (D4–D7) yang terhubung ke ESP32.
Tampilan yang ditunjukkan antara lain:
●
Salam pembuka “SELAMAT DATANG - LOKET 1” saat
sistem baru dinyalakan.
●
Nomor antrean yang sedang berjalan, misalnya
“Sistem Antrean Nomor: 3”.

Gambar 3.2 Tampilan LCD Menunjukkan
Nomor Antrean saat Simulasi Berjalan
3.3.3 LED
Satu LED digunakan sebagai indikator visual
setiap kali sistem memproses aksi dari tombol.
●
LED menyala sesaat (±200 ms) ketika tombol NEXT
ditekan dan nomor antrean bertambah.
●
LED menyala sesaat (±200 ms) ketika tombol RESET
ditekan dan nomor antrean kembali ke 0.
●
LED tetap mati apabila tidak ada tombol yang
ditekan.
Penggunaan LED memungkinkan pengguna
mengetahui bahwa penekanan tombol telah direspons oleh sistem, bahkan tanpa
harus melihat layar LCD.
3.3.4 Buzzer
Buzzer berfungsi sebagai indikator suara.
Buzzer dibunyikan secara singkat bersamaan dengan LED setiap kali tombol NEXT
atau RESET berhasil ditekan, sebagai konfirmasi bahwa aksi telah diterima oleh
sistem.
3.3.5 Resistor
Resistor digunakan pada jalur LED untuk
membatasi arus listrik yang mengalir sehingga LED dapat beroperasi dengan aman
tanpa risiko kerusakan.
3.3.6 Push Button (NEXT & RESET)
Dua
buah push button digunakan sebagai input utama sistem, yaitu tombol NEXT yang
dihubungkan ke GPIO 19 dan tombol RESET yang dihubungkan ke GPIO 18. Kedua
tombol dipasang dalam mode INPUT_PULLUP sehingga nilai pin bernilai HIGH saat
tombol tidak ditekan dan berubah menjadi LOW saat tombol ditekan. Tombol NEXT
digunakan untuk menambah nomor antrean sebanyak satu, sedangkan tombol RESET
digunakan untuk mengembalikan nomor antrean ke angka nol. Pembacaan status
tombol disertai mekanisme debounce berupa jeda singkat (50 ms) untuk memastikan
satu kali penekanan tidak terhitung lebih dari satu kali.
3.4
Perancangan Rangkaian
Rangkaian sistem dibuat menggunakan ESP32
sebagai mikrokontroler utama. LCD 16x2 dihubungkan menggunakan enam jalur data
ke pin GPIO ESP32, sedangkan tombol NEXT, tombol RESET, LED, dan buzzer
masing-masing dihubungkan ke GPIO lainnya. Konfigurasi pin yang digunakan
adalah:
|
Komponen |
Pin Komponen |
Pin ESP32 |
|
LCD 16x2 |
RS |
GPIO 22 |
|
LCD 16x2 |
E |
GPIO 21 |
|
LCD 16x2 |
D4, D5, D6, D7 |
GPIO 17, 16, 4, 2 |
|
Push Button NEXT |
Sinyal (INPUT_PULLUP) |
GPIO 19 |
|
Push Button RESET |
Sinyal (INPUT_PULLUP) |
GPIO 18 |
|
LED |
Anoda |
GPIO 15 |
|
Buzzer |
Positif |
GPIO 5 |
|
Buzzer |
Negatif |
GND |

Gambar 3.1 Rangkaian Sistem pada
Simulator Wokwi
Tombol NEXT dan RESET dihubungkan dengan mode
INPUT_PULLUP sehingga pin bernilai HIGH saat tombol tidak ditekan dan berubah
menjadi LOW saat tombol ditekan, tanpa memerlukan resistor eksternal. LED
dihubungkan melalui resistor 220 Ω menuju GND. Pada simulator Wokwi, seluruh
rangkaian tersebut dibuat dengan menghubungkan komponen secara langsung pada
breadboard virtual.
3.5
Perancangan Logika Sistem Antrean
Sistem menggunakan variabel nomorAntrean
untuk menyimpan nomor antrean yang sedang berjalan, serta dua variabel bantu
statusNextLama dan statusResetLama untuk mendeteksi perubahan (edge detection)
pada tombol. Logika yang digunakan adalah sebagai berikut:
|
Aksi |
Pemicu |
LED dan Buzzer |
Nomor Antrean |
|
Tombol NEXT ditekan |
Perubahan bacaNext dari HIGH ke LOW, dikonfirmasi ulang setelah jeda 50
ms (debounce) |
Menyala ±200 ms |
Bertambah 1 (nomorAntrean++) |
|
Tombol RESET ditekan |
Perubahan bacaReset dari HIGH ke LOW, dikonfirmasi ulang setelah jeda 50
ms (debounce) |
Menyala ±200 ms |
Kembali ke 0 |
|
Tidak ada tombol ditekan |
bacaNext dan bacaReset tetap bernilai HIGH |
Mati |
Tetap, tidak berubah |
Pendekatan edge detection digunakan agar satu
kali penekanan tombol hanya dihitung sebagai satu aksi, bukan berulang kali
selama tombol masih ditahan. Sebagai contoh, apabila nomorAntrean bernilai 2
dan tombol NEXT ditekan sekali, sistem akan mendeteksi perubahan statusNextLama
dari HIGH menjadi LOW, menunggu 50 ms untuk memastikan tombol benar-benar
tertekan (bukan derau/bouncing), kemudian menambah nomorAntrean menjadi 3,
memperbarui tampilan LCD, membunyikan buzzer dan LED sesaat, serta mengirim
nilai terbaru ke ThingsBoard.
Apabila
tombol RESET ditekan, sistem akan mengubah nomorAntrean menjadi 0, menampilkan
pesan peringatan “PERHATIAN! Antrean Direset” pada LCD selama beberapa saat,
membunyikan buzzer dan LED, lalu kembali menampilkan tampilan utama dan
mengirim ulang data ke ThingsBoard.
3.6
Implementasi Program
Program dibuat menggunakan bahasa pemrograman
C++ dengan framework Arduino pada platform ESP32. Library LiquidCrystal
digunakan untuk mengendalikan LCD 16x2, library WiFi digunakan untuk
menghubungkan ESP32 ke jaringan WiFi, dan library PubSubClient digunakan
sebagai klien MQTT untuk mengirim data ke ThingsBoard Cloud.
Kode
program yang digunakan adalah sebagai berikut:
|
#include <LiquidCrystal.h> #include <WiFi.h> #include <PubSubClient.h> const char* ssid = "Wokwi-GUEST"; const char* password = ""; const char* mqtt_server = "thingsboard.cloud"; const char* TOKEN = "ThingsBoard_Secret_Here"; LiquidCrystal lcd(22, 21, 17, 16, 4, 2); WiFiClient espClient; PubSubClient client(espClient); int pinNext = 19; int pinReset = 18; int pinBuzzer = 5; int pinLed = 15; int nomorAntrean = 0; int statusNextLama = HIGH; int statusResetLama = HIGH; void setup() { Serial.begin(115200); lcd.begin(16, 2); pinMode(pinNext, INPUT_PULLUP); pinMode(pinReset, INPUT_PULLUP); pinMode(pinBuzzer, OUTPUT); pinMode(pinLed, OUTPUT); digitalWrite(pinBuzzer, LOW); digitalWrite(pinLed, LOW); lcd.setCursor(2, 0); lcd.print("SELAMAT DATANG"); lcd.setCursor(5, 1); lcd.print("LOKET 1"); delay(2000); lcd.clear(); lcd.setCursor(1, 0); lcd.print("Menghubungkan"); WiFi.begin(ssid, password); int timeoutCounter = 0; int dotCount = 0; while (WiFi.status() != WL_CONNECTED &&
timeoutCounter < 25) { delay(400); lcd.setCursor(4, 1); lcd.print("ke WiFi"); for (int i = 0; i <=
dotCount; i++) lcd.print("."); for (int i = dotCount + 1; i < 4; i++)
lcd.print(" "); dotCount = (dotCount + 1) % 4; timeoutCounter++; } if (WiFi.status() == WL_CONNECTED) { client.setServer(mqtt_server, 1883); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sukses Terhubung"); lcd.setCursor(4, 1); lcd.print("ke WiFi!"); delay(2000); tampilLayar(); } else { lcd.clear(); lcd.setCursor(1, 0); lcd.print("Gagal Terhubung"); lcd.setCursor(0, 1); lcd.print("Sistem Dimatikan"); digitalWrite(pinBuzzer, HIGH); digitalWrite(pinLed, HIGH); delay(1000); digitalWrite(pinBuzzer, LOW); digitalWrite(pinLed, LOW); while (true) { delay(1000); } } } void reconnect() { while (!client.connected()) { if
(client.connect("ESP32_Antrean_Client", TOKEN, "")) { // Terhubung } else { delay(5000); } } } void kirimKeThingsboard() { if (!client.connected()) { reconnect(); } client.loop(); String payload = "{\"nomor_antrean\":" +
String(nomorAntrean) + "}"; client.publish("v1/devices/me/telemetry",
payload.c_str()); } void tampilLayar() { lcd.clear(); lcd.setCursor(1, 0); lcd.print("Sistem Antrean"); lcd.setCursor(3, 1); lcd.print("Nomor: "); lcd.print(nomorAntrean); } void notifBunyi() { digitalWrite(pinBuzzer, HIGH); digitalWrite(pinLed, HIGH); delay(200); digitalWrite(pinBuzzer, LOW); digitalWrite(pinLed, LOW); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); int bacaNext = digitalRead(pinNext); int bacaReset = digitalRead(pinReset); if (statusNextLama == HIGH && bacaNext == LOW) { delay(50); if (digitalRead(pinNext)
== LOW) { nomorAntrean++; tampilLayar(); notifBunyi(); kirimKeThingsboard(); } } if (statusResetLama == HIGH && bacaReset == LOW) { delay(50); if
(digitalRead(pinReset) == LOW) { nomorAntrean = 0; lcd.clear(); lcd.setCursor(3, 0); lcd.print("PERHATIAN!"); lcd.setCursor(1, 1); lcd.print("Antrean
Direset"); notifBunyi(); delay(1500); tampilLayar(); kirimKeThingsboard(); } } statusNextLama = bacaNext; statusResetLama = bacaReset; } |
3.8
Penjelasan Program
Program
diawali dengan pemanggilan library yang dibutuhkan, yaitu library
LiquidCrystal, WiFi, dan PubSubClient.
|
#include <LiquidCrystal.h> #include <WiFi.h> #include <PubSubClient.h> |
Library
tersebut digunakan untuk menyediakan fungsi kendali LCD, koneksi WiFi, serta
komunikasi MQTT menuju ThingsBoard Cloud.
Selanjutnya
ditentukan objek dan pin yang digunakan:
|
int pinNext = 19; int pinReset = 18; int pinBuzzer = 5; int pinLed = 15; int nomorAntrean = 0; LiquidCrystal lcd(22, 21, 17, 16, 4, 2); |
GPIO
19 digunakan untuk tombol NEXT dan GPIO 18 untuk tombol RESET, keduanya dalam
mode INPUT_PULLUP. GPIO 5 digunakan untuk buzzer dan GPIO 15 untuk LED,
keduanya sebagai OUTPUT. Objek lcd dibuat menggunakan library LiquidCrystal
dengan pin RS, E, D4, D5, D6, dan D7 secara berurutan sesuai konfigurasi
rangkaian pada subbab 3.4.
Koneksi
WiFi menggunakan jaringan simulasi Wokwi:
|
const char* ssid = "Wokwi-GUEST"; const char* password = ""; |
Setelah
itu ESP32 mencoba terhubung ke jaringan melalui fungsi:
|
WiFi.begin(ssid, password); |
Selama
proses penyambungan, LCD menampilkan animasi titik berjalan sebagai indikator
bahwa sistem sedang mencoba terhubung. Apabila dalam batas waktu tertentu
koneksi tidak berhasil, LCD menampilkan pesan “Gagal Terhubung / Sistem
Dimatikan”, buzzer dan LED menyala sebagai peringatan, dan program berhenti
pada perulangan tak berhingga (fail-safe) sehingga ESP32 perlu dinyalakan ulang
secara manual.
3.8.1 Pembacaan Tombol
Status
kedua tombol dibaca pada setiap perulangan loop() melalui:
|
int bacaNext = digitalRead(pinNext); int bacaReset = digitalRead(pinReset); |
Nilai
tersebut kemudian dibandingkan dengan status sebelumnya, yaitu statusNextLama
dan statusResetLama, untuk mendeteksi terjadinya perubahan dari HIGH menuju
LOW.
Perubahan
tersebut dikonfirmasi ulang (debounce) menggunakan jeda singkat sebelum
dianggap sebagai penekanan tombol yang sah:
|
if (statusNextLama == HIGH && bacaNext == LOW) { delay(50); if
(digitalRead(pinNext) == LOW) { ... } } |
Pengecekan
ulang tersebut bertujuan memastikan perubahan sinyal bukan berasal dari derau
kontak mekanis tombol (bouncing), sehingga satu kali penekanan tidak terhitung
lebih dari satu kali.
3.8.2 Penambahan dan Reset Nomor Antrean
Nomor
antrean diperbarui menggunakan pernyataan berikut, tergantung tombol yang
ditekan:
|
nomorAntrean++; // saat tombol NEXT ditekan nomorAntrean = 0; //
saat tombol RESET ditekan |
Setelah
nilai nomorAntrean diperbarui, program memanggil tiga fungsi secara berurutan,
yaitu tampilLayar() untuk memperbarui tampilan LCD, notifBunyi() untuk
membunyikan buzzer dan menyalakan LED, serta kirimKeThingsboard() untuk
mengirim nilai terbaru ke ThingsBoard Cloud.
3.8.3 Pengendalian Indikator
Fungsi:
|
notifBunyi(); |
digunakan
untuk memberikan notifikasi audio-visual setiap kali tombol diproses. Fungsi
ini menyalakan buzzer dan LED secara bersamaan selama ±200 milidetik, kemudian
mematikan keduanya kembali, sehingga pengguna memperoleh konfirmasi langsung
bahwa aksi telah diterima oleh sistem.
3.8.4 Pengiriman Data ke ThingsBoard
Koneksi
MQTT ke ThingsBoard Cloud dibuat menggunakan:
|
client.setServer(mqtt_server, 1883); |
Port
1883 merupakan port standar yang digunakan untuk komunikasi MQTT tanpa enkripsi
TLS.
Apabila
koneksi MQTT terputus, fungsi reconnect() akan mencoba menyambung kembali
menggunakan access token perangkat sebagai kredensial:
|
client.connect("ESP32_Antrean_Client", TOKEN, ""); |
Setelah
terhubung, fungsi kirimKeThingsboard() menyusun data nomor antrean ke dalam
format JSON dan mengirimkannya melalui topik MQTT standar ThingsBoard, yaitu
v1/devices/me/telemetry, menggunakan client.publish().
3.9
Perancangan Dashboard ThingsBoard
Dashboard dirancang menggunakan platform
ThingsBoard Cloud. Sebuah perangkat baru didaftarkan dengan nama
Antrean-Loket1, kemudian ESP32 diautentikasi menggunakan access token milik
perangkat tersebut saat melakukan koneksi MQTT.
Tahapan menghubungkan perangkat ESP32 ke ThingsBoard
Cloud dilakukan melalui langkah-langkah berikut:
- Membuka
situs ThingsBoard Cloud (thingsboard.cloud) dan membuat akun, kemudian
memilih region server yang tersedia saat pendaftaran.

Gambar 3.5 Halaman Pendaftaran Akun
ThingsBoard Cloud

Gambar 3.6 Pemilihan Region Server
pada ThingsBoard Cloud
2.
Masuk (login) ke dashboard
ThingsBoard Cloud menggunakan akun yang telah dibuat.
3.
Membuka menu Devices, lalu memilih
Add Device untuk mendaftarkan perangkat baru.

Gambar 3.7 Menu Add Device pada
Halaman Devices
4.
Mengisi nama perangkat pada kolom
Device details, yaitu Antrean-Loket1, kemudian menyimpan perangkat tersebut.

Gambar 3.8 Pengisian Nama Perangkat
Antrean-Loket1
5.
Membuka detail perangkat
Antrean-Loket1 dan masuk ke tab Credentials untuk melihat Access Token yang
dibuat otomatis oleh ThingsBoard.

Gambar 3.9 Access Token Perangkat
(disensor) pada Tab Credentials
6.
Menyalin access token tersebut dan
memasukkannya ke dalam variabel TOKEN pada kode program ESP32.
7.
Meng-upload dan menjalankan program
pada ESP32 (melalui simulator Wokwi), sehingga ESP32 melakukan koneksi MQTT ke
server thingsboard.cloud menggunakan access token sebagai kredensial
autentikasi.
8.
Memeriksa status perangkat pada
dashboard; apabila koneksi berhasil, status perangkat Antrean-Loket1 akan
berubah menjadi Active.
9.
Memantau data nomor antrean yang
terkirim melalui tab Latest Telemetry pada halaman detail perangkat, yang akan
ter-update otomatis setiap kali tombol NEXT atau RESET ditekan.

Gambar 3.3 Perangkat Antrean-Loket1
Terdaftar dan Aktif pada ThingsBoard Cloud
Informasi
utama yang diterima dan dapat ditampilkan pada dashboard terdiri dari:
- Nomor
antrean terkini, dengan kunci telemetri nomor_antrean.
- Waktu
pembaruan data terakhir (last update time).
- Riwayat
perubahan nomor antrean apabila ditampilkan dalam bentuk grafik atau
widget kartu nilai.
Data
dikirim secara real-time setiap kali tombol ditekan, melalui payload MQTT
berikut:
|
{"nomor_antrean": <nilai>} |
Karena
pengiriman dilakukan melalui MQTT ke ThingsBoard Cloud dan bukan melalui web
server lokal, dashboard dapat diakses dari mana saja selama terdapat koneksi
internet, tanpa harus berada pada jaringan yang sama dengan perangkat ESP32.
3.10
Pengujian Sistem
Pengujian dilakukan untuk mengetahui apakah
sistem dapat merespons penekanan tombol NEXT dan RESET sesuai dengan logika
yang telah dirancang, serta memastikan data nomor antrean terkirim dengan benar
ke ThingsBoard Cloud. Beberapa skenario pengujian yang digunakan adalah:
|
No |
Aksi |
Kondisi Awal |
LED dan Buzzer |
Nomor Antrean (Diharapkan) |
|
1 |
Tekan NEXT |
nomorAntrean = 0 |
Menyala sesaat |
1 |
|
2 |
Tekan NEXT |
nomorAntrean = 1 |
Menyala sesaat |
2 |
|
3 |
Tekan NEXT |
nomorAntrean = 2 |
Menyala sesaat |
3 |
|
4 |
Tekan NEXT berulang kali dengan cepat |
nomorAntrean = 3 |
Menyala sesaat setiap penekanan |
Bertambah sesuai jumlah penekanan, tanpa lompat |
|
5 |
Tekan RESET |
nomorAntrean = 6 |
Menyala sesaat, LCD menampilkan “Antrean Direset” |
0 |
|
6 |
WiFi gagal terhubung saat start |
- |
Buzzer dan LED menyala 1 detik, LCD “Sistem Dimatikan” |
Sistem berhenti (fail-safe) |
|
7 |
Tidak ada tombol ditekan |
nomorAntrean = X |
Mati |
Tetap X |
Hasil
aktual dapat dicatat setelah simulasi dijalankan pada Wokwi dan data
telemetrinya diperiksa pada tab Latest Telemetry perangkat Antrean-Loket1 di
ThingsBoard Cloud.

Gambar 3.4 Data Telemetri
nomor_antrean pada Tab Latest Telemetry ThingsBoard Cloud
|
No |
Aksi |
Kondisi Awal |
LED dan Buzzer |
Nomor Antrean (Diharapkan) |
Hasil |
|
1 |
Tekan NEXT |
nomorAntrean = 0 |
Menyala sesaat |
1 |
Berhasil |
|
2 |
Tekan NEXT |
nomorAntrean = 1 |
Menyala sesaat |
2 |
Berhasil |
|
3 |
Tekan NEXT |
nomorAntrean = 2 |
Menyala sesaat |
3 |
Berhasil |
|
4 |
Tekan NEXT berulang kali dengan cepat |
nomorAntrean = 3 |
Menyala sesaat setiap penekanan |
Bertambah sesuai jumlah penekanan |
Berhasil |
|
5 |
Tekan RESET |
nomorAntrean = 6 |
Menyala sesaat + pesan reset |
0 |
Berhasil |
|
6 |
WiFi gagal terhubung saat start |
- |
Buzzer dan LED menyala 1 detik |
Sistem berhenti (fail-safe) |
Berhasil |
|
7 |
Tidak ada tombol ditekan |
nomorAntrean = X |
Mati |
Tetap X |
Berhasil |
3.11
Analisis Hasil Pengujian
Berdasarkan rancangan pengujian, sistem dapat
merespons penekanan tombol NEXT dengan menambah nomor antrean sebanyak satu
setiap kali tombol ditekan, dan merespons penekanan tombol RESET dengan
mengembalikan nomor antrean ke angka nol. Mekanisme debounce dan edge detection
yang diterapkan pada pembacaan tombol terbukti mencegah satu kali penekanan
terhitung berulang kali akibat derau kontak mekanis. Indikator LED dan buzzer
memberikan konfirmasi langsung kepada pengguna setiap kali aksi berhasil
diproses, sedangkan LCD menampilkan nomor antrean terkini secara real-time.
Selain indikator perangkat keras, perubahan
nomor antrean juga dapat dipantau melalui dashboard ThingsBoard Cloud, karena
setiap perubahan nilai nomorAntrean langsung dikirim melalui MQTT ke topik
telemetri perangkat Antrean-Loket1. Dengan demikian, sistem mampu menggabungkan
tampilan lokal melalui LCD dan indikator fisik dengan pemantauan jarak jauh
melalui dashboard IoT. Berdasarkan hasil pengujian, logika sistem telah sesuai
dengan rancangan yang dibuat, dan sistem antrean berbasis ESP32 ini dapat menjadi
alternatif pengganti pemanggilan nomor antrean secara manual.
BAB IV
PENUTUP
4.1 Kesimpulan
Berdasarkan perancangan dan hasil
pengujian yang dicatat pada Bab III, sistem counter antrean untuk satu loket
telah diimplementasikan pada simulator Wokwi menggunakan ESP32, LCD 16x2, dua
tombol, LED, buzzer, dan resistor. Tombol NEXT digunakan untuk menambah nomor
antrean sebanyak satu, sedangkan tombol RESET mengembalikan nomor ke nol. Tabel
hasil pengujian mencatat keberhasilan kedua fungsi tersebut serta kondisi nomor
yang tetap ketika tidak ada tombol ditekan.
Mekanisme INPUT_PULLUP, debounce 50
milidetik, dan edge detection digunakan untuk membaca penekanan tombol. LCD
menampilkan nomor antrean dan pesan reset, sedangkan LED dan buzzer memberikan
notifikasi selama sekitar 200 milidetik saat aksi diproses. Skenario kegagalan
koneksi WiFi awal juga dicatat berhasil pada tabel pengujian, dengan peringatan
indikator sebelum sistem menghentikan proses.
Integrasi IoT dilakukan melalui
jaringan Wokwi-GUEST dan pengiriman data MQTT ke ThingsBoard Cloud. Data
disusun dalam format JSON dengan kunci nomor_antrean dan diterbitkan ke topik
v1/devices/me/telemetry setelah aksi NEXT atau RESET. Dokumentasi Latest
Telemetry menunjukkan nilai nomor_antrean sebesar 3 pada perangkat
Antrean-Loket1. Hasil tersebut mendukung keberhasilan penerimaan telemetri,
sehingga nomor panggilan dapat ditampilkan secara lokal dan dipantau melalui
layanan cloud.
Praktikum ini menunjukkan penerapan
pembacaan input digital, pengolahan pencacah, kendali output, dan komunikasi
IoT dalam satu sistem antrean. Cakupan hasil masih terbatas pada simulasi satu
loket dan pemantauan telemetri. Pengujian perangkat keras fisik, pengukuran
jeda pengiriman, serta ketahanan saat koneksi terputus dalam waktu lama masih
diperlukan sebelum sistem digunakan pada pelayanan sebenarnya.
DAFTAR PUSTAKA
Arduino. (n.d.). LiquidCrystal. Arduino Libraries.
https://github.com/arduino-libraries/LiquidCrystal
Espressif Systems. (n.d.-a). GPIO. Arduino ESP32
Documentation.
https://docs.espressif.com/projects/arduino-esp32/en/latest/api/gpio.html
Espressif Systems. (n.d.-b). Wi-Fi API. Arduino ESP32
Documentation.
https://docs.espressif.com/projects/arduino-esp32/en/latest/api/wifi.html
O’Leary, N. (n.d.). Arduino Client for MQTT API
documentation. https://pubsubclient.knolleary.net/api
ThingsBoard. (n.d.-a). Getting Connected — MQTT API.
ThingsBoard Cloud Documentation.
https://thingsboard.io/docs/paas/reference/mqtt-api/getting-connected/
ThingsBoard. (n.d.-b). MQTT API. ThingsBoard
Documentation. https://thingsboard.io/docs/reference/mqtt-api/
Wokwi. (n.d.-a). ESP32 Simulation. Wokwi
Documentation. https://docs.wokwi.com/guides/esp32
Wokwi. (n.d.-b). ESP32 WiFi Networking. Wokwi
Documentation. https://docs.wokwi.com/guides/esp32-wifi
Tidak ada komentar:
Posting Komentar