const int ledControlPin = 9; // LED控制引脚
const int buttonPin = 2; // 按钮输入引脚
const int debounceTime = 5; // 消抖时间
const int longPressThreshold = 500; // 长按阈值
float ledIntensity = 0; // LED亮度
bool buttonStatus = HIGH; // 按钮状态
int pressDuration = 0; // 按钮被按下的持续时间
int dimDirection = 1; // 调光方向, 1为增加亮度, -1为减少亮度
bool isLongPressed = false;
void setup() {
pinMode(ledControlPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
readButtonState(); // 读取按钮状态
if (buttonStatus == LOW) { // 如果按钮被按下
handleButtonPress();
} else {
resetStates(); // 当按钮释放时重置状态
}
}
void readButtonState() {
buttonStatus = digitalRead(buttonPin);
}
void handleButtonPress() {
while (buttonStatus == LOW) {
pressDuration += debounceTime;
delay(debounceTime);
checkForLongPress();
adjustBrightness();
buttonStatus = digitalRead(buttonPin);
}
if (pressDuration > debounceTime && pressDuration < longPressThreshold) {
toggleLED();
}
}
void checkForLongPress() {
if (pressDuration >= longPressThreshold && !isLongPressed) {
determineDimDirection();
isLongPressed = true;
}
}
void determineDimDirection() {
if (ledIntensity <= 0) {
dimDirection = 1;
} else if (ledIntensity >= 255) {
dimDirection = -1;
} else {
dimDirection *= -1;
}
}
void adjustBrightness() {
if (isLongPressed) {
ledIntensity += 0.5 * dimDirection;
constrainBrightness();
analogWrite(ledControlPin, ledIntensity);
Serial.println(ledIntensity);
}
}
void toggleLED() {
ledIntensity = ledIntensity > 0 ? 0 : 255;
analogWrite(ledControlPin, ledIntensity);
Serial.println(ledIntensity);
}
void resetStates() {
pressDuration = 0;
isLongPressed = false;
}
void constrainBrightness() {
ledIntensity = max(0, min(ledIntensity, 255));
}