SISTEM
COUNTER ANTREAN ESP32 DENGAN FITUR LAMPU DAN NOTIFIKASI EMAIL
Disusun Oleh:
Ramdani Mulyadi 24051204137
Naufal Alif Prasetya 24051204126
Syauqi Ihsan Ramadhan 24051204110
Luthfi Fadli Zainuddin 24051204200
BAB IPENDAHULUAN
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 IITINJAUAN PUSTAKA
2.1 Internet of Things
Internet
of Things (IoT) merupakan konsep yang memungkinkan berbagai perangkat fisik
terhubung ke jaringan internet sehingga perangkat tersebut dapat mengumpulkan,
mengirimkan, menerima, dan bertukar data. Perangkat IoT umumnya dilengkapi
dengan sensor, mikrokontroler, serta konektivitas jaringan yang memungkinkan
proses pengumpulan dan pertukaran data secara otomatis. Dalam penerapannya, IoT
dapat digunakan untuk melakukan monitoring terhadap kondisi suatu objek atau
lingkungan. Data yang diperoleh dari sensor dapat dikirimkan melalui jaringan
dan selanjutnya ditampilkan kepada pengguna dalam bentuk informasi yang lebih
mudah dipahami. Pada sistem yang dibuat dalam praktikum ini, konsep IoT
diterapkan melalui proses pembacaan suhu dan kelembapan menggunakan sensor
DHT22. Data tersebut diproses oleh ESP32 dan dikirimkan melalui koneksi Wi-Fi
untuk dapat diakses melalui antarmuka web.
2.2 ESP32
ESP32 merupakan mikrokontroler yang dikembangkan oleh Espressif Systems dan banyak digunakan dalam pengembangan sistem IoT. Salah satu keunggulan ESP32 adalah tersedianya fitur konektivitas Wi-Fi dan Bluetooth yang telah terintegrasi pada mikrokontroler sehingga tidak membutuhkan modul komunikasi tambahan untuk membangun sistem yang terhubung ke jaringan. ESP32 juga memiliki sejumlah GPIO (General Purpose Input/Output) yang dapat digunakan untuk menghubungkan berbagai sensor dan perangkat elektronik. Kemampuan pemrosesan serta konektivitas jaringan yang dimiliki ESP32 membuatnya sesuai digunakan untuk sistem monitoring berbasis IoT. Dalam praktikum ini, ESP32 digunakan sebagai pusat pengendali sistem. ESP32 menerima data dari sensor DHT22, melakukan pemrosesan data, kemudian menyediakan data tersebut melalui koneksi jaringan agar dapat ditampilkan pada dashboard monitoring berbasis web.
BAB IIIPEMBAHASAN
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
(indikator utama) |
1 |
Indikator
visual saat tombol ditekan |
|
5 |
LED
Milestone (kuning) |
1 |
Notifikasi
visual saat nomor antrean mencapai kelipatan lima |
|
6 |
Buzzer |
1 |
Indikator
suara saat tombol ditekan |
|
7 |
Resistor
220 Ω |
2 |
Pembatas
arus LED |
|
8 |
Breadboard |
1 |
Media
perancangan rangkaian |
|
9 |
Kabel
jumper |
Secukupnya |
Penghubung
antar-komponen |
|
10 |
Komputer/Laptop |
1 |
Menjalankan
simulator Wokwi |
|
11 |
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 Simulasi Berjalan pada Wokwi (LCD, LED, dan Log Serial Monitor)
3.3.3 LED
Dua
buah LED digunakan dalam sistem ini: satu LED hijau sebagai indikator visual
setiap kali sistem memproses aksi dari tombol, dan satu LED kuning tambahan
sebagai indikator khusus milestone kelipatan lima.
●
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.
LED kuning tambahan menyala berkedip tiga kali setiap kali nomor
antrean mencapai kelipatan lima (5, 10, 15, dan seterusnya), sehingga petugas
loket dapat mengenali pencapaian jumlah antrean tertentu tanpa perlu menghitung
manual.
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 14,
27, 4, 2 |
|
Push
Button NEXT |
Sinyal
(INPUT_PULLUP) |
GPIO 19 |
|
Push
Button RESET |
Sinyal
(INPUT_PULLUP) |
GPIO 18 |
|
LED Utama
(hijau) |
Anoda |
GPIO 15 |
|
LED
Milestone (kuning) |
Anoda |
GPIO 13 |
|
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"; //
Catatan: GPIO16/17 tidak tersedia di part ESP32 DevKit Wokwi ini, //
jadi jalur D4/D5 LCD dipindah ke GPIO14/GPIO27. LiquidCrystal
lcd(22, 21, 14, 27, 4, 2); WiFiClient
espClient; PubSubClient
client(espClient); int
pinNext = 19; int
pinReset = 18; int
pinBuzzer = 5; int
pinLed = 15; int
pinLedMilestone = 13; // LED kuning khusus notifikasi milestone kelipatan 5 int
nomorAntrean = 0; int
statusNextLama = HIGH; int
statusResetLama = HIGH; //
--- Tambahan UTS Part 2: pelacakan interval & milestone --- unsigned
long waktuNextSebelumnya = 0; unsigned
long totalInterval = 0; int
jumlahInterval = 0; float
rataRataInterval = 0; // dalam detik void
setup() { Serial.begin(115200); delay(300); Serial.println(); Serial.println("=== Sistem Antrean
ESP32 - Boot ==="); lcd.begin(16, 2); pinMode(pinNext, INPUT_PULLUP); pinMode(pinReset, INPUT_PULLUP); pinMode(pinBuzzer, OUTPUT); pinMode(pinLed, OUTPUT); pinMode(pinLedMilestone,
OUTPUT); digitalWrite(pinBuzzer, LOW); digitalWrite(pinLed, LOW); digitalWrite(pinLedMilestone, 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"); Serial.print("Menghubungkan ke WiFi
SSID: "); Serial.println(ssid); 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++; Serial.print("."); } Serial.println(); 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); Serial.print("WiFi terhubung. IP
address: "); Serial.println(WiFi.localIP()); Serial.println("Menunggu koneksi
MQTT ke ThingsBoard..."); tampilLayar(); } else { lcd.clear(); lcd.setCursor(1, 0); lcd.print("Gagal Terhubung"); lcd.setCursor(0, 1); lcd.print("Sistem Dimatikan"); Serial.println("Gagal terhubung ke
WiFi. Sistem dihentikan (fail-safe)."); digitalWrite(pinBuzzer, HIGH); digitalWrite(pinLed, HIGH); delay(1000); digitalWrite(pinBuzzer, LOW); digitalWrite(pinLed, LOW); while (true) { delay(1000); } } } void
reconnect() { while (!client.connected()) { Serial.println("Mencoba koneksi MQTT
ke ThingsBoard..."); if
(client.connect("ESP32_Antrean_Client", TOKEN, "")) { Serial.println("Berhasil terhubung
ke MQTT ThingsBoard."); } else { Serial.print("Gagal konek MQTT,
state="); Serial.print(client.state()); Serial.println(" -> coba lagi
dalam 5 detik"); delay(5000); } } } void
kirimKeThingsboard() { if (!client.connected()) { reconnect(); } client.loop(); String payload =
"{\"nomor_antrean\":" + String(nomorAntrean) +
",\"rata_rata_interval\":" +
String(rataRataInterval, 1) + "}";
client.publish("v1/devices/me/telemetry", payload.c_str()); Serial.print("Payload terkirim ke
ThingsBoard: "); Serial.println(payload); } 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
notifMilestone() { Serial.print(">>> MILESTONE!
Nomor antrean kelipatan 5 tercapai: "); Serial.println(nomorAntrean); for (int i = 0; i < 3; i++) { digitalWrite(pinLedMilestone, HIGH); delay(120); digitalWrite(pinLedMilestone, LOW); delay(120); } } void
hitungInterval() { unsigned long waktuSekarang = millis(); if (waktuNextSebelumnya != 0) { unsigned long interval = (waktuSekarang -
waktuNextSebelumnya) / 1000; totalInterval += interval; jumlahInterval++; rataRataInterval = (float)totalInterval /
jumlahInterval; Serial.print("Interval sejak
panggilan sebelumnya: "); Serial.print(interval); Serial.print(" detik | Rata-rata
interval: "); Serial.print(rataRataInterval); Serial.println(" detik"); } else { Serial.println("Panggilan NEXT
pertama, interval belum bisa dihitung."); } waktuNextSebelumnya = waktuSekarang; } void
tampilEstimasi() { if (jumlahInterval > 0) { lcd.setCursor(0, 1); lcd.print("Est: "); lcd.print(rataRataInterval, 1); lcd.print("dtk "); delay(1200); tampilLayar(); } } 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++;
Serial.println("--------------------------------------"); Serial.print("Tombol NEXT ditekan.
Nomor antrean sekarang: "); Serial.println(nomorAntrean); hitungInterval(); tampilLayar(); notifBunyi(); if (nomorAntrean % 5 == 0) { notifMilestone(); } kirimKeThingsboard(); tampilEstimasi(); } } if (statusResetLama == HIGH &&
bacaReset == LOW) { delay(50); if (digitalRead(pinReset) == LOW) { nomorAntrean = 0; // reset juga data interval karena
siklus antrean dimulai ulang waktuNextSebelumnya = 0; totalInterval = 0; jumlahInterval = 0; rataRataInterval = 0;
Serial.println("--------------------------------------"); Serial.println("Tombol RESET
ditekan. Nomor antrean & data interval direset ke 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
pinLedMilestone = 13; // LED kuning notifikasi kelipatan 5
int
nomorAntrean = 0;
LiquidCrystal
lcd(22, 21, 14, 27, 4, 2);
GPIO 19
digunakan untuk tombol NEXT dan GPIO 18 untuk tombol RESET, keduanya dalam mode
INPUT_PULLUP. GPIO 5 digunakan untuk buzzer, GPIO 15 untuk LED utama, dan GPIO
13 untuk LED milestone, ketiganya 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.8.5 Perhitungan Interval dan
Notifikasi Milestone
Sebagai
pengembangan pada UTS bagian 2, program menambahkan fungsi hitungInterval()
yang dipanggil setiap kali tombol NEXT ditekan. Fungsi ini mencatat selisih
waktu (dalam detik) antara penekanan NEXT saat ini dan penekanan sebelumnya
menggunakan millis(), lalu mengakumulasikannya untuk menghitung rata-rata
interval kedatangan:
unsigned
long interval = (waktuSekarang - waktuNextSebelumnya) / 1000;
rataRataInterval
= (float)totalInterval / jumlahInterval;
Nilai
rataRataInterval kemudian ditampilkan sementara pada baris kedua LCD melalui
fungsi tampilEstimasi() sebagai perkiraan waktu tunggu rata-rata sebelum layar
kembali menampilkan nomor antrean.
Selain itu,
program memeriksa apakah nomor antrean yang baru merupakan kelipatan lima.
Apabila terpenuhi, fungsi notifMilestone() dipanggil untuk mengedipkan LED
milestone (GPIO 13) sebanyak tiga kali, terpisah dari LED utama:
if
(nomorAntrean % 5 == 0) { notifMilestone(); }
Pemisahan
LED ini bertujuan agar notifikasi pencapaian kelipatan lima dapat dikenali
secara visual tanpa mengganggu indikator notifikasi normal pada LED utama.
Mengikuti
penambahan fitur tersebut, fungsi kirimKeThingsboard() juga diperbarui sehingga
payload JSON yang dikirim ke ThingsBoard Cloud kini memuat dua nilai, yaitu
nomor_antrean dan rata_rata_interval, sebagai berikut:
{"nomor_antrean":
5, "rata_rata_interval": 1.5}
Dengan
tambahan ini, ThingsBoard Cloud tidak hanya menerima nomor antrean terbaru,
tetapi juga data rata-rata interval kedatangan yang dapat digunakan untuk
memperkirakan waktu tunggu antrean berikutnya.
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
- Masuk (login) ke dashboard ThingsBoard Cloud menggunakan akun yang
telah dibuat.
- Membuka menu Devices, lalu memilih Add Device untuk mendaftarkan
perangkat baru.
Gambar
3.7 Menu Add Device pada Halaman Devices
- Mengisi nama perangkat pada kolom Device details, yaitu
Antrean-Loket1, kemudian menyimpan perangkat tersebut.

Gambar
3.8 Pengisian Nama Perangkat Antrean-Loket1
- 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
- Menyalin access token tersebut dan memasukkannya ke dalam variabel
TOKEN pada kode program ESP32.
- 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.
- Memeriksa status perangkat pada dashboard; apabila koneksi
berhasil, status perangkat Antrean-Loket1 akan berubah menjadi Active.
- 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.
- Rata-rata interval kedatangan antrean (dalam detik), dengan kunci
telemetri rata_rata_interval, hasil pengembangan pada UTS bagian 2.
- 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>, "rata_rata_interval": <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.
Nilai
rata_rata_interval yang tampil pada Latest Telemetry memungkinkan dashboard
menggambarkan kecepatan rata-rata antrean terlayani, sebagai pelengkap
informasi nomor antrean terkini.
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 |
|
8 |
Tekan
NEXT hingga nomorAntrean mencapai kelipatan lima (misal ke-5) |
nomorAntrean
= 4 |
LED utama
menyala sesaat, LED milestone berkedip 3 kali |
5 |
|
9 |
Tekan
NEXT beberapa kali dengan jeda waktu berbeda-beda |
nomorAntrean
= 0, belum ada interval tercatat |
Menyala
sesaat setiap penekanan |
Bertambah
sesuai jumlah penekanan, rata_rata_interval terhitung dan terkirim |
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 dan rata_rata_interval pada Tab Latest
Telemetry ThingsBoard Cloud
Proses
perhitungan interval dan notifikasi milestone dapat diamati melalui log Serial
Monitor pada simulator Wokwi, sebagaimana ditunjukkan pada Gambar 3.2.
|
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 |
|
8 |
Tekan
NEXT hingga nomorAntrean mencapai kelipatan lima (misal ke-5) |
nomorAntrean
= 4 |
LED utama
menyala sesaat, LED milestone berkedip 3 kali |
5 |
Berhasil |
|
9 |
Tekan
NEXT beberapa kali dengan jeda waktu berbeda-beda |
nomorAntrean
= 0, belum ada interval tercatat |
Menyala
sesaat setiap penekanan |
Bertambah
sesuai jumlah penekanan, rata_rata_interval terhitung dan terkirim |
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. Pada pengembangan UTS bagian 2,
pengujian juga menunjukkan bahwa fungsi hitungInterval() berhasil menghitung
rata-rata interval kedatangan antrean dan mengirimkannya ke ThingsBoard Cloud
melalui kunci telemetri rata_rata_interval, serta fungsi notifMilestone()
berhasil mengaktifkan LED milestone terpisah (GPIO 13) setiap kali nomor
antrean mencapai kelipatan lima, tanpa mengganggu kinerja indikator utama
maupun pengiriman data nomor antrean. Dengan demikian, kedua fitur tambahan
tersebut terbukti dapat diintegrasikan ke dalam sistem yang sudah ada tanpa
mengubah logika inti pembacaan tombol dan pengiriman data.
BAB IVPENUTUP
4.1 Kesimpulan
Berdasarkan
perancangan, implementasi, dan pengujian sistem counter antrean berbasis
Internet of Things (IoT) yang telah dilakukan, dapat disimpulkan bahwa
penggunaan mikrokontroler ESP32 mampu mendukung pengelolaan nomor antrean
secara elektronik. Sistem dirancang menggunakan dua tombol utama, yaitu NEXT
untuk menambah nomor antrean dan RESET untuk mengembalikan nomor antrean ke
angka nol. Informasi antrean ditampilkan melalui LCD 16x2, sedangkan LED dan
buzzer digunakan sebagai indikator visual dan suara untuk memberikan konfirmasi
terhadap setiap perubahan nomor antrean. Penerapan mekanisme debounce dan edge
detection juga membantu mencegah pembacaan tombol secara berulang akibat
gangguan sinyal mekanis.
Integrasi ESP32 dengan
jaringan WiFi dan platform ThingsBoard Cloud melalui protokol MQTT memungkinkan
informasi antrean dikirimkan dan dipantau secara daring. Data yang dikirim
mencakup nomor antrean terkini melalui parameter nomor_antrean serta rata-rata interval antarpenekanan tombol NEXT melalui parameter rata_rata_interval. Dengan adanya integrasi tersebut, pemantauan antrean tidak hanya
dilakukan melalui perangkat lokal, tetapi juga dapat dilakukan dari jarak jauh
menggunakan layanan ThingsBoard Cloud.
Pada pengembangan UTS
bagian kedua, sistem dilengkapi dengan fitur perhitungan rata-rata interval
antar pemanggilan nomor antrean menggunakan fungsi millis().
Informasi ini digunakan sebagai estimasi sederhana mengenai jeda waktu
pelayanan dan ditampilkan sementara pada LCD. Selain itu, penambahan LED
milestone yang berkedip sebanyak tiga kali setiap nomor antrean mencapai
kelipatan lima memberikan indikator tambahan kepada petugas. Berdasarkan hasil
pengujian yang dicantumkan pada BAB III, seluruh skenario pengujian dinyatakan
berhasil, termasuk pengoperasian tombol, notifikasi, pengiriman data,
perhitungan interval, dan indikator milestone.
Penggunaan simulator
Wokwi memungkinkan proses perancangan rangkaian, pemrograman, dan pengujian
sistem dilakukan secara virtual tanpa memerlukan perangkat keras fisik. Secara
keseluruhan, praktikum ini menunjukkan penerapan konsep IoT melalui integrasi input,
pemrosesan data, output, dan komunikasi jaringan dalam suatu sistem antrean
elektronik yang dapat dikembangkan lebih lanjut untuk mendukung pelayanan yang
lebih terstruktur.
4.2 Saran
Sistem
counter antrean yang telah dikembangkan masih memiliki beberapa keterbatasan
sehingga terdapat peluang untuk meningkatkan fungsionalitas dan keandalannya.
Beberapa pengembangan yang dapat dilakukan adalah sebagai berikut:
1. Melakukan implementasi dan pengujian
menggunakan perangkat keras ESP32 secara langsung untuk mengetahui kinerja
sistem pada kondisi operasional sebenarnya, termasuk kestabilan koneksi WiFi
dan respons komponen elektronik.
2. Mengembangkan sistem agar dapat
digunakan pada beberapa loket sekaligus, sehingga pengelolaan antrean tidak
hanya terbatas pada satu loket dan dapat mendukung pelayanan dengan jumlah
pengunjung yang lebih besar.
3. Menambahkan penyimpanan riwayat
antrean dan waktu pelayanan agar data dapat digunakan untuk menganalisis
aktivitas loket, mengidentifikasi waktu pelayanan yang padat, serta
mengevaluasi efisiensi sistem antrean.
4. Meningkatkan metode perhitungan
estimasi waktu tunggu dengan mempertimbangkan jumlah antrean yang belum
dilayani dan durasi pelayanan aktual. Dengan demikian, estimasi yang dihasilkan
dapat memberikan gambaran waktu tunggu yang lebih representatif dibandingkan
rata-rata interval penekanan tombol NEXT.
5. Mengembangkan dashboard ThingsBoard
Cloud dengan menambahkan visualisasi grafik nomor antrean, rata-rata interval
pelayanan, jumlah antrean yang telah diproses, dan informasi aktivitas loket
agar proses pemantauan menjadi lebih informatif.
6. Menambahkan mekanisme pemulihan
koneksi WiFi dan MQTT secara lebih fleksibel agar sistem tetap dapat
menjalankan fungsi antrean lokal ketika koneksi internet terputus, kemudian
melakukan sinkronisasi data setelah koneksi tersedia kembali.
7. Mengembangkan fitur notifikasi kepada
pengunjung, misalnya melalui email atau aplikasi pesan, sehingga pengguna dapat
memperoleh informasi mengenai perkembangan antrean tanpa harus terus-menerus
memperhatikan layar di lokasi pelayanan.
Dengan pengembangan tersebut, sistem
counter antrean berbasis ESP32 diharapkan dapat ditingkatkan dari sebuah
simulasi IoT sederhana menjadi sistem pengelolaan antrean yang lebih andal,
informatif, dan sesuai untuk diterapkan pada berbagai lingkungan pelayanan.
DAFTAR PUSTAKA
Adafruit. (n.d.). Adafruit DHT sensor
library. GitHub. https://github.com/adafruit/DHT-sensor-library
Adafruit. (n.d.). Adafruit SSD1306.
GitHub. https://github.com/adafruit/Adafruit_SSD1306
Arduino. (2023). Wire library:
Communication with I2C/TWI devices. Arduino Documentation. https://docs.arduino.cc/language-reference/en/functions/communication/wire/
Espressif Systems. (n.d.). ESP32 series
datasheet. https://documentation.espressif.com/esp32_datasheet_en.pdf
Espressif Systems. (n.d.). I2C.
Arduino-ESP32 Documentation. https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2c.html
Hackster.io. (2017). ESP32 and OLED
display: Internet clock - DHT22. https://www.hackster.io/mjrobot/esp32-and-oled-display-internet-clock-dht22-b142e4
Monk, S. (2022). Programming Arduino:
Getting started with sketches (3rd ed.). McGraw Hill. https://www.mheducation.com/highered/mhp/product/programming-arduino-getting-started-sketches-third-edition.html?viewOption=student
Random Nerd Tutorials. (n.d.). ESP32 OLED
display with Arduino IDE. https://randomnerdtutorials.com/esp32-ssd1306-oled-display-arduino-ide/
Wokwi. (n.d.). Wokwi documentation. https://docs.wokwi.com/
Wokwi. (n.d.). ESP32 simulation. Wokwi Documentation. https://docs.wokwi.com/guides/esp32
Tidak ada komentar:
Posting Komentar