Minggu, 11 Oktober 2026

SISTEM COUNTER ANTREAN ESP32 TERINTEGRASI THINGSBOARD

 

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:

  1. Bagaimana merancang rangkaian sistem counter antrean menggunakan ESP32, LCD 16x2, tombol NEXT dan RESET, buzzer, serta LED pada simulator Wokwi?
  2. Bagaimana membuat program pada ESP32 agar nomor antrean bertambah saat tombol NEXT ditekan dan kembali ke nol saat tombol RESET ditekan?
  3. Bagaimana menampilkan nomor antrean pada LCD serta memberi notifikasi melalui buzzer dan LED setiap kali nomor berubah?
  4. Bagaimana menghubungkan ESP32 ke jaringan WiFi dan mengirim data nomor antrean ke ThingsBoard Cloud menggunakan protokol MQTT?
  5. 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:

  1. 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.
  2. Mahasiswa mampu memprogram ESP32 untuk membaca input tombol dengan penanganan debounce, mengendalikan output, dan menampilkan teks pada LCD.
  3. Mahasiswa memahami cara kerja koneksi WiFi pada ESP32 serta pengiriman data telemetri dengan protokol MQTT menggunakan library PubSubClient.
  4. Mahasiswa mengenal platform ThingsBoard Cloud sebagai tempat menerima dan memantau data dari perangkat IoT.
  5. Mahasiswa terbiasa menggunakan simulator Wokwi untuk merancang dan menguji sistem tanpa perangkat keras fisik.
  6. 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:

  1. Sistem dirancang dan diuji pada simulator Wokwi menggunakan board ESP32 DevKit C V4, tanpa perangkat keras fisik.
  2. 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.
  3. Output lokal berupa LCD 16x2, satu buzzer, dan satu LED sebagai penanda saat nomor berubah, tanpa pemanggilan nomor dengan suara.
  4. Koneksi internet memakai jaringan WiFi simulasi Wokwi-GUEST. Jika koneksi gagal, sistem berhenti dan menampilkan pesan kegagalan.
  5. 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.
  6. 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 :

  1. Input, berupa dua tombol tekan (push button) NEXT dan RESET yang dibaca oleh ESP32.
  2. Processing, berupa ESP32 yang mengolah status tombol dan memperbarui nomor antrean.
  3. Output, berupa LCD 16x2, LED, dan buzzer sebagai tampilan dan indikator lokal.
  4. 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:

  1. ESP32 dinyalakan, kemudian LCD menampilkan pesan selamat datang pada loket.
  2. ESP32 mencoba terhubung ke jaringan WiFi, sementara LCD menampilkan status proses koneksi.
  3. Jika koneksi WiFi berhasil, ESP32 terhubung ke server MQTT ThingsBoard Cloud dan LCD menampilkan tampilan utama “Sistem Antrean Nomor: 0”.
  4. Jika koneksi WiFi gagal, sistem menghentikan proses dan memberikan peringatan melalui LED serta buzzer.
  5. Petugas loket menekan tombol NEXT untuk memanggil nomor antrean berikutnya.
  6. ESP32 mendeteksi perubahan sinyal pada tombol NEXT dan melakukan debounce selama 50 milidetik untuk memastikan penekanan tombol valid.
  7. 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.
  8. 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.
  9. 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:

  1. 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:

  1. Nomor antrean terkini, dengan kunci telemetri nomor_antrean.
  2. Waktu pembaruan data terakhir (last update time).
  3. 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