const int ledPin = 3; // LED引脚
const int buttonPin = 2; // 按键引脚
int buttonState = 0; // 当前按键状态
int lastButtonState = 0; // 上一次按键状态
unsigned long pressStartTime = 0; // 按键按下开始时间
unsigned long lastDebounceTime = 0; // 上次按键状态变化时间
unsigned long debounceDelay = 50; // 防抖延时(毫秒)
bool isButtonPressed = false; // 按键是否按下
bool ledOn = false; // LED开关状态
int brightness = 255; // LED亮度(初始为255)
bool increasingBrightness = false; // 是否增大亮度
bool inBrightnessAdjustment = false; // 当前是否在亮度调节模式
void setup() {
pinMode(ledPin, OUTPUT); // 设置LED引脚为输出
pinMode(buttonPin, INPUT_PULLUP); // 设置按键引脚为输入模式,并启用上拉电阻
Serial.begin(9600); // 初始化串口调试
}
void loop() {
int reading = digitalRead(buttonPin); // 读取当前按键状态
// 检测按键状态是否发生变化
if (reading != lastButtonState) {
lastDebounceTime = millis(); // 记录按键状态变化的时间
}
// 如果状态变化的时间超过防抖延时,则确认状态
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading; // 更新按键状态
if (buttonState == LOW) { // 按键按下
pressStartTime = millis(); // 记录按下时间
isButtonPressed = true;
}
}
}
// 检测按键是否松开
if (buttonState == HIGH && lastButtonState == LOW) {
if (isButtonPressed) {
unsigned long pressDuration = millis() - pressStartTime;
if (pressDuration < 1000) {
// 短按,切换LED开关状态(亮灭)
toggleLED();
} else {
// 长按,调节LED亮度
adjustBrightness();
}
}
isButtonPressed = false;
}
// 持续调节亮度(长按时)
if (buttonState == LOW && millis() - pressStartTime >= 1000) {
inBrightnessAdjustment = true; // 进入亮度调节模式
adjustBrightness();
}
lastButtonState = reading; // 更新上次按键状态
}
void toggleLED() {
// 切换LED亮灭状态
if (ledOn) {
analogWrite(ledPin, 0); // LED熄灭
} else {
analogWrite(ledPin, 255); // LED全亮
}
ledOn = !ledOn; // 更新LED开关状态
// 每次短按时直接强制设置亮度为最亮或最暗
if (ledOn) {
analogWrite(ledPin, 255); // 短按时确保LED最亮
} else {
analogWrite(ledPin, 0); // 短按时确保LED熄灭
}
// 如果在亮度调节模式中,短按时清除亮度调节状态
if (inBrightnessAdjustment) {
inBrightnessAdjustment = false; // 退出亮度调节模式
}
}
void adjustBrightness() {
// 长按时立即开始调节亮度
if (brightness == 255) {
// 达到最大亮度时,开始减小亮度
increasingBrightness = false;
} else if (brightness == 0) {
// 达到最小亮度时,开始增大亮度
increasingBrightness = true;
}
// 立即开始调节亮度
if (increasingBrightness) {
brightness += 5; // 增加亮度
if (brightness > 255) brightness = 255; // 避免超过最大亮度
} else {
brightness -= 5; // 降低亮度
if (brightness < 0) brightness = 0; // 避免低于最小亮度
}
analogWrite(ledPin, brightness); // 设置LED亮度
delay(50); // 延时,避免亮度变化过快
}