LED PWM 带轻触开关

问题描述 投票:0回答:1

按下按钮时,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 应该会继续以全亮度点亮。不过,好像轻触开关按下时的循环执行了一次,导致出现单次闪烁。

arduino arduino-ide arduino-c++ pwm
1个回答
0
投票

我认为您遇到的问题是因为 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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.