class Button {
private:
int pin;
bool usePullup;
unsigned long lastChangeTime;
unsigned long debounceMs;
bool lastStableState;
bool currentState;
bool pressedEvent; // true เมื่อตรวจพบการกดครั้งหนึ่ง (ขอบ LOW)
public:
// Constructor: ระบุขา และว่าจะใช้ PULLUP หรือไม่
Button(int pinNumber, bool enablePullup = true, unsigned long debounce = 50) {
pin = pinNumber;
usePullup = enablePullup;
debounceMs = debounce;
lastChangeTime = 0;
lastStableState = HIGH;
currentState = HIGH;
pressedEvent = false;
}
void begin() {
if (usePullup) {
pinMode(pin, INPUT_PULLUP);
lastStableState = HIGH;
} else {
pinMode(pin, INPUT);
lastStableState = LOW;
}
currentState = lastStableState;
}
void update() {
int reading = digitalRead(pin);
unsigned long now = millis();
pressedEvent = false;
// ถ้ามีการเปลี่ยนสถานะแบบฉับพลัน → รอ debounce
if (reading != currentState) {
currentState = reading;
lastChangeTime = now;
}
// เมื่อผ่านมาเกินเวลา debounce → ยืนยันสถานะใหม่
if ((now - lastChangeTime) > debounceMs) {
if (lastStableState != currentState) {
// เกิดการเปลี่ยนสถานะที่ "นิ่งแล้ว"
// ตรวจขอบ: ถ้าใช้ PULLUP, การกด = จาก HIGH → LOW
if (usePullup) {
if (lastStableState == HIGH && currentState == LOW) {
pressedEvent = true; // เพิ่งกดหนึ่งครั้ง
}
} else {
// ถ้าเป็น pull-down, การกด = LOW → HIGH
if (lastStableState == LOW && currentState == HIGH) {
pressedEvent = true;
}
}
lastStableState = currentState;
}
}
}
// ปุ่มตอนนี้อยู่ในสถานะ "กด" หรือไม่ (ค้างอยู่)
bool isPressed() {
if (usePullup) {
return (lastStableState == LOW);
} else {
return (lastStableState == HIGH);
}
}
// ปุ่ม "เพิ่งถูกกดหนึ่งครั้ง" หรือไม่ (ใช้สำหรับ toggle)
bool wasPressed() {
return pressedEvent;
}
};
Button btn1(18, true, 50);
Button btn2(19, true, 50);
Button btn3(20, true, 50);
const int led1 = 2;
const int led2 = 5;
const int led3 = 4;
bool led1State = false;
bool led2State = false;
bool led3State = false;
void setup() {
btn1.begin();
btn2.begin();
btn3.begin();
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}
void loop() {
btn1.update();
btn2.update();
btn3.update();
if (btn1.wasPressed()) {
led1State = !led1State;
digitalWrite(led1, led1State);
}
if (btn2.wasPressed()) {
led2State = !led2State;
digitalWrite(led2, led2State);
}
if (btn3.wasPressed()) {
led3State = !led3State;
digitalWrite(led3, led3State);
}
}
Loading
esp32-c6-devkitc-1
esp32-c6-devkitc-1