#include <Wire.h> // ไลบรารีสำหรับสื่อสารผ่าน I2C
#include <LiquidCrystal_I2C.h> // ไลบรารีควบคุมจอ LCD I2C
// กำหนดขา SDA และ SCL ของ ESP32-S2
#define SDA_PIN 34
#define SCL_PIN 33
// สร้างออบเจ็กต์ LCD ที่ Address 0x27 ขนาด 16 คอลัมน์ 2 แถว
LiquidCrystal_I2C lcd(0x27, 16, 2);
// กำหนดขาที่ใช้ต่อปุ่มกด
const int BUTTON_PIN = 4;
// ตัวแปรเก็บหมายเลขคิว
int queueCount = 0;
// ตัวแปรเก็บสถานะปุ่มครั้งก่อน
// เริ่มต้นเป็น HIGH เพราะใช้ INPUT_PULLUP
int lastButtonState = HIGH;
void setup() {
// กำหนดให้ปุ่มเป็น INPUT_PULLUP
// เมื่อไม่กด = HIGH
// เมื่อกด = LOW
pinMode(BUTTON_PIN, INPUT_PULLUP);
// เริ่มต้นการสื่อสาร I2C
Wire.begin(SDA_PIN, SCL_PIN);
// เริ่มต้นใช้งานจอ LCD
lcd.init();
// เปิดไฟ Backlight ของจอ
lcd.backlight();
// แสดงข้อความและหมายเลขคิวเริ่มต้น
updateDisplay();
}
void loop() {
// อ่านสถานะปุ่มปัจจุบัน
int currentButtonState = digitalRead(BUTTON_PIN);
// ตรวจสอบว่าปุ่มถูกกดหรือไม่
// ตรวจจับการเปลี่ยนสถานะจาก HIGH เป็น LOW
if (lastButtonState == HIGH && currentButtonState == LOW) {
// เพิ่มหมายเลขคิวทีละ 1
queueCount++;
// อัปเดตข้อมูลบนหน้าจอ LCD
updateDisplay();
// หน่วงเวลา 250 มิลลิวินาที
// เพื่อป้องกันการนับซ้ำจากการเด้งของปุ่ม (Debounce)
delay(250);
}
// บันทึกสถานะปุ่มปัจจุบันไว้ใช้ตรวจสอบในรอบถัดไป
lastButtonState = currentButtonState;
}
// ฟังก์ชันสำหรับอัปเดตข้อมูลบนหน้าจอ LCD
void updateDisplay() {
// ล้างข้อมูลเดิมบนหน้าจอ
lcd.clear();
// กำหนดตำแหน่งเคอร์เซอร์ที่คอลัมน์ 0 แถว 0
lcd.setCursor(0, 0);
// แสดงข้อความหัวข้อ
lcd.print("Next Queue:");
// กำหนดตำแหน่งเคอร์เซอร์ที่คอลัมน์ 0 แถว 1
lcd.setCursor(0, 1);
// แสดงหมายเลขคิวปัจจุบัน
lcd.print(queueCount);
}