Papan nomor antrean untuk loket, klinik, atau kantin sekolah. Petugas menekan tombol, nomor berikutnya muncul di LCD dengan lampu latar berkedip. Nomor yang sedang dipanggil juga tampil di Klenik, jadi orang bisa memantau antrean dari HP.
Ada dua cara memanggil nomor berikutnya: tombol fisik di meja petugas, atau switch Berikutnya di dashboard. Keduanya memanggil fungsi panggil() yang sama, menaikkan nomor, menggambar ulang LCD, dan mengedipkan lampu latar dua kali sebagai tanda.
Nomor ditampilkan dengan format A001. Bagian %03d di snprintf() selalu membuat tiga digit dengan nol di depan. Nomor juga dikirim ke topic nomor dengan flag retained, sehingga siapa pun yang membuka dashboard langsung melihat nomor yang sedang dipanggil.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| LCD 1602 Biru Terpasang I2C IIC 16×02 Display Mo | 1 | Rp37.500 |
| Push button 6×6 mm (isi 10)isi 10, terpakai 1 | 1 | Rp4.750 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 2 | 1 | Rp3.500 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 4 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp129.125 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| LCD 16×2 + modul I2C GND | → | GND | hitam |
| LCD 16×2 + modul I2C VCC | → | VIN | merah |
| LCD 16×2 + modul I2C SDA | → | D21 GPIO21 | biru |
| LCD 16×2 + modul I2C SCL | → | D22 GPIO22 | kuning |
| Push button 6×6 mm 1 | → | D27 GPIO27 | hijau |
| Push button 6×6 mm 2 | → | GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p103.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Gauge Nomor Dipanggil | ichibot/KODE/p103/nomor | 0–200 |
| Switch Panggil Berikutnya | ichibot/KODE/p103/berikut | payload ON / OFF |
| Switch Mulai dari 0 | ichibot/KODE/p103/ulang | payload ON / OFF |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), LiquidCrystal I2C (Frank de Brabander). Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 103 - Papan Antrean dengan LCD
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_NOMOR = "ichibot/budi1234/p103/nomor";
const char* TOPIK_BERIKUT = "ichibot/budi1234/p103/berikut";
const char* TOPIK_ULANG = "ichibot/budi1234/p103/ulang";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int TOMBOL = 27;
int nomor = 0;
bool tadi = HIGH;
unsigned long waktuTekan = 0;
void tampilkan() {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Nomor antrean:");
char buf[17];
snprintf(buf, sizeof(buf), " A%03d", nomor);
lcd.setCursor(0, 1); lcd.print(buf);
mqtt.publish(TOPIK_NOMOR, String(nomor).c_str(), true);
}
void panggil(int baru) {
nomor = baru;
tampilkan();
for (int i = 0; i < 2; i++) { // kedip lampu latar sebagai tanda
lcd.noBacklight(); delay(150);
lcd.backlight(); delay(150);
}
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String topik = t;
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (topik == TOPIK_BERIKUT && p == "ON") {
panggil(nomor + 1);
mqtt.publish(TOPIK_BERIKUT, "OFF");
} else if (topik == TOPIK_ULANG && p == "ON") {
panggil(0);
mqtt.publish(TOPIK_ULANG, "OFF");
}
}
void langganan() {
mqtt.subscribe(TOPIK_BERIKUT);
mqtt.subscribe(TOPIK_ULANG);
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(TOMBOL, INPUT_PULLUP);
lcd.init();
lcd.backlight();
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) { sambungMQTT(); tampilkan(); }
mqtt.loop();
bool sekarang = digitalRead(TOMBOL);
if (sekarang != tadi && millis() - waktuTekan > 50) {
waktuTekan = millis();
tadi = sekarang;
if (sekarang == LOW) panggil(nomor + 1); // petugas menekan: panggil nomor berikutnya
}
}Langkah 4: Pahami kodenya
%03d= bilangan bulat minimal 3 digit dengan nol di depan: 7 jadi007. Spasi di depan menaruh nomor di tengah layar.- Satu fungsi untuk semua cara memanggil (tombol, dashboard, ulang). Kalau nanti ada buzzer, cukup ditambahkan di sini.
- Setelah tersambung (lagi), layar digambar dan nomor dikirim ulang.