#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BTN_AMBIL 4 // tombol hijau
#define BTN_PANGGIL 5 // tombol kuning
#define BUZZER 18
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
// HARUS SAMA dengan PREFIX di antrian_web.html
const char* TOPIC_TERAKHIR = "unesa/kelompokku3/antrian/terakhir";
const char* TOPIC_DIPANGGIL = "unesa/kelompokku3/antrian/dipanggil";
const char* TOPIC_CMD = "unesa/kelompokku3/antrian/cmd";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int terakhir = 0;
int dipanggil = 0;
unsigned long lastPress = 0;
void tampilLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dipanggil: ");
lcd.print(dipanggil);
lcd.setCursor(0, 1);
lcd.print("Sisa antrian: ");
lcd.print(terakhir - dipanggil);
}
void bunyi(int kali) {
for (int k = 0; k < kali; k++) {
for (int i = 0; i < 150; i++) {
digitalWrite(BUZZER, HIGH);
delayMicroseconds(500);
digitalWrite(BUZZER, LOW);
delayMicroseconds(500);
}
delay(100);
}
}
void kirimStatus() {
client.publish(TOPIC_TERAKHIR, String(terakhir).c_str(), true);
client.publish(TOPIC_DIPANGGIL, String(dipanggil).c_str(), true);
}
void resetAntrian() {
terakhir = 0;
dipanggil = 0;
kirimStatus();
tampilLCD();
bunyi(1);
}
void panggilBerikutnya() {
if (dipanggil < terakhir) {
dipanggil++;
kirimStatus();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nomor ");
lcd.print(dipanggil);
lcd.setCursor(0, 1);
lcd.print("Ke loket!");
bunyi(3);
delay(1500);
tampilLCD();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Antrian kosong");
delay(1500);
tampilLCD();
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String pesan = "";
for (unsigned int i = 0; i < length; i++) pesan += (char)payload[i];
Serial.println("Pesan masuk: " + pesan);
if (pesan == "panggil") {
panggilBerikutnya();
} else if (pesan == "reset") {
resetAntrian();
}
}
void connectWiFi() {
Serial.print("Connecting WiFi");
WiFi.begin(ssid, password, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println(" OK");
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Connecting MQTT...");
String clientId = "esp32-antrian-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" OK");
client.subscribe(TOPIC_CMD);
kirimStatus();
} else {
Serial.print(" gagal, rc=");
Serial.println(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(BTN_AMBIL, INPUT_PULLUP);
pinMode(BTN_PANGGIL, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("Menyambung...");
connectWiFi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
reconnectMQTT();
tampilLCD();
}
void loop() {
if (!client.connected()) reconnectMQTT();
client.loop();
if (digitalRead(BTN_AMBIL) == LOW && millis() - lastPress > 300) {
lastPress = millis();
terakhir++;
kirimStatus();
tampilLCD();
bunyi(1);
}
if (digitalRead(BTN_PANGGIL) == LOW && millis() - lastPress > 300) {
lastPress = millis();
panggilBerikutnya();
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4