Minggu, 11 Oktober 2026

SISTEM COUNTER ANTREAN ESP32 DENGAN FITUR LAMPU DAN NOTIFIKASI EMAIL

 

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 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) 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 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 (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:

  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

 

  1. Masuk (login) ke dashboard ThingsBoard Cloud menggunakan akun yang telah dibuat.
  2. Membuka menu Devices, lalu memilih Add Device untuk mendaftarkan perangkat baru.

Gambar 3.7 Menu Add Device pada Halaman Devices

 

  1. Mengisi nama perangkat pada kolom Device details, yaitu Antrean-Loket1, kemudian menyimpan perangkat tersebut.

Gambar 3.8 Pengisian Nama Perangkat Antrean-Loket1

 

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

 

  1. Menyalin access token tersebut dan memasukkannya ke dalam variabel TOKEN pada kode program ESP32.
  2. 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.
  3. Memeriksa status perangkat pada dashboard; apabila koneksi berhasil, status perangkat Antrean-Loket1 akan berubah menjadi Active.
  4. 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. Rata-rata interval kedatangan antrean (dalam detik), dengan kunci telemetri rata_rata_interval, hasil pengembangan pada UTS bagian 2.
  3. Waktu pembaruan data terakhir (last update time).
  4. 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 IV
PENUTUP

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