// 定义引脚
const int ledPin = 3; // 假设LED连接在数字引脚9上
const int buttonPin = 2; // 假设按钮连接在数字引脚2上,内部上拉
// 状态变量
bool ledState = LOW; // LED初始状态
bool lastButtonState = HIGH; // 上一次的按钮状态
unsigned long lastDebounceTime = 0; // 上次去抖动的时间
unsigned long debounceDelay = 50; // 去抖动延迟(毫秒)
unsigned long longPressTime = 1000; // 长按时间阈值(毫秒)
unsigned long pressStartTime = 0; // 按下按钮的开始时间
int brightness = 0; // LED亮度(0-255)
bool brightnessUp = true; // 亮度是否正在增加
void setup() {
pinMode(ledPin, OUTPUT); // 设置LED引脚为输出
pinMode(buttonPin, INPUT_PULLUP); // 设置按钮引脚为输入,并启用内部上拉电阻
//analogWriteMode(OUTPUT); // 如果ledPin支持PWM,确保设置为PWM输出模式(某些开发板可能需要)
analogWrite(ledPin, brightness); // 初始化LED亮度
}
void loop() {
// 读取按钮状态
int reading = digitalRead(buttonPin);
// 去抖动
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// 如果按钮状态稳定
if (reading == LOW) {
// 按钮被按下
pressStartTime = millis();
} else {
// 按钮被释放
unsigned long pressDuration = millis() - pressStartTime;
// 判断是短按还是长按
if (pressDuration < longPressTime) {
// 短按:切换LED状态
ledState = !ledState;
digitalWrite(ledPin, ledState ? HIGH : LOW); // 直接控制LED开关,不使用PWM
} else {
// 长按:交替提高和降低LED亮度
brightness = (brightnessUp) ? min(brightness + 1, 255) : max(brightness - 1, 0);
analogWrite(ledPin, brightness); // 使用PWM设置LED亮度
brightnessUp = !brightnessUp; // 切换亮度增减方向
}
// 重置按钮状态
lastButtonState = reading;
}
}
}