class Button {
private:
int pin;
bool usePullup;
unsigned long lastChangeTime;
unsigned long debounceMs;
bool lastStableState;
bool currentState;
bool pressedEvent;
public:
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;
if (reading != currentState) {
currentState = reading;
lastChangeTime = now;
}
if (now - lastChangeTime > debounceMs) {
if (lastStableState != currentState) {
if (usePullup) {
if (lastStableState == HIGH && currentState == LOW) {
pressedEvent = true;
}
} else {
if (lastStableState == LOW && currentState == HIGH) {
pressedEvent = true;
}
}
lastStableState = currentState;
}
}
}
bool wasPressed() {
return pressedEvent;
}
bool isPressed() {
if (usePullup) return (lastStableState == LOW);
else return (lastStableState == HIGH);
}
};
class LEDController {
private:
int pin;
bool state; // ON/OFF ปัจจุบัน
bool blinking; // โหมดกระพริบหรือไม่
unsigned long interval; // ช่วงเวลาการกระพริบ (ms)
unsigned long lastToggle; // เวลาที่เปลี่ยนสถานะล่าสุด
public:
LEDController(int pinNumber) {
pin = pinNumber;
state = false;
blinking = false;
interval = 500;
lastToggle = 0;
}
void begin() {
pinMode(pin, OUTPUT);
off();
}
void on() {
state = true;
blinking = false; // ถ้าเปิดค้าง ให้หยุดโหมดกระพริบ
digitalWrite(pin, HIGH);
}
void off() {
state = false;
blinking = false;
digitalWrite(pin, LOW);
}
void toggle() {
state = !state;
blinking = false;
digitalWrite(pin, state ? HIGH : LOW);
}
void startBlink(unsigned long ms) {
interval = ms;
blinking = true;
lastToggle = millis();
}
void stopBlink() {
blinking = false;
// ไม่บังคับเปลี่ยนสถานะไฟ ให้คงตาม state ปัจจุบัน
digitalWrite(pin, state ? HIGH : LOW);
}
// ต้องเรียกใน loop() เสมอ เพื่อให้โหมด blink ทำงาน
void update() {
if (blinking) {
unsigned long now = millis();
if (now - lastToggle >= interval) {
lastToggle = now;
state = !state;
digitalWrite(pin, state ? HIGH : LOW);
}
}
}
bool isOn() {
return state;
}
};
Button btn1(18, true, 80);
Button btn2(19, true, 80);
Button btn3(20, true, 80);
LEDController led1(2);
LEDController led2(5);
LEDController led3(4);
void setup() {
btn1.begin();
btn2.begin();
btn3.begin();
led1.begin();
led2.begin();
led3.begin();
}
void loop() {
// อัปเดตปุ่มและ LED ทุกตัว
btn1.update();
btn2.update();
btn3.update();
led1.update();
led2.update();
led3.update();
// ปุ่ม 1: toggle LED1
if (btn1.wasPressed()) {
led1.toggle();
}
// ปุ่ม 2: toggle โหมดกระพริบ LED2
if (btn2.wasPressed()) {
if (led2.isOn()) {
led2.startBlink(300);
} else {
led2.on();
}
}
// ปุ่ม 3: ปิดทุกดวง
if (btn3.wasPressed()) {
led1.off();
led2.off();
led3.off();
}
}
Loading
esp32-c6-devkitc-1
esp32-c6-devkitc-1