按下按钮时,LED 逐渐变暗。 AnalogWrite() 函数使用脉冲宽度调制 (PWM) 如果亮度值(PWM)大于255,则一旦增益完成该周期,该值就会回到0。 (脉宽调制:0~255) 如果按钮打开,亮度保持相同的值。
这是我的任务。
所以我这样写代码
#define buttonPin 2
#define ledPin 6
int buttonState = 0;
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
brightness = 255;
analogWrite(ledPin, brightness);
if (buttonState == 1) {
fadeAmount = 5;
brightness = 0;
while(brightness <= 255){
brightness = brightness + fadeAmount;
analogWrite(ledPin, brightness);
delay(80);
if(buttonState == 0){
fadeAmount = 0;
brightness = 255;
break;
}
}
}
}
但是这段代码有一个错误。 当我将手从轻触开关上松开时,LED 应该会继续以全亮度点亮。不过,好像轻触开关按下时的循环执行了一次,导致出现单次闪烁。
我认为您遇到的问题是因为 ButtonState 变量仅在每次循环迭代开始时检查一次。一旦释放按钮,它就会保持“按下”状态,因为该值不会在循环内更新。要解决此问题,您应该不断检查循环内的按钮状态。
#define buttonPin 2
#define ledPin 6
int buttonState = 0;
int lastButtonState = 0; // Keep track of the previous button state
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
// Check if the button state has changed
if (buttonState != lastButtonState) {
if (buttonState == HIGH) { // Button pressed
fadeAmount = 5;
brightness = 0;
} else { // Button released
fadeAmount = 0;
brightness = 255;
}
lastButtonState = buttonState;
}
analogWrite(ledPin, brightness);
// Fade the LED when the button is pressed
if (buttonState == HIGH) {
if (brightness <= 255) {
brightness = brightness + fadeAmount;
}
if (brightness > 255) {
brightness = 0; // Reset brightness when it reaches 255
}
delay(80);
}
}