const int RELAY_PIN = 4;
const int BUTTON_PIN = 5;
const int LED_PIN = 16;
int pressCount = 0;
int releaseCount = 0;
bool relayState = false;
bool ledState = false;
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
unsigned long lastReleasedTime = 0;
unsigned long longPressTime = 1000;
unsigned long debounceTime = 50;
bool isPressed = false;
bool isLongDetected = false;
void IRAM_ATTR interruptFallingHandler();
void IRAM_ATTR interruptRisingHandler();
void IRAM_ATTR interruptFallingHandler() {
detachInterrupt(BUTTON_PIN);
static unsigned long lastInterruptTime = 0;
// If interrupts come faster than 200ms, assume it's a bounce and ignore
if (isPressed == false && (millis() - lastInterruptTime) > debounceTime) {
isPressed = true;
isLongDetected = false;
lastInterruptTime = pressedTime = millis();
++pressCount;
}
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), interruptRisingHandler, RISING);
}
unsigned long pressDuration;
void IRAM_ATTR interruptRisingHandler() {
detachInterrupt(BUTTON_PIN);
static unsigned long lastInterruptTime = 0;
pressDuration = millis() - pressedTime;
// If interrupts come faster than 200ms, assume it's a bounce and ignore
if ((millis() - lastInterruptTime) > 500 && pressDuration > 2) {
if (pressDuration > longPressTime) {
isLongDetected = true;
pressedTime = millis();
}
if (isPressed == true) {
isPressed = false;
lastInterruptTime = lastReleasedTime = millis();
++releaseCount;
if (isLongDetected) {
relayState = !relayState;
digitalWrite(RELAY_PIN, relayState);
}
else {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}
}
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), interruptFallingHandler, FALLING);
}
void setup() {
Serial.begin(9600);
delay(100);
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // 设置物理按键引脚
digitalWrite(LED_PIN, ledState? HIGH : LOW);
digitalWrite(RELAY_PIN, relayState? HIGH : LOW);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), interruptFallingHandler, FALLING);
Serial.println("Beginning...");
}
void loop() {
//Serial.println(isPressed);
//Serial.printf("[DEBUG] pressedTime: %lu, lastReleasedTime: %lu, pressDuration: %lu, pressCount: %lu, releaseCount: %lu\n", pressedTime, lastReleasedTime, pressDuration, pressCount, releaseCount);
//delay(200);
//checkButton();
}