Tutorial Belanja komponen

Tutorial › Layar

Papan Antrean dengan LCD

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVINIchibot16x2 I2CGNDVCCSDASCLLCD 16×2 + modul I2C12Push button 6×6 mm

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

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
LCD 1602 Biru Terpasang I2C IIC 16×02 Display Mo1Rp37.500
Push button 6×6 mm (isi 10)isi 10, terpakai 11Rp4.750
Breadboard mini 170 titik1Rp4.875
Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 21Rp3.500
Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 41Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp129.125
Daftar komponen proyek ini otomatis masuk ke pesan. Hapus yang sudah kamu punya sebelum dikirim.

Langkah 1: Rangkai komponen

Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.

DariKeKabel
LCD 16×2 + modul I2C GND→GNDhitam
LCD 16×2 + modul I2C VCC→VINmerah
LCD 16×2 + modul I2C SDA→D21 GPIO21biru
LCD 16×2 + modul I2C SCL→D22 GPIO22kuning
Push button 6×6 mm 1→D27 GPIO27hijau
Push button 6×6 mm 2→GNDhitam

Langkah 2: Siapkan dashboard Klenik

Nomor Dipanggilichibot/budi1234/p103/nomor
0 – 20027
0 detik lalu
Panggil Berikutnyaichibot/budi1234/p103/berikut
Berikutnya
0 detik lalu
Mulai dari 0ichibot/budi1234/p103/ulang
Ulang
0 detik lalu

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.

WidgetTopicSetting
Gauge
Nomor Dipanggil
ichibot/KODE/p103/nomor0–200
Switch
Panggil Berikutnya
ichibot/KODE/p103/berikutpayload ON / OFF
Switch
Mulai dari 0
ichibot/KODE/p103/ulangpayload 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).

p103.inoUnduh .ino
// 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

  1. %03d = bilangan bulat minimal 3 digit dengan nol di depan: 7 jadi 007. Spasi di depan menaruh nomor di tengah layar.
  2. Satu fungsi untuk semua cara memanggil (tombol, dashboard, ulang). Kalau nanti ada buzzer, cukup ditambahkan di sini.
  3. Setelah tersambung (lagi), layar digambar dan nomor dikirim ulang.